X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4286a5b59579f09c014fd81683732cd8609cfe9f..449d48f9e15e1430805aed3b33e55000754ad926:/src/msw/fontdlg.cpp diff --git a/src/msw/fontdlg.cpp b/src/msw/fontdlg.cpp index 90886ed197..b15e0adcbd 100644 --- a/src/msw/fontdlg.cpp +++ b/src/msw/fontdlg.cpp @@ -1,281 +1,168 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: fontdlg.cpp +// Name: src/msw/fontdlg.cpp // Purpose: wxFontDialog class // Author: Julian Smart // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ -#pragma implementation "fontdlg.h" + #pragma implementation "fontdlg.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_FONTDLG + #ifndef WX_PRECOMP -#include -#include "wx/defs.h" -#include "wx/utils.h" -#include "wx/dialog.h" + #include "wx/defs.h" + #include "wx/utils.h" + #include "wx/dialog.h" #endif #include "wx/fontdlg.h" -#include - #if !defined(__WIN32__) || defined(__SALFORDC__) || defined(__WXWINE__) -#include + #include #endif #include "wx/msw/private.h" #include "wx/cmndata.h" +#include "wx/log.h" #include #include #include -#define wxDIALOG_DEFAULT_X 300 -#define wxDIALOG_DEFAULT_Y 300 +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog) -#endif -/* - * wxFontDialog - */ +// ============================================================================ +// implementation +// ============================================================================ +// ---------------------------------------------------------------------------- +// wxFontDialog +// ---------------------------------------------------------------------------- -wxFontDialog::wxFontDialog(void) +wxFontDialog::wxFontDialog() { - m_dialogParent = NULL; + m_parent = NULL; } wxFontDialog::wxFontDialog(wxWindow *parent, wxFontData *data) { - Create(parent, data); + Create(parent, data); } bool wxFontDialog::Create(wxWindow *parent, wxFontData *data) { - m_dialogParent = parent; + m_parent = parent; + + wxCHECK_MSG( data, FALSE, _T("no font data in wxFontDialog") ); - if (data) m_fontData = *data; - return TRUE; + + return TRUE; } -int wxFontDialog::ShowModal(void) +int wxFontDialog::ShowModal() { - CHOOSEFONT chooseFontStruct; - LOGFONT logFont; + DWORD flags = CF_SCREENFONTS | CF_NOSIMULATIONS; - DWORD flags = CF_TTONLY | CF_SCREENFONTS | CF_NOSIMULATIONS; + LOGFONT logFont; - memset(&chooseFontStruct, 0, sizeof(CHOOSEFONT)); + CHOOSEFONT chooseFontStruct; + wxZeroMemory(chooseFontStruct); chooseFontStruct.lStructSize = sizeof(CHOOSEFONT); - chooseFontStruct.hwndOwner = (HWND) (m_dialogParent ? (HWND) m_dialogParent->GetHWND() : NULL); + if ( m_parent ) + chooseFontStruct.hwndOwner = GetHwndOf(m_parent); chooseFontStruct.lpLogFont = &logFont; - if (m_fontData.initialFont.Ok()) + if ( m_fontData.initialFont.Ok() ) { - flags |= CF_INITTOLOGFONTSTRUCT; - wxFillLogFont(&logFont, & m_fontData.initialFont); + flags |= CF_INITTOLOGFONTSTRUCT; + wxFillLogFont(&logFont, &m_fontData.initialFont); } - chooseFontStruct.iPointSize = 0; - chooseFontStruct.rgbColors = RGB((BYTE)m_fontData.fontColour.Red(), (BYTE)m_fontData.fontColour.Green(), (BYTE)m_fontData.fontColour.Blue()); + if ( m_fontData.fontColour.Ok() ) + { + chooseFontStruct.rgbColors = wxColourToRGB(m_fontData.fontColour); + + // need this for the colour to be taken into account + flags |= CF_EFFECTS; + } - if (!m_fontData.GetAllowSymbols()) + // CF_ANSIONLY flag is obsolete for Win32 + if ( !m_fontData.GetAllowSymbols() ) + { +#ifdef __WIN16__ flags |= CF_ANSIONLY; - if (m_fontData.GetEnableEffects()) +#else // Win32 + flags |= CF_SELECTSCRIPT; + logFont.lfCharSet = ANSI_CHARSET; +#endif // Win16/32 + } + + if ( m_fontData.GetEnableEffects() ) flags |= CF_EFFECTS; - if (m_fontData.GetShowHelp()) + if ( m_fontData.GetShowHelp() ) flags |= CF_SHOWHELP; - if (!(m_fontData.minSize == 0 && m_fontData.maxSize == 0)) + + if ( m_fontData.minSize != 0 || m_fontData.maxSize != 0 ) { - chooseFontStruct.nSizeMin = m_fontData.minSize; - chooseFontStruct.nSizeMax = m_fontData.maxSize; - flags |= CF_LIMITSIZE; + chooseFontStruct.nSizeMin = m_fontData.minSize; + chooseFontStruct.nSizeMax = m_fontData.maxSize; + flags |= CF_LIMITSIZE; } chooseFontStruct.Flags = flags; - chooseFontStruct.nFontType = SCREEN_FONTTYPE; - bool success = (ChooseFont(&(chooseFontStruct)) != 0); - // Restore values - if (success) + if ( ChooseFont(&chooseFontStruct) != 0 ) { - m_fontData.fontColour.Set(GetRValue(chooseFontStruct.rgbColors), GetGValue(chooseFontStruct.rgbColors), - GetBValue(chooseFontStruct.rgbColors)); - m_fontData.chosenFont = wxCreateFontFromLogFont(&logFont); - } - - return success ? wxID_OK : wxID_CANCEL; -} - -void wxFillLogFont(LOGFONT *logFont, wxFont *font) -{ - BYTE ff_italic; - int ff_weight = 0; - int ff_family = 0; - wxString ff_face(""); + wxRGBToColour(m_fontData.fontColour, chooseFontStruct.rgbColors); + m_fontData.chosenFont = wxCreateFontFromLogFont(&logFont); + m_fontData.EncodingInfo().facename = logFont.lfFaceName; + m_fontData.EncodingInfo().charset = logFont.lfCharSet; - switch (font->GetFamily()) - { - case wxSCRIPT: ff_family = FF_SCRIPT ; - ff_face = "Script" ; - break ; - case wxDECORATIVE: ff_family = FF_DECORATIVE; - break; - case wxROMAN: ff_family = FF_ROMAN; - ff_face = "Times New Roman" ; - break; - case wxTELETYPE: - case wxMODERN: ff_family = FF_MODERN; - ff_face = "Courier New" ; - break; - case wxSWISS: ff_family = FF_SWISS; - ff_face = "Arial"; - break; - case wxDEFAULT: - default: ff_family = FF_SWISS; - ff_face = "MS Sans Serif" ; + return wxID_OK; } - - if (font->GetStyle() == wxITALIC || font->GetStyle() == wxSLANT) - ff_italic = 1; else - ff_italic = 0; - - if (font->GetWeight() == wxNORMAL) - ff_weight = FW_NORMAL; - else if (font->GetWeight() == wxLIGHT) - ff_weight = FW_LIGHT; - else if (font->GetWeight() == wxBOLD) - ff_weight = FW_BOLD; - - // Have to get screen DC Caps, because a metafile will return 0. - HDC dc2 = ::GetDC(NULL); - int ppInch = ::GetDeviceCaps(dc2, LOGPIXELSY); - ::ReleaseDC(NULL, dc2); - - // New behaviour: apparently ppInch varies according to - // Large/Small Fonts setting in Windows. This messes - // up fonts. So, set ppInch to a constant 96 dpi. - ppInch = 96; - -#if wxFONT_SIZE_COMPATIBILITY - // Incorrect, but compatible with old wxWindows behaviour - int nHeight = (font->GetPointSize()*ppInch/72); -#else - // Correct for Windows compatibility - int nHeight = - (font->GetPointSize()*ppInch/72); + { + // common dialog failed - why? +#ifdef __WXDEBUG__ + DWORD dwErr = CommDlgExtendedError(); + if ( dwErr != 0 ) + { + // this msg is only for developers + wxLogError(wxT("Common dialog failed with error code %0lx."), + dwErr); + } + //else: it was just cancelled #endif - bool ff_underline = font->GetUnderlined(); - - ff_face = font->GetFaceName(); - - logFont->lfHeight = nHeight; - logFont->lfWidth = 0; - logFont->lfEscapement = 0; - logFont->lfOrientation = 0; - logFont->lfWeight = ff_weight; - logFont->lfItalic = ff_italic; - logFont->lfUnderline = (BYTE)ff_underline; - logFont->lfStrikeOut = 0; - logFont->lfCharSet = ANSI_CHARSET; - logFont->lfOutPrecision = OUT_DEFAULT_PRECIS; - logFont->lfClipPrecision = CLIP_DEFAULT_PRECIS; - logFont->lfQuality = PROOF_QUALITY; - logFont->lfPitchAndFamily = DEFAULT_PITCH | ff_family; - strcpy(logFont->lfFaceName, ff_face); -} - -wxFont wxCreateFontFromLogFont(LOGFONT *logFont) // , bool createNew) -{ - int fontFamily = wxSWISS; - int fontStyle = wxNORMAL; - int fontWeight = wxNORMAL; - int fontPoints = 10; - bool fontUnderline = FALSE; - char *fontFace = NULL; - -// int lfFamily = logFont->lfPitchAndFamily & 0xF0; - int lfFamily = logFont->lfPitchAndFamily; - if (lfFamily & FIXED_PITCH) - lfFamily -= FIXED_PITCH; - if (lfFamily & VARIABLE_PITCH) - lfFamily -= VARIABLE_PITCH; - - switch (lfFamily) - { - case FF_ROMAN: - fontFamily = wxROMAN; - break; - case FF_SWISS: - fontFamily = wxSWISS; - break; - case FF_SCRIPT: - fontFamily = wxSCRIPT; - break; - case FF_MODERN: - fontFamily = wxMODERN; - break; - case FF_DECORATIVE: - fontFamily = wxDECORATIVE; - break; - default: - fontFamily = wxSWISS; - break; - } - switch (logFont->lfWeight) - { - case FW_LIGHT: - fontWeight = wxLIGHT; - break; - case FW_NORMAL: - fontWeight = wxNORMAL; - break; - case FW_BOLD: - fontWeight = wxBOLD; - break; - default: - fontWeight = wxNORMAL; - break; - } - if (logFont->lfItalic) - fontStyle = wxITALIC; - else - fontStyle = wxNORMAL; - - if (logFont->lfUnderline) - fontUnderline = TRUE; - - if (logFont->lfFaceName) - fontFace = logFont->lfFaceName; - - HDC dc2 = ::GetDC(NULL); - - if ( logFont->lfHeight < 0 ) - logFont->lfHeight = - logFont->lfHeight; - fontPoints = abs(72*logFont->lfHeight/GetDeviceCaps(dc2, LOGPIXELSY)); - ::ReleaseDC(NULL, dc2); - -// if ( createNew ) - return wxFont(fontPoints, fontFamily, fontStyle, fontWeight, fontUnderline, fontFace); -// else -// return wxTheFontList->FindOrCreateFont(fontPoints, fontFamily, fontStyle, fontWeight, fontUnderline, fontFace); + return wxID_CANCEL; + } } - +#endif // wxUSE_FONTDLG