2005-07-31 12:11:56 +00:00
|
|
|
/*
|
|
|
|
* COMMDLG - Font Dialog
|
|
|
|
*
|
|
|
|
* Copyright 1994 Martin Ayotte
|
|
|
|
* Copyright 1996 Albrecht Kleine
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
2006-07-05 22:48:31 +00:00
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
2005-07-31 12:11:56 +00:00
|
|
|
*/
|
|
|
|
|
2010-03-11 17:37:30 +00:00
|
|
|
#include "cdlg.h"
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2010-03-11 17:37:30 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
HWND hWnd1;
|
|
|
|
HWND hWnd2;
|
|
|
|
LPCHOOSEFONTW lpcf32w;
|
|
|
|
int added;
|
|
|
|
} CFn_ENUMSTRUCT, *LPCFn_ENUMSTRUCT;
|
|
|
|
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
static const WCHAR strWineFontData[] = {'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A',0};
|
|
|
|
static const WCHAR strWineFontData_a[] =
|
|
|
|
{'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A','_','A',0};
|
|
|
|
static const WCHAR chooseFontW[] = {'C','H','O','O','S','E','_','F','O','N','T',0};
|
2016-03-01 19:11:55 +00:00
|
|
|
static const WCHAR fontsizefmtW[] = {'%','d',0};
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
/* image list with TrueType bitmaps and more */
|
|
|
|
static HIMAGELIST himlTT = 0;
|
|
|
|
#define TTBITMAP_XSIZE 20 /* x-size of the bitmaps */
|
|
|
|
|
2007-07-27 09:28:40 +00:00
|
|
|
static INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
static INT_PTR CALLBACK FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
/* There is a table here of all charsets, and the sample text for each.
|
|
|
|
* There is a second table that translates a charset into an index into
|
|
|
|
* the first table.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define CI(cs) ((IDS_CHARSET_##cs)-IDS_CHARSET_ANSI)
|
|
|
|
|
|
|
|
|
|
|
|
static const WCHAR stWestern[]={'A','a','B','b','Y','y','Z','z',0}; /* Western and default */
|
|
|
|
static const WCHAR stSymbol[]={'S','y','m','b','o','l',0}; /* Symbol */
|
|
|
|
static const WCHAR stShiftJis[]={'A','a',0x3042,0x3041,0x30a2,0x30a1,0x4e9c,0x5b87,0}; /* Shift JIS */
|
|
|
|
static const WCHAR stHangul[]={0xac00,0xb098,0xb2e4,'A','a','B','Y','y','Z','z',0}; /* Hangul */
|
|
|
|
static const WCHAR stGB2312[]={0x5fae,0x8f6f,0x4e2d,0x6587,0x8f6f,0x4ef6,0}; /* GB2312 */
|
|
|
|
static const WCHAR stBIG5[]={0x4e2d,0x6587,0x5b57,0x578b,0x7bc4,0x4f8b,0}; /* BIG5 */
|
|
|
|
static const WCHAR stGreek[]={'A','a','B','b',0x0391,0x03b1,0x0392,0x03b2,0}; /* Greek */
|
|
|
|
static const WCHAR stTurkish[]={'A','a','B','b',0x011e,0x011f,0x015e,0x015f,0}; /* Turkish */
|
|
|
|
static const WCHAR stHebrew[]={'A','a','B','b',0x05e0,0x05e1,0x05e9,0x05ea,0}; /* Hebrew */
|
|
|
|
static const WCHAR stArabic[]={'A','a','B','b',0x0627,0x0628,0x062c,0x062f,0x0647,0x0648,0x0632,0};/* Arabic */
|
|
|
|
static const WCHAR stBaltic[]={'A','a','B','b','Y','y','Z','z',0}; /* Baltic */
|
|
|
|
static const WCHAR stVietname[]={'A','a','B','b',0x01a0,0x01a1,0x01af,0x01b0,0}; /* Vietnamese */
|
|
|
|
static const WCHAR stCyrillic[]={'A','a','B','b',0x0411,0x0431,0x0424,0x0444,0}; /* Cyrillic */
|
|
|
|
static const WCHAR stEastEur[]={'A','a','B','b',0xc1,0xe1,0xd4,0xf4,0}; /* East European */
|
|
|
|
static const WCHAR stThai[]={'A','a','B','b',0x0e2d,0x0e31,0x0e01,0x0e29,0x0e23,0x0e44,0x0e17,0x0e22,0}; /* Thai */
|
|
|
|
static const WCHAR stJohab[]={0xac00,0xb098,0xb2e4,'A','a','B','Y','y','Z','z',0}; /* Johab */
|
|
|
|
static const WCHAR stMac[]={'A','a','B','b','Y','y','Z','z',0}; /* Mac */
|
|
|
|
static const WCHAR stOEM[]={'A','a','B','b',0xf8,0xf1,0xfd,0}; /* OEM */
|
|
|
|
/* the following character sets actually behave different (Win2K observation):
|
|
|
|
* the sample string is 'sticky': it uses the sample string of the previous
|
|
|
|
* selected character set. That behaviour looks like some default, which is
|
|
|
|
* not (yet) implemented. */
|
|
|
|
static const WCHAR stVISCII[]={'A','a','B','b',0}; /* VISCII */
|
|
|
|
static const WCHAR stTCVN[]={'A','a','B','b',0}; /* TCVN */
|
|
|
|
static const WCHAR stKOI8[]={'A','a','B','b',0}; /* KOI-8 */
|
|
|
|
static const WCHAR stIso88593[]={'A','a','B','b',0}; /* ISO-8859-3 */
|
|
|
|
static const WCHAR stIso88594[]={'A','a','B','b',0}; /* ISO-8859-4 */
|
|
|
|
static const WCHAR stIso885910[]={'A','a','B','b',0}; /* ISO-8859-10 */
|
|
|
|
static const WCHAR stCeltic[]={'A','a','B','b',0};/* Celtic */
|
|
|
|
|
2007-07-27 09:28:40 +00:00
|
|
|
static const WCHAR * const sample_lang_text[]={
|
2005-07-31 12:11:56 +00:00
|
|
|
stWestern,stSymbol,stShiftJis,stHangul,stGB2312,
|
|
|
|
stBIG5,stGreek,stTurkish,stHebrew,stArabic,
|
|
|
|
stBaltic,stVietname,stCyrillic,stEastEur,stThai,
|
|
|
|
stJohab,stMac,stOEM,stVISCII,stTCVN,
|
|
|
|
stKOI8,stIso88593,stIso88594,stIso885910,stCeltic};
|
|
|
|
|
|
|
|
|
|
|
|
static const BYTE CHARSET_ORDER[256]={
|
|
|
|
CI(ANSI), 0, CI(SYMBOL), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(MAC), 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
CI(JIS), CI(HANGUL), CI(JOHAB), 0, 0, 0, CI(GB2312), 0, CI(BIG5), 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, CI(GREEK), CI(TURKISH), CI(VIETNAMESE), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
|
0, CI(HEBREW), CI(ARABIC), 0, 0, 0, 0, 0, 0, 0, CI(BALTIC), 0, 0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(RUSSIAN), 0, 0, 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(THAI), 0,
|
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(EE), 0,
|
|
|
|
CI(VISCII), CI(TCVN), CI(KOI8), CI(ISO3), CI(ISO4), CI(ISO10), CI(CELTIC), 0, 0, 0, 0, 0, 0, 0, 0, CI(OEM),
|
|
|
|
};
|
|
|
|
|
|
|
|
static const struct {
|
|
|
|
DWORD mask;
|
|
|
|
const char *name;
|
|
|
|
} cfflags[] = {
|
|
|
|
#define XX(x) { x, #x },
|
|
|
|
XX(CF_SCREENFONTS)
|
|
|
|
XX(CF_PRINTERFONTS)
|
|
|
|
XX(CF_SHOWHELP)
|
|
|
|
XX(CF_ENABLEHOOK)
|
|
|
|
XX(CF_ENABLETEMPLATE)
|
|
|
|
XX(CF_ENABLETEMPLATEHANDLE)
|
|
|
|
XX(CF_INITTOLOGFONTSTRUCT)
|
|
|
|
XX(CF_USESTYLE)
|
|
|
|
XX(CF_EFFECTS)
|
|
|
|
XX(CF_APPLY)
|
|
|
|
XX(CF_ANSIONLY)
|
|
|
|
XX(CF_NOVECTORFONTS)
|
|
|
|
XX(CF_NOSIMULATIONS)
|
|
|
|
XX(CF_LIMITSIZE)
|
|
|
|
XX(CF_FIXEDPITCHONLY)
|
|
|
|
XX(CF_WYSIWYG)
|
|
|
|
XX(CF_FORCEFONTEXIST)
|
|
|
|
XX(CF_SCALABLEONLY)
|
|
|
|
XX(CF_TTONLY)
|
|
|
|
XX(CF_NOFACESEL)
|
|
|
|
XX(CF_NOSTYLESEL)
|
|
|
|
XX(CF_NOSIZESEL)
|
|
|
|
XX(CF_SELECTSCRIPT)
|
|
|
|
XX(CF_NOSCRIPTSEL)
|
|
|
|
XX(CF_NOVERTFONTS)
|
|
|
|
#undef XX
|
|
|
|
};
|
|
|
|
|
2010-03-11 17:37:30 +00:00
|
|
|
static void _dump_cf_flags(DWORD cflags)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2008-12-27 12:31:20 +00:00
|
|
|
unsigned int i;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
for (i = 0; i < sizeof(cfflags)/sizeof(cfflags[0]); i++)
|
|
|
|
if (cfflags[i].mask & cflags)
|
|
|
|
TRACE("%s|",cfflags[i].name);
|
|
|
|
TRACE("\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* ChooseFontW (COMDLG32.@)
|
2005-11-17 19:44:07 +00:00
|
|
|
*
|
|
|
|
* Create a font dialog box.
|
|
|
|
*
|
|
|
|
* PARAMS
|
|
|
|
* lpChFont [I/O] in: information to initialize the dialog box.
|
|
|
|
* out: User's color selection
|
|
|
|
*
|
|
|
|
* RETURNS
|
|
|
|
* TRUE: Ok button clicked.
|
|
|
|
* FALSE: Cancel button clicked, or error.
|
2005-07-31 12:11:56 +00:00
|
|
|
*/
|
|
|
|
BOOL WINAPI ChooseFontW(LPCHOOSEFONTW lpChFont)
|
|
|
|
{
|
|
|
|
LPCVOID template;
|
|
|
|
HRSRC hResInfo;
|
|
|
|
HINSTANCE hDlginst;
|
|
|
|
HGLOBAL hDlgTmpl;
|
|
|
|
|
|
|
|
TRACE("(%p)\n", lpChFont);
|
|
|
|
|
|
|
|
if ( (lpChFont->Flags&CF_ENABLETEMPLATEHANDLE)!=0 )
|
|
|
|
{
|
2009-03-03 09:10:25 +00:00
|
|
|
template=lpChFont->hInstance;
|
2005-07-31 12:11:56 +00:00
|
|
|
} else
|
|
|
|
{
|
|
|
|
if ( (lpChFont->Flags&CF_ENABLETEMPLATE)!=0 )
|
|
|
|
{
|
|
|
|
hDlginst=lpChFont->hInstance;
|
|
|
|
if( !(hResInfo = FindResourceW(hDlginst, lpChFont->lpTemplateName,
|
|
|
|
(LPWSTR)RT_DIALOG)))
|
|
|
|
{
|
|
|
|
COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
hDlginst=COMDLG32_hInstance;
|
|
|
|
if (!(hResInfo = FindResourceW(hDlginst, chooseFontW, (LPWSTR)RT_DIALOG)))
|
|
|
|
{
|
|
|
|
COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!(hDlgTmpl = LoadResource(hDlginst, hResInfo )) ||
|
|
|
|
!(template = LockResource( hDlgTmpl )))
|
|
|
|
{
|
|
|
|
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (TRACE_ON(commdlg))
|
|
|
|
_dump_cf_flags(lpChFont->Flags);
|
|
|
|
|
2013-10-05 20:43:34 +00:00
|
|
|
if (lpChFont->Flags & CF_SELECTSCRIPT)
|
2005-07-31 12:11:56 +00:00
|
|
|
FIXME(": unimplemented flag (ignored)\n");
|
|
|
|
|
|
|
|
return DialogBoxIndirectParamW(COMDLG32_hInstance, template,
|
|
|
|
lpChFont->hwndOwner, FormatCharDlgProcW, (LPARAM)lpChFont );
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* ChooseFontA (COMDLG32.@)
|
2005-11-17 19:44:07 +00:00
|
|
|
*
|
2008-01-14 12:43:19 +00:00
|
|
|
* See ChooseFontW.
|
2005-07-31 12:11:56 +00:00
|
|
|
*/
|
|
|
|
BOOL WINAPI ChooseFontA(LPCHOOSEFONTA lpChFont)
|
|
|
|
{
|
|
|
|
LPCVOID template;
|
|
|
|
HRSRC hResInfo;
|
|
|
|
HINSTANCE hDlginst;
|
|
|
|
HGLOBAL hDlgTmpl;
|
|
|
|
|
|
|
|
TRACE("(%p)\n", lpChFont);
|
|
|
|
|
|
|
|
if ( (lpChFont->Flags&CF_ENABLETEMPLATEHANDLE)!=0 )
|
|
|
|
{
|
2009-03-03 09:10:25 +00:00
|
|
|
template=lpChFont->hInstance;
|
2005-07-31 12:11:56 +00:00
|
|
|
} else
|
|
|
|
{
|
|
|
|
if ( (lpChFont->Flags&CF_ENABLETEMPLATE)!=0 )
|
|
|
|
{
|
|
|
|
hDlginst=lpChFont->hInstance;
|
|
|
|
if( !(hResInfo = FindResourceA(hDlginst, lpChFont->lpTemplateName,
|
|
|
|
(LPSTR)RT_DIALOG)))
|
|
|
|
{
|
|
|
|
COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
hDlginst=COMDLG32_hInstance;
|
|
|
|
if (!(hResInfo = FindResourceW(hDlginst, chooseFontW, (LPWSTR)RT_DIALOG)))
|
|
|
|
{
|
|
|
|
COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!(hDlgTmpl = LoadResource(hDlginst, hResInfo )) ||
|
|
|
|
!(template = LockResource( hDlgTmpl )))
|
|
|
|
{
|
|
|
|
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (TRACE_ON(commdlg))
|
|
|
|
_dump_cf_flags(lpChFont->Flags);
|
2013-10-05 20:43:34 +00:00
|
|
|
if (lpChFont->Flags & CF_SELECTSCRIPT)
|
2005-07-31 12:11:56 +00:00
|
|
|
FIXME(": unimplemented flag (ignored)\n");
|
|
|
|
|
|
|
|
return DialogBoxIndirectParamA(COMDLG32_hInstance, template,
|
|
|
|
lpChFont->hwndOwner, FormatCharDlgProcA, (LPARAM)lpChFont );
|
|
|
|
}
|
|
|
|
|
|
|
|
#define TEXT_EXTRAS 4
|
|
|
|
#define TEXT_COLORS 16
|
|
|
|
|
|
|
|
static const COLORREF textcolors[TEXT_COLORS]=
|
|
|
|
{
|
|
|
|
0x00000000L,0x00000080L,0x00008000L,0x00008080L,
|
|
|
|
0x00800000L,0x00800080L,0x00808000L,0x00808080L,
|
|
|
|
0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL,
|
|
|
|
0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL
|
|
|
|
};
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* CFn_HookCallChk32 [internal]
|
|
|
|
*/
|
2007-07-27 09:28:40 +00:00
|
|
|
static BOOL CFn_HookCallChk32(const CHOOSEFONTW *lpcf)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
if (lpcf)
|
|
|
|
if(lpcf->Flags & CF_ENABLEHOOK)
|
|
|
|
if (lpcf->lpfnHook)
|
|
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* AddFontFamily [internal]
|
|
|
|
*/
|
2010-03-11 17:37:30 +00:00
|
|
|
static INT AddFontFamily(const ENUMLOGFONTEXW *lpElfex, const NEWTEXTMETRICEXW *lpNTM,
|
|
|
|
UINT nFontType, const CHOOSEFONTW *lpcf, HWND hwnd, LPCFn_ENUMSTRUCT e)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
WORD w;
|
|
|
|
const LOGFONTW *lplf = &(lpElfex->elfLogFont);
|
|
|
|
|
|
|
|
TRACE("font=%s (nFontType=%d)\n", debugstr_w(lplf->lfFaceName), nFontType);
|
|
|
|
|
|
|
|
if (lpcf->Flags & CF_FIXEDPITCHONLY)
|
|
|
|
if (!(lplf->lfPitchAndFamily & FIXED_PITCH))
|
|
|
|
return 1;
|
|
|
|
if (lpcf->Flags & CF_ANSIONLY)
|
|
|
|
if (lplf->lfCharSet != ANSI_CHARSET)
|
|
|
|
return 1;
|
|
|
|
if (lpcf->Flags & CF_TTONLY)
|
|
|
|
if (!(nFontType & TRUETYPE_FONTTYPE))
|
|
|
|
return 1;
|
2013-10-05 20:43:34 +00:00
|
|
|
if (lpcf->Flags & CF_NOVERTFONTS)
|
|
|
|
if (lplf->lfFaceName[0] == '@')
|
|
|
|
return 1;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
if (e) e->added++;
|
|
|
|
|
|
|
|
i=SendMessageW(hwnd, CB_FINDSTRINGEXACT, 0, (LPARAM)lplf->lfFaceName);
|
|
|
|
if (i == CB_ERR) {
|
|
|
|
i = SendMessageW(hwnd, CB_ADDSTRING, 0, (LPARAM)lplf->lfFaceName);
|
|
|
|
if( i != CB_ERR) {
|
|
|
|
/* store some important font information */
|
|
|
|
w = (lplf->lfPitchAndFamily) << 8 |
|
|
|
|
(HIWORD(lpNTM->ntmTm.ntmFlags) & 0xff);
|
|
|
|
SendMessageW(hwnd, CB_SETITEMDATA, i, MAKELONG(nFontType,w));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* FontFamilyEnumProc32 [internal]
|
|
|
|
*/
|
|
|
|
static INT WINAPI FontFamilyEnumProc(const ENUMLOGFONTEXW *lpElfex,
|
|
|
|
const TEXTMETRICW *metrics, DWORD dwFontType, LPARAM lParam)
|
|
|
|
{
|
|
|
|
LPCFn_ENUMSTRUCT e;
|
|
|
|
e=(LPCFn_ENUMSTRUCT)lParam;
|
2007-07-27 09:28:40 +00:00
|
|
|
return AddFontFamily( lpElfex, (const NEWTEXTMETRICEXW *) metrics,
|
2005-07-31 12:11:56 +00:00
|
|
|
dwFontType, e->lpcf32w, e->hWnd1, e);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* SetFontStylesToCombo2 [internal]
|
|
|
|
*
|
|
|
|
* Fill font style information into combobox (without using font.c directly)
|
|
|
|
*/
|
2014-04-22 14:40:19 +00:00
|
|
|
static BOOL SetFontStylesToCombo2(HWND hwnd, HDC hdc, const LOGFONTW *lplf)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
#define FSTYLES 4
|
|
|
|
struct FONTSTYLE
|
|
|
|
{
|
|
|
|
int italic;
|
|
|
|
int weight;
|
2008-04-04 12:16:03 +00:00
|
|
|
UINT resId;
|
2005-07-31 12:11:56 +00:00
|
|
|
};
|
|
|
|
static const struct FONTSTYLE fontstyles[FSTYLES]={
|
2008-04-04 12:16:03 +00:00
|
|
|
{ 0, FW_NORMAL, IDS_FONT_REGULAR },
|
|
|
|
{ 1, FW_NORMAL, IDS_FONT_ITALIC },
|
|
|
|
{ 0, FW_BOLD, IDS_FONT_BOLD },
|
|
|
|
{ 1, FW_BOLD, IDS_FONT_BOLD_ITALIC }
|
2005-07-31 12:11:56 +00:00
|
|
|
};
|
|
|
|
HFONT hf;
|
|
|
|
TEXTMETRICW tm;
|
|
|
|
int i,j;
|
|
|
|
LOGFONTW lf;
|
|
|
|
|
2008-04-04 12:16:03 +00:00
|
|
|
lf = *lplf;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
for (i=0;i<FSTYLES;i++)
|
|
|
|
{
|
|
|
|
lf.lfItalic=fontstyles[i].italic;
|
|
|
|
lf.lfWeight=fontstyles[i].weight;
|
|
|
|
hf=CreateFontIndirectW(&lf);
|
|
|
|
hf=SelectObject(hdc,hf);
|
|
|
|
GetTextMetricsW(hdc,&tm);
|
|
|
|
hf=SelectObject(hdc,hf);
|
|
|
|
DeleteObject(hf);
|
|
|
|
/* font successful created ? */
|
2007-07-27 09:28:40 +00:00
|
|
|
if (((fontstyles[i].weight == FW_NORMAL && tm.tmWeight <= FW_MEDIUM) ||
|
|
|
|
(fontstyles[i].weight == FW_BOLD && tm.tmWeight > FW_MEDIUM)) &&
|
2005-07-31 12:11:56 +00:00
|
|
|
((tm.tmItalic != 0)==fontstyles[i].italic))
|
|
|
|
{
|
2008-04-04 12:16:03 +00:00
|
|
|
WCHAR name[64];
|
|
|
|
LoadStringW(COMDLG32_hInstance, fontstyles[i].resId, name, 64);
|
|
|
|
j=SendMessageW(hwnd,CB_ADDSTRING,0,(LPARAM)name );
|
2014-04-22 14:40:19 +00:00
|
|
|
if (j==CB_ERR) return TRUE;
|
2005-07-31 12:11:56 +00:00
|
|
|
j=SendMessageW(hwnd, CB_SETITEMDATA, j,
|
2007-07-27 09:28:40 +00:00
|
|
|
MAKELONG(tm.tmWeight,fontstyles[i].italic));
|
2014-04-22 14:40:19 +00:00
|
|
|
if (j==CB_ERR) return TRUE;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
}
|
2014-04-22 14:40:19 +00:00
|
|
|
return FALSE;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* AddFontSizeToCombo3 [internal]
|
|
|
|
*/
|
2014-04-22 14:40:19 +00:00
|
|
|
static BOOL AddFontSizeToCombo3(HWND hwnd, UINT h, const CHOOSEFONTW *lpcf)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
int j;
|
|
|
|
WCHAR buffer[20];
|
|
|
|
|
|
|
|
if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
|
|
|
|
((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
|
|
|
|
{
|
2016-03-01 19:11:55 +00:00
|
|
|
sprintfW(buffer, fontsizefmtW, h);
|
2005-07-31 12:11:56 +00:00
|
|
|
j=SendMessageW(hwnd, CB_FINDSTRINGEXACT, -1, (LPARAM)buffer);
|
|
|
|
if (j==CB_ERR)
|
|
|
|
{
|
2016-03-01 19:11:55 +00:00
|
|
|
j=SendMessageW(hwnd, CB_INSERTSTRING, -1, (LPARAM)buffer);
|
2005-07-31 12:11:56 +00:00
|
|
|
if (j!=CB_ERR) j = SendMessageW(hwnd, CB_SETITEMDATA, j, h);
|
2014-04-22 14:40:19 +00:00
|
|
|
if (j==CB_ERR) return TRUE;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
}
|
2014-04-22 14:40:19 +00:00
|
|
|
return FALSE;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* SetFontSizesToCombo3 [internal]
|
|
|
|
*/
|
2014-04-22 14:40:19 +00:00
|
|
|
static BOOL SetFontSizesToCombo3(HWND hwnd, const CHOOSEFONTW *lpcf)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2006-07-05 22:48:31 +00:00
|
|
|
static const BYTE sizes[]={6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
|
2008-12-27 12:31:20 +00:00
|
|
|
unsigned int i;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
for (i = 0; i < sizeof(sizes)/sizeof(sizes[0]); i++)
|
2014-04-22 14:40:19 +00:00
|
|
|
if (AddFontSizeToCombo3(hwnd, sizes[i], lpcf)) return TRUE;
|
|
|
|
return FALSE;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* CFn_GetDC [internal]
|
|
|
|
*/
|
2007-07-27 09:28:40 +00:00
|
|
|
static inline HDC CFn_GetDC(const CHOOSEFONTW *lpcf)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
HDC ret = ((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC) ?
|
|
|
|
lpcf->hDC :
|
|
|
|
GetDC(0);
|
|
|
|
if(!ret) ERR("HDC failure!!!\n");
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2010-03-11 17:37:30 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* GetScreenDPI [internal]
|
|
|
|
*/
|
|
|
|
static inline int GetScreenDPI(void)
|
|
|
|
{
|
|
|
|
HDC hdc;
|
|
|
|
int result;
|
|
|
|
|
|
|
|
hdc = GetDC(0);
|
|
|
|
result = GetDeviceCaps(hdc, LOGPIXELSY);
|
|
|
|
ReleaseDC(0, hdc);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* CFn_ReleaseDC [internal]
|
|
|
|
*/
|
2007-07-27 09:28:40 +00:00
|
|
|
static inline void CFn_ReleaseDC(const CHOOSEFONTW *lpcf, HDC hdc)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
if(!((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC))
|
|
|
|
ReleaseDC(0, hdc);
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* AddFontStyle [internal]
|
|
|
|
*/
|
2010-03-11 17:37:30 +00:00
|
|
|
static INT AddFontStyle( const ENUMLOGFONTEXW *lpElfex, const NEWTEXTMETRICEXW *lpNTM,
|
|
|
|
UINT nFontType, const CHOOSEFONTW *lpcf, HWND hcmb2, HWND hcmb3, HWND hDlg)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
const LOGFONTW *lplf = &(lpElfex->elfLogFont);
|
|
|
|
HWND hcmb5;
|
|
|
|
HDC hdc;
|
|
|
|
|
|
|
|
TRACE("(nFontType=%d)\n",nFontType);
|
2007-07-27 09:28:40 +00:00
|
|
|
TRACE(" %s h=%d w=%d e=%d o=%d wg=%d i=%d u=%d s=%d"
|
2005-07-31 12:11:56 +00:00
|
|
|
" ch=%d op=%d cp=%d q=%d pf=%xh\n",
|
|
|
|
debugstr_w(lplf->lfFaceName),lplf->lfHeight,lplf->lfWidth,
|
|
|
|
lplf->lfEscapement,lplf->lfOrientation,
|
|
|
|
lplf->lfWeight,lplf->lfItalic,lplf->lfUnderline,
|
|
|
|
lplf->lfStrikeOut,lplf->lfCharSet, lplf->lfOutPrecision,
|
|
|
|
lplf->lfClipPrecision,lplf->lfQuality, lplf->lfPitchAndFamily);
|
|
|
|
if (nFontType & RASTER_FONTTYPE)
|
|
|
|
{
|
|
|
|
INT points;
|
|
|
|
points = MulDiv( lpNTM->ntmTm.tmHeight - lpNTM->ntmTm.tmInternalLeading,
|
2010-03-11 17:37:30 +00:00
|
|
|
72, GetScreenDPI());
|
2014-04-22 14:40:19 +00:00
|
|
|
if (AddFontSizeToCombo3(hcmb3, points, lpcf))
|
|
|
|
return 0;
|
2005-07-31 12:11:56 +00:00
|
|
|
} else if (SetFontSizesToCombo3(hcmb3, lpcf)) return 0;
|
|
|
|
|
|
|
|
if (!SendMessageW(hcmb2, CB_GETCOUNT, 0, 0))
|
|
|
|
{
|
2014-04-22 14:40:19 +00:00
|
|
|
BOOL res;
|
2005-07-31 12:11:56 +00:00
|
|
|
if(!(hdc = CFn_GetDC(lpcf))) return 0;
|
2014-04-22 14:40:19 +00:00
|
|
|
res = SetFontStylesToCombo2(hcmb2,hdc,lplf);
|
2005-07-31 12:11:56 +00:00
|
|
|
CFn_ReleaseDC(lpcf, hdc);
|
2014-04-22 14:40:19 +00:00
|
|
|
if (res)
|
2005-07-31 12:11:56 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2010-03-11 17:37:30 +00:00
|
|
|
if (!( hcmb5 = GetDlgItem(hDlg, cmb5))) return 1;
|
2005-07-31 12:11:56 +00:00
|
|
|
i = SendMessageW( hcmb5, CB_FINDSTRINGEXACT, 0,
|
|
|
|
(LPARAM)lpElfex->elfScript);
|
|
|
|
if( i == CB_ERR) {
|
|
|
|
i = SendMessageW( hcmb5, CB_ADDSTRING, 0,
|
|
|
|
(LPARAM)lpElfex->elfScript);
|
|
|
|
if( i != CB_ERR)
|
|
|
|
SendMessageW( hcmb5, CB_SETITEMDATA, i, lplf->lfCharSet);
|
|
|
|
}
|
|
|
|
return 1 ;
|
|
|
|
}
|
|
|
|
|
2016-03-01 19:11:55 +00:00
|
|
|
static void CFn_FitFontSize( HWND hDlg, int points)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
int i,n;
|
2016-03-01 19:11:55 +00:00
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/* look for fitting font size in combobox3 */
|
|
|
|
n=SendDlgItemMessageW(hDlg, cmb3, CB_GETCOUNT, 0, 0);
|
|
|
|
for (i=0;i<n;i++)
|
|
|
|
{
|
|
|
|
if (points == (int)SendDlgItemMessageW
|
|
|
|
(hDlg,cmb3, CB_GETITEMDATA,i,0))
|
|
|
|
{
|
|
|
|
SendDlgItemMessageW(hDlg,cmb3,CB_SETCURSEL,i,0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND,
|
|
|
|
MAKEWPARAM(cmb3, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb3));
|
2016-03-01 19:11:55 +00:00
|
|
|
return;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
}
|
2016-03-01 19:11:55 +00:00
|
|
|
|
|
|
|
/* no default matching size, set text manually */
|
2016-11-22 12:15:51 +00:00
|
|
|
SetDlgItemInt(hDlg, cmb3, points, TRUE);
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
2014-04-22 14:40:19 +00:00
|
|
|
static BOOL CFn_FitFontStyle( HWND hDlg, LONG packedstyle )
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
LONG id;
|
2014-04-22 14:40:19 +00:00
|
|
|
int i;
|
|
|
|
BOOL ret = FALSE;
|
2005-07-31 12:11:56 +00:00
|
|
|
/* look for fitting font style in combobox2 */
|
|
|
|
for (i=0;i<TEXT_EXTRAS;i++)
|
|
|
|
{
|
|
|
|
id = SendDlgItemMessageW(hDlg, cmb2, CB_GETITEMDATA, i, 0);
|
|
|
|
if (packedstyle == id)
|
|
|
|
{
|
|
|
|
SendDlgItemMessageW(hDlg, cmb2, CB_SETCURSEL, i, 0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb2, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb2));
|
2014-04-22 14:40:19 +00:00
|
|
|
ret = TRUE;
|
2005-07-31 12:11:56 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-04-22 14:40:19 +00:00
|
|
|
static BOOL CFn_FitCharSet( HWND hDlg, int charset )
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
int i,n,cs;
|
|
|
|
/* look for fitting char set in combobox5 */
|
|
|
|
n=SendDlgItemMessageW(hDlg, cmb5, CB_GETCOUNT, 0, 0);
|
|
|
|
for (i=0;i<n;i++)
|
|
|
|
{
|
|
|
|
cs =SendDlgItemMessageW(hDlg, cmb5, CB_GETITEMDATA, i, 0);
|
|
|
|
if (charset == cs)
|
|
|
|
{
|
|
|
|
SendDlgItemMessageW(hDlg, cmb5, CB_SETCURSEL, i, 0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb5, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb2));
|
2014-04-22 14:40:19 +00:00
|
|
|
return TRUE;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
/* no charset fits: select the first one in the list */
|
|
|
|
SendDlgItemMessageW(hDlg, cmb5, CB_SETCURSEL, 0, 0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb5, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb2));
|
2014-04-22 14:40:19 +00:00
|
|
|
return FALSE;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* FontStyleEnumProc32 [internal]
|
|
|
|
*/
|
|
|
|
static INT WINAPI FontStyleEnumProc( const ENUMLOGFONTEXW *lpElfex,
|
|
|
|
const TEXTMETRICW *metrics, DWORD dwFontType, LPARAM lParam )
|
|
|
|
{
|
|
|
|
LPCFn_ENUMSTRUCT s=(LPCFn_ENUMSTRUCT)lParam;
|
|
|
|
HWND hcmb2=s->hWnd1;
|
|
|
|
HWND hcmb3=s->hWnd2;
|
|
|
|
HWND hDlg=GetParent(hcmb3);
|
|
|
|
return AddFontStyle( lpElfex, (const NEWTEXTMETRICEXW *) metrics,
|
2010-03-11 17:37:30 +00:00
|
|
|
dwFontType, s->lpcf32w, hcmb2, hcmb3, hDlg);
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* CFn_WMInitDialog [internal]
|
|
|
|
*/
|
2010-03-11 17:37:30 +00:00
|
|
|
static LRESULT CFn_WMInitDialog(HWND hDlg, LPARAM lParam, LPCHOOSEFONTW lpcf)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
HDC hdc;
|
2014-04-22 14:40:19 +00:00
|
|
|
int i,j;
|
|
|
|
BOOL init = FALSE;
|
2005-07-31 12:11:56 +00:00
|
|
|
long pstyle;
|
|
|
|
CFn_ENUMSTRUCT s;
|
|
|
|
LPLOGFONTW lpxx;
|
|
|
|
HCURSOR hcursor=SetCursor(LoadCursorW(0,(LPWSTR)IDC_WAIT));
|
|
|
|
static const WCHAR strColorName[] = {'[','c','o','l','o','r',' ','n','a','m','e',']',0};
|
|
|
|
|
2009-03-03 09:10:25 +00:00
|
|
|
SetPropW(hDlg, strWineFontData, lpcf);
|
2005-07-31 12:11:56 +00:00
|
|
|
lpxx=lpcf->lpLogFont;
|
|
|
|
TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
|
|
|
|
|
|
|
|
if (lpcf->lStructSize != sizeof(CHOOSEFONTW))
|
|
|
|
{
|
2014-04-22 14:40:19 +00:00
|
|
|
ERR("structure size failure!!!\n");
|
2005-07-31 12:11:56 +00:00
|
|
|
EndDialog (hDlg, 0);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
if (!himlTT)
|
|
|
|
himlTT = ImageList_LoadImageW( COMDLG32_hInstance, MAKEINTRESOURCEW(38),
|
|
|
|
TTBITMAP_XSIZE, 0, CLR_DEFAULT, IMAGE_BITMAP, 0);
|
|
|
|
|
2007-09-15 17:06:51 +00:00
|
|
|
/* Set effect flags */
|
|
|
|
if((lpcf->Flags & CF_EFFECTS) && (lpcf->Flags & CF_INITTOLOGFONTSTRUCT))
|
|
|
|
{
|
|
|
|
if(lpxx->lfUnderline)
|
|
|
|
CheckDlgButton(hDlg, chx2, TRUE);
|
|
|
|
if(lpxx->lfStrikeOut)
|
|
|
|
CheckDlgButton(hDlg, chx1, TRUE);
|
|
|
|
}
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow(lpcf->hwndOwner))
|
|
|
|
ShowWindow(GetDlgItem(hDlg,pshHelp),SW_HIDE);
|
|
|
|
if (!(lpcf->Flags & CF_APPLY))
|
|
|
|
ShowWindow(GetDlgItem(hDlg,psh3),SW_HIDE);
|
2007-07-27 09:28:40 +00:00
|
|
|
if (lpcf->Flags & CF_NOSCRIPTSEL)
|
|
|
|
EnableWindow(GetDlgItem(hDlg,cmb5),FALSE);
|
2005-07-31 12:11:56 +00:00
|
|
|
if (lpcf->Flags & CF_EFFECTS)
|
|
|
|
{
|
|
|
|
for (i=0;i<TEXT_COLORS;i++)
|
|
|
|
{
|
|
|
|
WCHAR name[30];
|
|
|
|
|
|
|
|
if( LoadStringW(COMDLG32_hInstance, IDS_COLOR_BLACK+i, name,
|
|
|
|
sizeof(name)/sizeof(*name) )==0 )
|
|
|
|
{
|
|
|
|
memcpy(name, strColorName, sizeof(strColorName));
|
|
|
|
}
|
|
|
|
j=SendDlgItemMessageW(hDlg, cmb4, CB_ADDSTRING, 0, (LPARAM)name);
|
2006-07-05 22:48:31 +00:00
|
|
|
SendDlgItemMessageW(hDlg, cmb4, CB_SETITEMDATA, j, textcolors[i]);
|
2005-07-31 12:11:56 +00:00
|
|
|
/* look for a fitting value in color combobox */
|
2006-07-05 22:48:31 +00:00
|
|
|
if (textcolors[i]==lpcf->rgbColors)
|
2005-07-31 12:11:56 +00:00
|
|
|
SendDlgItemMessageW(hDlg,cmb4, CB_SETCURSEL,j,0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ShowWindow(GetDlgItem(hDlg,cmb4),SW_HIDE);
|
|
|
|
ShowWindow(GetDlgItem(hDlg,chx1),SW_HIDE);
|
|
|
|
ShowWindow(GetDlgItem(hDlg,chx2),SW_HIDE);
|
|
|
|
ShowWindow(GetDlgItem(hDlg,grp1),SW_HIDE);
|
|
|
|
ShowWindow(GetDlgItem(hDlg,stc4),SW_HIDE);
|
|
|
|
}
|
|
|
|
if(!(hdc = CFn_GetDC(lpcf)))
|
|
|
|
{
|
|
|
|
EndDialog (hDlg, 0);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
s.hWnd1=GetDlgItem(hDlg,cmb1);
|
|
|
|
s.lpcf32w=lpcf;
|
|
|
|
do {
|
|
|
|
LOGFONTW elf;
|
|
|
|
s.added = 0;
|
|
|
|
elf.lfCharSet = DEFAULT_CHARSET; /* enum all charsets */
|
|
|
|
elf.lfPitchAndFamily = 0;
|
|
|
|
elf.lfFaceName[0] = '\0'; /* enum all fonts */
|
|
|
|
if (!EnumFontFamiliesExW(hdc, &elf, (FONTENUMPROCW)FontFamilyEnumProc, (LPARAM)&s, 0))
|
|
|
|
{
|
|
|
|
TRACE("EnumFontFamiliesEx returns 0\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (s.added) break;
|
|
|
|
if (lpcf->Flags & CF_FIXEDPITCHONLY) {
|
|
|
|
FIXME("No font found with fixed pitch only, dropping flag.\n");
|
|
|
|
lpcf->Flags &= ~CF_FIXEDPITCHONLY;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (lpcf->Flags & CF_TTONLY) {
|
|
|
|
FIXME("No font found with truetype only, dropping flag.\n");
|
|
|
|
lpcf->Flags &= ~CF_TTONLY;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
} while (1);
|
|
|
|
|
|
|
|
|
|
|
|
if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
|
|
|
|
{
|
|
|
|
/* look for fitting font name in combobox1 */
|
Sync to Wine-20050930:
Alexandre Julliard <julliard@winehq.org>
- We are no longer generating .spec.c files.
- We are no longer generating .dbg.c files.
Milko Krachounov <milko@3mhz.net>
- Bulgarian resources for mpr, msi, user, commdlg, oleaut32, shdocvw,
shell32, comctl32, msrle32, mshtml, winspool, wineps, serialui,
setupapi, wininet, regedit, uninstaller, notepad, winecfg and
winhelp.
Kevin Koltzau <kevin@plop.org>
- Fix warnings in 64bit.
Mike McCormack <mike@codeweavers.com>
- Fix gcc 4.0 warnings.
Alexander N. Sørnes <alex@thehandofagony.com>
- Added Norwegian translations.
Marcus Meissner <meissner@suse.de>
- PrintDlg16: Copy back the Flags, nFromPage, nToPage and nCopies struct
members after the print dialog finishes.
Kimmo Myllyvirta <kimmo.myllyvirta@gmail.com>
- Bring Finnish resources up to date.
svn path=/trunk/; revision=18331
2005-10-08 13:28:54 +00:00
|
|
|
j=SendDlgItemMessageW(hDlg,cmb1,CB_FINDSTRING,-1,(LPARAM)lpxx->lfFaceName);
|
2005-07-31 12:11:56 +00:00
|
|
|
if (j!=CB_ERR)
|
|
|
|
{
|
|
|
|
INT height = lpxx->lfHeight < 0 ? -lpxx->lfHeight :
|
|
|
|
lpxx->lfHeight;
|
|
|
|
INT points;
|
|
|
|
int charset = lpxx->lfCharSet;
|
2010-03-11 17:37:30 +00:00
|
|
|
points = MulDiv( height, 72, GetScreenDPI());
|
2005-07-31 12:11:56 +00:00
|
|
|
pstyle = MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:
|
|
|
|
FW_NORMAL,lpxx->lfItalic !=0);
|
|
|
|
SendDlgItemMessageW(hDlg, cmb1, CB_SETCURSEL, j, 0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb1));
|
2014-04-22 14:40:19 +00:00
|
|
|
init = TRUE;
|
2005-07-31 12:11:56 +00:00
|
|
|
/* look for fitting font style in combobox2 */
|
|
|
|
CFn_FitFontStyle(hDlg, pstyle);
|
|
|
|
/* look for fitting font size in combobox3 */
|
|
|
|
CFn_FitFontSize(hDlg, points);
|
|
|
|
CFn_FitCharSet( hDlg, charset );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!init)
|
|
|
|
{
|
|
|
|
SendDlgItemMessageW(hDlg,cmb1,CB_SETCURSEL,0,0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb1));
|
2007-07-27 09:28:40 +00:00
|
|
|
SendDlgItemMessageW(hDlg,cmb2,CB_SETCURSEL,0,0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb2, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb1));
|
|
|
|
SendDlgItemMessageW(hDlg,cmb3,CB_SETCURSEL,0,0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb3, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb3));
|
|
|
|
SendDlgItemMessageW(hDlg,cmb5,CB_SETCURSEL,0,0);
|
|
|
|
SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb5, CBN_SELCHANGE),
|
|
|
|
(LPARAM)GetDlgItem(hDlg,cmb5));
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
2016-03-01 19:11:55 +00:00
|
|
|
/* limit text length user can type in as font size */
|
|
|
|
SendDlgItemMessageW(hDlg, cmb3, CB_LIMITTEXT, 5, 0);
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
if ((lpcf->Flags & CF_USESTYLE) && lpcf->lpszStyle)
|
|
|
|
{
|
Sync to Wine-20050930:
Alexandre Julliard <julliard@winehq.org>
- We are no longer generating .spec.c files.
- We are no longer generating .dbg.c files.
Milko Krachounov <milko@3mhz.net>
- Bulgarian resources for mpr, msi, user, commdlg, oleaut32, shdocvw,
shell32, comctl32, msrle32, mshtml, winspool, wineps, serialui,
setupapi, wininet, regedit, uninstaller, notepad, winecfg and
winhelp.
Kevin Koltzau <kevin@plop.org>
- Fix warnings in 64bit.
Mike McCormack <mike@codeweavers.com>
- Fix gcc 4.0 warnings.
Alexander N. Sørnes <alex@thehandofagony.com>
- Added Norwegian translations.
Marcus Meissner <meissner@suse.de>
- PrintDlg16: Copy back the Flags, nFromPage, nToPage and nCopies struct
members after the print dialog finishes.
Kimmo Myllyvirta <kimmo.myllyvirta@gmail.com>
- Bring Finnish resources up to date.
svn path=/trunk/; revision=18331
2005-10-08 13:28:54 +00:00
|
|
|
j=SendDlgItemMessageW(hDlg,cmb2,CB_FINDSTRING,-1,(LPARAM)lpcf->lpszStyle);
|
2005-07-31 12:11:56 +00:00
|
|
|
if (j!=CB_ERR)
|
|
|
|
{
|
|
|
|
j=SendDlgItemMessageW(hDlg,cmb2,CB_SETCURSEL,j,0);
|
|
|
|
SendMessageW(hDlg,WM_COMMAND,cmb2,
|
2012-02-15 17:33:15 +00:00
|
|
|
MAKELONG(LOWORD(GetDlgItem(hDlg,cmb2)),CBN_SELCHANGE));
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
CFn_ReleaseDC(lpcf, hdc);
|
|
|
|
SetCursor(hcursor);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* CFn_WMMeasureItem [internal]
|
|
|
|
*/
|
2010-04-20 08:30:10 +00:00
|
|
|
static LRESULT CFn_WMMeasureItem(HWND hDlg, LPARAM lParam)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
HDC hdc;
|
|
|
|
HFONT hfontprev;
|
|
|
|
TEXTMETRICW tm;
|
|
|
|
LPMEASUREITEMSTRUCT lpmi=(LPMEASUREITEMSTRUCT)lParam;
|
2012-02-15 17:33:15 +00:00
|
|
|
INT height = 0, cx;
|
2005-08-12 16:47:29 +00:00
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
if (!himlTT)
|
|
|
|
himlTT = ImageList_LoadImageW( COMDLG32_hInstance, MAKEINTRESOURCEW(38),
|
|
|
|
TTBITMAP_XSIZE, 0, CLR_DEFAULT, IMAGE_BITMAP, 0);
|
2012-02-15 17:33:15 +00:00
|
|
|
ImageList_GetIconSize( himlTT, &cx, &height);
|
2005-08-12 16:47:29 +00:00
|
|
|
lpmi->itemHeight = height + 2;
|
2005-07-31 12:11:56 +00:00
|
|
|
/* use MAX of bitmap height and tm.tmHeight .*/
|
|
|
|
hdc=GetDC(hDlg);
|
|
|
|
if(!hdc) return 0;
|
2013-10-05 20:43:34 +00:00
|
|
|
hfontprev = SelectObject( hdc, (HFONT)SendMessageW( hDlg, WM_GETFONT, 0, 0 ));
|
2005-07-31 12:11:56 +00:00
|
|
|
GetTextMetricsW(hdc, &tm);
|
|
|
|
if( tm.tmHeight > lpmi->itemHeight) lpmi->itemHeight = tm.tmHeight;
|
|
|
|
SelectObject(hdc, hfontprev);
|
|
|
|
ReleaseDC(hDlg, hdc);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* CFn_WMDrawItem [internal]
|
|
|
|
*/
|
2010-04-20 08:30:10 +00:00
|
|
|
static LRESULT CFn_WMDrawItem(LPARAM lParam)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
HBRUSH hBrush;
|
|
|
|
WCHAR buffer[40];
|
|
|
|
COLORREF cr, oldText=0, oldBk=0;
|
|
|
|
RECT rect;
|
|
|
|
int nFontType;
|
2013-10-05 20:43:34 +00:00
|
|
|
int cx, cy, idx;
|
2005-07-31 12:11:56 +00:00
|
|
|
LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam;
|
|
|
|
|
|
|
|
if (lpdi->itemID == (UINT)-1) /* got no items */
|
|
|
|
DrawFocusRect(lpdi->hDC, &lpdi->rcItem);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (lpdi->CtlType == ODT_COMBOBOX)
|
|
|
|
{
|
|
|
|
if (lpdi->itemState & ODS_SELECTED)
|
|
|
|
{
|
|
|
|
hBrush=GetSysColorBrush(COLOR_HIGHLIGHT);
|
|
|
|
oldText=SetTextColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
|
|
|
|
oldBk=SetBkColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHT));
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
hBrush = SelectObject(lpdi->hDC, GetStockObject(LTGRAY_BRUSH));
|
|
|
|
SelectObject(lpdi->hDC, hBrush);
|
|
|
|
}
|
|
|
|
FillRect(lpdi->hDC, &lpdi->rcItem, hBrush);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return TRUE; /* this should never happen */
|
|
|
|
|
|
|
|
rect=lpdi->rcItem;
|
|
|
|
switch (lpdi->CtlID)
|
|
|
|
{
|
|
|
|
case cmb1:
|
|
|
|
/* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
|
2013-10-05 20:43:34 +00:00
|
|
|
ImageList_GetIconSize( himlTT, &cx, &cy);
|
2005-07-31 12:11:56 +00:00
|
|
|
SendMessageW(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
|
|
|
|
(LPARAM)buffer);
|
2013-10-05 20:43:34 +00:00
|
|
|
TextOutW(lpdi->hDC, lpdi->rcItem.left + cx + 4,
|
2005-07-31 12:11:56 +00:00
|
|
|
lpdi->rcItem.top, buffer, lstrlenW(buffer));
|
|
|
|
nFontType = SendMessageW(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
|
|
|
|
idx = -1;
|
|
|
|
if (nFontType & TRUETYPE_FONTTYPE) {
|
|
|
|
idx = 0; /* picture: TT */
|
|
|
|
if( nFontType & NTM_TT_OPENTYPE)
|
|
|
|
idx = 2; /* picture: O */
|
|
|
|
} else if( nFontType & NTM_PS_OPENTYPE)
|
|
|
|
idx = 3; /* picture: O+ps */
|
|
|
|
else if( nFontType & NTM_TYPE1)
|
|
|
|
idx = 4; /* picture: a */
|
|
|
|
else if( nFontType & DEVICE_FONTTYPE)
|
|
|
|
idx = 1; /* picture: printer */
|
|
|
|
if( idx >= 0)
|
|
|
|
ImageList_Draw( himlTT, idx, lpdi->hDC, lpdi->rcItem.left,
|
2013-10-05 20:43:34 +00:00
|
|
|
(lpdi->rcItem.top + lpdi->rcItem.bottom - cy) / 2, ILD_TRANSPARENT);
|
2005-07-31 12:11:56 +00:00
|
|
|
break;
|
|
|
|
case cmb2:
|
|
|
|
case cmb3:
|
|
|
|
/* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
|
|
|
|
case cmb5:
|
|
|
|
SendMessageW(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
|
|
|
|
(LPARAM)buffer);
|
|
|
|
TextOutW(lpdi->hDC, lpdi->rcItem.left,
|
|
|
|
lpdi->rcItem.top, buffer, lstrlenW(buffer));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cmb4:
|
|
|
|
/* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
|
|
|
|
SendMessageW(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
|
|
|
|
(LPARAM)buffer);
|
|
|
|
TextOutW(lpdi->hDC, lpdi->rcItem.left + 25+5,
|
|
|
|
lpdi->rcItem.top, buffer, lstrlenW(buffer));
|
|
|
|
cr = SendMessageW(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
|
|
|
|
hBrush = CreateSolidBrush(cr);
|
|
|
|
if (hBrush)
|
|
|
|
{
|
|
|
|
hBrush = SelectObject (lpdi->hDC, hBrush) ;
|
|
|
|
rect.right=rect.left+25;
|
|
|
|
rect.top++;
|
|
|
|
rect.left+=5;
|
|
|
|
rect.bottom--;
|
|
|
|
Rectangle( lpdi->hDC, rect.left, rect.top,
|
|
|
|
rect.right, rect.bottom );
|
|
|
|
DeleteObject( SelectObject (lpdi->hDC, hBrush)) ;
|
|
|
|
}
|
|
|
|
rect=lpdi->rcItem;
|
|
|
|
rect.left+=25+5;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return TRUE; /* this should never happen */
|
|
|
|
}
|
|
|
|
if (lpdi->itemState & ODS_SELECTED)
|
|
|
|
{
|
|
|
|
SetTextColor(lpdi->hDC, oldText);
|
|
|
|
SetBkColor(lpdi->hDC, oldBk);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2016-03-01 19:11:55 +00:00
|
|
|
static INT get_dialog_font_point_size(HWND hDlg, CHOOSEFONTW *cf)
|
|
|
|
{
|
|
|
|
BOOL invalid_size = FALSE;
|
|
|
|
INT i, size;
|
|
|
|
|
|
|
|
i = SendDlgItemMessageW(hDlg, cmb3, CB_GETCURSEL, 0, 0);
|
|
|
|
if (i != CB_ERR)
|
|
|
|
size = LOWORD(SendDlgItemMessageW(hDlg, cmb3, CB_GETITEMDATA , i, 0));
|
|
|
|
else
|
|
|
|
{
|
|
|
|
WCHAR buffW[8], *endptrW;
|
|
|
|
|
|
|
|
GetDlgItemTextW(hDlg, cmb3, buffW, sizeof(buffW)/sizeof(*buffW));
|
|
|
|
size = strtolW(buffW, &endptrW, 10);
|
|
|
|
invalid_size = size == 0 && *endptrW;
|
|
|
|
|
|
|
|
if (size == 0)
|
|
|
|
size = 10;
|
|
|
|
}
|
|
|
|
|
|
|
|
cf->iPointSize = 10 * size;
|
|
|
|
cf->lpLogFont->lfHeight = -MulDiv(cf->iPointSize, GetScreenDPI(), 720);
|
|
|
|
return invalid_size ? -1 : size;
|
|
|
|
}
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* CFn_WMCommand [internal]
|
|
|
|
*/
|
2010-03-11 17:37:30 +00:00
|
|
|
static LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam, LPCHOOSEFONTW lpcf)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
long l;
|
|
|
|
HDC hdc;
|
|
|
|
|
Sync devenum, atl, comctl32, comdlg32, cryptdlg, cryptui, hhctrl, itss, jscript, mapi32, msacm32, mshtml, msi, msimtf, oleacc, pstorec, shdoclc, shdocvw, shlwapi, snmpapi, urlmon, usp10, uxtheme, windowscodecs, wldap32, wtsapi32, wuapi, xinput1_3
svn path=/trunk/; revision=47961
2010-07-06 23:29:26 +00:00
|
|
|
if (!lpcf) return FALSE;
|
|
|
|
|
2007-07-27 09:28:40 +00:00
|
|
|
TRACE("WM_COMMAND wParam=%08X lParam=%08lX\n", (LONG)wParam, lParam);
|
2005-07-31 12:11:56 +00:00
|
|
|
switch (LOWORD(wParam))
|
|
|
|
{
|
|
|
|
case cmb1:
|
|
|
|
if (HIWORD(wParam)==CBN_SELCHANGE)
|
|
|
|
{
|
|
|
|
INT pointsize; /* save current pointsize */
|
|
|
|
LONG pstyle; /* save current style */
|
|
|
|
int charset;
|
|
|
|
int idx;
|
|
|
|
if(!(hdc = CFn_GetDC(lpcf)))
|
|
|
|
{
|
|
|
|
EndDialog (hDlg, 0);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
idx = SendDlgItemMessageW(hDlg, cmb3, CB_GETCURSEL, 0, 0);
|
|
|
|
pointsize = (int)SendDlgItemMessageW( hDlg, cmb3, CB_GETITEMDATA,
|
|
|
|
idx, 0);
|
|
|
|
idx = SendDlgItemMessageW(hDlg, cmb2, CB_GETCURSEL, 0, 0);
|
|
|
|
pstyle = SendDlgItemMessageW(hDlg, cmb2, CB_GETITEMDATA, idx, 0);
|
|
|
|
idx = SendDlgItemMessageW(hDlg, cmb5, CB_GETCURSEL, 0, 0);
|
|
|
|
charset = SendDlgItemMessageW(hDlg, cmb5, CB_GETITEMDATA, idx, 0);
|
|
|
|
|
|
|
|
SendDlgItemMessageW(hDlg, cmb2, CB_RESETCONTENT, 0, 0);
|
|
|
|
SendDlgItemMessageW(hDlg, cmb3, CB_RESETCONTENT, 0, 0);
|
|
|
|
SendDlgItemMessageW(hDlg, cmb5, CB_RESETCONTENT, 0, 0);
|
|
|
|
i=SendDlgItemMessageW(hDlg, cmb1, CB_GETCURSEL, 0, 0);
|
|
|
|
if (i!=CB_ERR)
|
|
|
|
{
|
|
|
|
HCURSOR hcursor=SetCursor(LoadCursorW(0,(LPWSTR)IDC_WAIT));
|
|
|
|
CFn_ENUMSTRUCT s;
|
|
|
|
LOGFONTW enumlf;
|
|
|
|
SendDlgItemMessageW(hDlg, cmb1, CB_GETLBTEXT, i,
|
|
|
|
(LPARAM)enumlf.lfFaceName);
|
|
|
|
TRACE("WM_COMMAND/cmb1 =>%s\n", debugstr_w(enumlf.lfFaceName));
|
|
|
|
s.hWnd1=GetDlgItem(hDlg, cmb2);
|
|
|
|
s.hWnd2=GetDlgItem(hDlg, cmb3);
|
|
|
|
s.lpcf32w=lpcf;
|
|
|
|
enumlf.lfCharSet = DEFAULT_CHARSET; /* enum all charsets */
|
|
|
|
enumlf.lfPitchAndFamily = 0;
|
|
|
|
EnumFontFamiliesExW(hdc, &enumlf,
|
|
|
|
(FONTENUMPROCW)FontStyleEnumProc, (LPARAM)&s, 0);
|
|
|
|
CFn_FitFontStyle(hDlg, pstyle);
|
|
|
|
if( pointsize != CB_ERR) CFn_FitFontSize(hDlg, pointsize);
|
|
|
|
if( charset != CB_ERR) CFn_FitCharSet( hDlg, charset );
|
|
|
|
SetCursor(hcursor);
|
|
|
|
}
|
|
|
|
CFn_ReleaseDC(lpcf, hdc);
|
|
|
|
}
|
2012-02-15 17:33:15 +00:00
|
|
|
break;
|
2005-07-31 12:11:56 +00:00
|
|
|
case chx1:
|
|
|
|
case chx2:
|
|
|
|
case cmb2:
|
|
|
|
case cmb3:
|
|
|
|
case cmb5:
|
|
|
|
if (HIWORD(wParam)==CBN_SELCHANGE || HIWORD(wParam)== BN_CLICKED )
|
|
|
|
{
|
|
|
|
WCHAR str[256];
|
|
|
|
WINDOWINFO wininfo;
|
Finish the Wine sync. These components are not just rc file changes
atl, comctl32, comdlg32, dwmapi, fusion, gdiplus, jscript, mpr, mshtml, msi, msimtf, msxml3, ole32, oleaut32, riched20, shdocvw, shlwapi, urlmon, usp10, version and windowscodecs
Seems to build and boot. /me hides
svn path=/trunk/; revision=48273
2010-07-26 02:26:04 +00:00
|
|
|
LPLOGFONTW lpxx=lpcf->lpLogFont;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
TRACE("WM_COMMAND/cmb2,3 =%08lX\n", lParam);
|
2016-03-01 19:11:55 +00:00
|
|
|
|
|
|
|
/* face name */
|
2005-07-31 12:11:56 +00:00
|
|
|
i=SendDlgItemMessageW(hDlg,cmb1,CB_GETCURSEL,0,0);
|
|
|
|
if (i==CB_ERR)
|
2016-03-01 19:11:55 +00:00
|
|
|
GetDlgItemTextW( hDlg, cmb1, str, sizeof(str)/sizeof(str[0]) );
|
2005-07-31 12:11:56 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
SendDlgItemMessageW(hDlg,cmb1,CB_GETLBTEXT,i,
|
|
|
|
(LPARAM)str);
|
|
|
|
l=SendDlgItemMessageW(hDlg,cmb1,CB_GETITEMDATA,i,0);
|
|
|
|
lpcf->nFontType = LOWORD(l);
|
|
|
|
/* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
|
|
|
|
/* same value reported to the EnumFonts
|
|
|
|
call back with the extra FONTTYPE_... bits added */
|
|
|
|
lpxx->lfPitchAndFamily = HIWORD(l) >> 8;
|
|
|
|
}
|
2008-04-04 12:16:03 +00:00
|
|
|
lstrcpynW(lpxx->lfFaceName, str, sizeof(lpxx->lfFaceName)/sizeof(lpxx->lfFaceName[0]));
|
2016-03-01 19:11:55 +00:00
|
|
|
|
|
|
|
/* style */
|
2005-07-31 12:11:56 +00:00
|
|
|
i=SendDlgItemMessageW(hDlg, cmb2, CB_GETCURSEL, 0, 0);
|
|
|
|
if (i!=CB_ERR)
|
|
|
|
{
|
|
|
|
l=SendDlgItemMessageW(hDlg, cmb2, CB_GETITEMDATA, i, 0);
|
|
|
|
if (0!=(lpxx->lfItalic=HIWORD(l)))
|
|
|
|
lpcf->nFontType |= ITALIC_FONTTYPE;
|
|
|
|
if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
|
|
|
|
lpcf->nFontType |= BOLD_FONTTYPE;
|
|
|
|
}
|
2016-03-01 19:11:55 +00:00
|
|
|
|
|
|
|
/* size */
|
|
|
|
get_dialog_font_point_size(hDlg, lpcf);
|
|
|
|
|
|
|
|
/* charset */
|
2005-07-31 12:11:56 +00:00
|
|
|
i=SendDlgItemMessageW(hDlg, cmb5, CB_GETCURSEL, 0, 0);
|
|
|
|
if (i!=CB_ERR)
|
|
|
|
lpxx->lfCharSet=SendDlgItemMessageW(hDlg, cmb5, CB_GETITEMDATA, i, 0);
|
|
|
|
else
|
|
|
|
lpxx->lfCharSet = DEFAULT_CHARSET;
|
|
|
|
lpxx->lfStrikeOut=IsDlgButtonChecked(hDlg,chx1);
|
|
|
|
lpxx->lfUnderline=IsDlgButtonChecked(hDlg,chx2);
|
|
|
|
lpxx->lfWidth=lpxx->lfOrientation=lpxx->lfEscapement=0;
|
|
|
|
lpxx->lfOutPrecision=OUT_DEFAULT_PRECIS;
|
|
|
|
lpxx->lfClipPrecision=CLIP_DEFAULT_PRECIS;
|
|
|
|
lpxx->lfQuality=DEFAULT_QUALITY;
|
|
|
|
|
|
|
|
wininfo.cbSize=sizeof(wininfo);
|
|
|
|
|
|
|
|
if( GetWindowInfo( GetDlgItem( hDlg, stc5), &wininfo ) )
|
|
|
|
{
|
|
|
|
MapWindowPoints( 0, hDlg, (LPPOINT) &wininfo.rcWindow, 2);
|
|
|
|
InvalidateRect( hDlg, &wininfo.rcWindow, TRUE );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cmb4:
|
|
|
|
i=SendDlgItemMessageW(hDlg, cmb4, CB_GETCURSEL, 0, 0);
|
|
|
|
if (i!=CB_ERR)
|
|
|
|
{
|
|
|
|
WINDOWINFO wininfo;
|
|
|
|
|
2006-07-05 22:48:31 +00:00
|
|
|
lpcf->rgbColors = SendDlgItemMessageW(hDlg, cmb4, CB_GETITEMDATA, i, 0);
|
2005-07-31 12:11:56 +00:00
|
|
|
wininfo.cbSize=sizeof(wininfo);
|
|
|
|
|
|
|
|
if( GetWindowInfo( GetDlgItem( hDlg, stc5), &wininfo ) )
|
|
|
|
{
|
|
|
|
MapWindowPoints( 0, hDlg, (LPPOINT) &wininfo.rcWindow, 2);
|
|
|
|
InvalidateRect( hDlg, &wininfo.rcWindow, TRUE );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case psh15:
|
|
|
|
i=RegisterWindowMessageW( HELPMSGSTRINGW );
|
|
|
|
if (lpcf->hwndOwner)
|
|
|
|
SendMessageW(lpcf->hwndOwner, i, 0, (LPARAM)GetPropW(hDlg, strWineFontData));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IDOK:
|
2016-03-01 19:11:55 +00:00
|
|
|
{
|
|
|
|
WCHAR msgW[80];
|
|
|
|
INT pointsize;
|
|
|
|
|
|
|
|
pointsize = get_dialog_font_point_size(hDlg, lpcf);
|
|
|
|
if (pointsize == -1)
|
|
|
|
{
|
|
|
|
LoadStringW(COMDLG32_hInstance, IDS_FONT_SIZE_INPUT, msgW, sizeof(msgW)/sizeof(*msgW));
|
|
|
|
MessageBoxW(hDlg, msgW, NULL, MB_OK | MB_ICONINFORMATION);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
|
|
|
|
( (lpcf->Flags & CF_LIMITSIZE) &&
|
|
|
|
(lpcf->iPointSize >= 10 * lpcf->nSizeMin) &&
|
|
|
|
(lpcf->iPointSize <= 10 * lpcf->nSizeMax)))
|
|
|
|
EndDialog(hDlg, TRUE);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
WCHAR format[80];
|
2012-02-15 17:33:15 +00:00
|
|
|
DWORD_PTR args[2];
|
2005-07-31 12:11:56 +00:00
|
|
|
LoadStringW(COMDLG32_hInstance, IDS_FONT_SIZE, format, sizeof(format)/sizeof(WCHAR));
|
2012-02-15 17:33:15 +00:00
|
|
|
args[0] = lpcf->nSizeMin;
|
|
|
|
args[1] = lpcf->nSizeMax;
|
|
|
|
FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
2016-03-01 19:11:55 +00:00
|
|
|
format, 0, 0, msgW, sizeof(msgW)/sizeof(*msgW),
|
2012-02-15 17:33:15 +00:00
|
|
|
(__ms_va_list*)args);
|
2016-03-01 19:11:55 +00:00
|
|
|
MessageBoxW(hDlg, msgW, NULL, MB_OK);
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
return(TRUE);
|
2016-03-01 19:11:55 +00:00
|
|
|
}
|
2005-07-31 12:11:56 +00:00
|
|
|
case IDCANCEL:
|
|
|
|
EndDialog(hDlg, FALSE);
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
2010-03-11 17:37:30 +00:00
|
|
|
static LRESULT CFn_WMDestroy(HWND hwnd, LPCHOOSEFONTW lpcfw)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
LPCHOOSEFONTA lpcfa;
|
|
|
|
LPSTR lpszStyle;
|
|
|
|
LPLOGFONTA lpLogFonta;
|
|
|
|
int len;
|
|
|
|
|
Sync devenum, atl, comctl32, comdlg32, cryptdlg, cryptui, hhctrl, itss, jscript, mapi32, msacm32, mshtml, msi, msimtf, oleacc, pstorec, shdoclc, shdocvw, shlwapi, snmpapi, urlmon, usp10, uxtheme, windowscodecs, wldap32, wtsapi32, wuapi, xinput1_3
svn path=/trunk/; revision=47961
2010-07-06 23:29:26 +00:00
|
|
|
if (!lpcfw) return FALSE;
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
lpcfa = GetPropW(hwnd, strWineFontData_a);
|
|
|
|
lpLogFonta = lpcfa->lpLogFont;
|
|
|
|
lpszStyle = lpcfa->lpszStyle;
|
|
|
|
memcpy(lpcfa, lpcfw, sizeof(CHOOSEFONTA));
|
|
|
|
lpcfa->lpLogFont = lpLogFonta;
|
|
|
|
lpcfa->lpszStyle = lpszStyle;
|
|
|
|
memcpy(lpcfa->lpLogFont, lpcfw->lpLogFont, sizeof(LOGFONTA));
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, lpcfw->lpLogFont->lfFaceName,
|
|
|
|
LF_FACESIZE, lpcfa->lpLogFont->lfFaceName, LF_FACESIZE, 0, 0);
|
|
|
|
|
|
|
|
if((lpcfw->Flags & CF_USESTYLE) && lpcfw->lpszStyle) {
|
2008-12-27 12:31:20 +00:00
|
|
|
len = WideCharToMultiByte(CP_ACP, 0, lpcfw->lpszStyle, -1, NULL, 0, 0, 0);
|
2005-07-31 12:11:56 +00:00
|
|
|
WideCharToMultiByte(CP_ACP, 0, lpcfw->lpszStyle, -1, lpcfa->lpszStyle, len, 0, 0);
|
|
|
|
HeapFree(GetProcessHeap(), 0, lpcfw->lpszStyle);
|
|
|
|
}
|
|
|
|
|
|
|
|
HeapFree(GetProcessHeap(), 0, lpcfw->lpLogFont);
|
|
|
|
HeapFree(GetProcessHeap(), 0, lpcfw);
|
|
|
|
SetPropW(hwnd, strWineFontData, 0);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2010-03-11 17:37:30 +00:00
|
|
|
static LRESULT CFn_WMPaint(HWND hDlg, WPARAM wParam, LPARAM lParam, const CHOOSEFONTW *lpcf)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
WINDOWINFO info;
|
|
|
|
|
Sync devenum, atl, comctl32, comdlg32, cryptdlg, cryptui, hhctrl, itss, jscript, mapi32, msacm32, mshtml, msi, msimtf, oleacc, pstorec, shdoclc, shdocvw, shlwapi, snmpapi, urlmon, usp10, uxtheme, windowscodecs, wldap32, wtsapi32, wuapi, xinput1_3
svn path=/trunk/; revision=47961
2010-07-06 23:29:26 +00:00
|
|
|
if (!lpcf) return FALSE;
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
info.cbSize=sizeof(info);
|
|
|
|
if( GetWindowInfo( GetDlgItem( hDlg, stc5), &info ) )
|
|
|
|
{
|
|
|
|
PAINTSTRUCT ps;
|
|
|
|
HDC hdc;
|
|
|
|
HFONT hOrigFont;
|
|
|
|
LOGFONTW lf = *(lpcf->lpLogFont);
|
|
|
|
|
|
|
|
MapWindowPoints( 0, hDlg, (LPPOINT) &info.rcWindow, 2);
|
|
|
|
hdc = BeginPaint( hDlg, &ps );
|
|
|
|
|
2016-06-05 18:59:07 +00:00
|
|
|
TRACE("erase %d, rect=%s\n", ps.fErase, wine_dbgstr_rect(&ps.rcPaint));
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
/* Paint frame */
|
2013-10-05 20:43:34 +00:00
|
|
|
DrawEdge( hdc, &info.rcWindow, EDGE_SUNKEN, BF_RECT|BF_ADJUST );
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
/* Draw the sample text itself */
|
|
|
|
hOrigFont = SelectObject( hdc, CreateFontIndirectW( &lf ) );
|
2005-12-26 22:57:56 +00:00
|
|
|
SetTextColor( hdc, lpcf->rgbColors );
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
DrawTextW( hdc,
|
|
|
|
sample_lang_text[CHARSET_ORDER[lpcf->lpLogFont->lfCharSet]],
|
|
|
|
-1, &info.rcWindow, DT_CENTER|DT_VCENTER|DT_SINGLELINE );
|
|
|
|
|
|
|
|
DeleteObject(SelectObject( hdc, hOrigFont ));
|
|
|
|
EndPaint( hDlg, &ps );
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* FormatCharDlgProcA [internal]
|
|
|
|
*/
|
2010-03-11 17:37:30 +00:00
|
|
|
static INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
LPCHOOSEFONTW lpcfw;
|
|
|
|
LPCHOOSEFONTA lpcfa;
|
|
|
|
INT_PTR res = FALSE;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
if (uMsg!=WM_INITDIALOG) {
|
2008-12-27 12:31:20 +00:00
|
|
|
lpcfw = GetPropW(hDlg, strWineFontData);
|
Sync devenum, atl, comctl32, comdlg32, cryptdlg, cryptui, hhctrl, itss, jscript, mapi32, msacm32, mshtml, msi, msimtf, oleacc, pstorec, shdoclc, shdocvw, shlwapi, snmpapi, urlmon, usp10, uxtheme, windowscodecs, wldap32, wtsapi32, wuapi, xinput1_3
svn path=/trunk/; revision=47961
2010-07-06 23:29:26 +00:00
|
|
|
if (lpcfw && CFn_HookCallChk32(lpcfw))
|
2005-07-31 12:11:56 +00:00
|
|
|
res=CallWindowProcA((WNDPROC)lpcfw->lpfnHook, hDlg, uMsg, wParam, lParam);
|
|
|
|
if (res)
|
|
|
|
return res;
|
|
|
|
} else {
|
|
|
|
lpcfa=(LPCHOOSEFONTA)lParam;
|
|
|
|
SetPropW(hDlg, strWineFontData_a, (HANDLE)lParam);
|
|
|
|
|
|
|
|
lpcfw = HeapAlloc(GetProcessHeap(), 0, sizeof(CHOOSEFONTW));
|
|
|
|
memcpy(lpcfw, lpcfa, sizeof(CHOOSEFONTA));
|
|
|
|
lpcfw->lpLogFont = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGFONTW));
|
|
|
|
memcpy(lpcfw->lpLogFont, lpcfa->lpLogFont, sizeof(LOGFONTA));
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, lpcfa->lpLogFont->lfFaceName,
|
|
|
|
LF_FACESIZE, lpcfw->lpLogFont->lfFaceName, LF_FACESIZE);
|
|
|
|
|
|
|
|
if((lpcfa->Flags & CF_USESTYLE) && lpcfa->lpszStyle) {
|
|
|
|
len = MultiByteToWideChar(CP_ACP, 0, lpcfa->lpszStyle, -1, NULL, 0);
|
|
|
|
lpcfw->lpszStyle = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, lpcfa->lpszStyle, -1, lpcfw->lpszStyle, len);
|
|
|
|
}
|
|
|
|
|
2010-03-11 17:37:30 +00:00
|
|
|
if (!CFn_WMInitDialog(hDlg, lParam, lpcfw))
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
TRACE("CFn_WMInitDialog returned FALSE\n");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
if (CFn_HookCallChk32(lpcfw))
|
|
|
|
return CallWindowProcA((WNDPROC)lpcfa->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
|
|
|
|
}
|
|
|
|
switch (uMsg)
|
|
|
|
{
|
|
|
|
case WM_MEASUREITEM:
|
2010-04-20 08:30:10 +00:00
|
|
|
return CFn_WMMeasureItem(hDlg,lParam);
|
2005-07-31 12:11:56 +00:00
|
|
|
case WM_DRAWITEM:
|
2010-04-20 08:30:10 +00:00
|
|
|
return CFn_WMDrawItem(lParam);
|
2005-07-31 12:11:56 +00:00
|
|
|
case WM_COMMAND:
|
|
|
|
return CFn_WMCommand(hDlg, wParam, lParam, lpcfw);
|
|
|
|
case WM_DESTROY:
|
2010-03-11 17:37:30 +00:00
|
|
|
return CFn_WMDestroy(hDlg, lpcfw);
|
2005-07-31 12:11:56 +00:00
|
|
|
case WM_CHOOSEFONT_GETLOGFONT:
|
2013-10-05 20:43:34 +00:00
|
|
|
{
|
|
|
|
LOGFONTA *logfont = (LOGFONTA *)lParam;
|
2005-07-31 12:11:56 +00:00
|
|
|
TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam);
|
2013-10-05 20:43:34 +00:00
|
|
|
memcpy( logfont, lpcfw->lpLogFont, FIELD_OFFSET( LOGFONTA, lfFaceName ));
|
|
|
|
WideCharToMultiByte( CP_ACP, 0, lpcfw->lpLogFont->lfFaceName, LF_FACESIZE,
|
|
|
|
logfont->lfFaceName, LF_FACESIZE, NULL, NULL );
|
2005-07-31 12:11:56 +00:00
|
|
|
break;
|
2013-10-05 20:43:34 +00:00
|
|
|
}
|
2005-07-31 12:11:56 +00:00
|
|
|
case WM_PAINT:
|
|
|
|
return CFn_WMPaint(hDlg, wParam, lParam, lpcfw);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* FormatCharDlgProcW [internal]
|
|
|
|
*/
|
2010-03-11 17:37:30 +00:00
|
|
|
static INT_PTR CALLBACK FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
LPCHOOSEFONTW lpcf;
|
|
|
|
INT_PTR res = FALSE;
|
|
|
|
|
|
|
|
if (uMsg!=WM_INITDIALOG)
|
|
|
|
{
|
2008-12-27 12:31:20 +00:00
|
|
|
lpcf= GetPropW(hDlg, strWineFontData);
|
Sync devenum, atl, comctl32, comdlg32, cryptdlg, cryptui, hhctrl, itss, jscript, mapi32, msacm32, mshtml, msi, msimtf, oleacc, pstorec, shdoclc, shdocvw, shlwapi, snmpapi, urlmon, usp10, uxtheme, windowscodecs, wldap32, wtsapi32, wuapi, xinput1_3
svn path=/trunk/; revision=47961
2010-07-06 23:29:26 +00:00
|
|
|
if (lpcf && CFn_HookCallChk32(lpcf))
|
2005-07-31 12:11:56 +00:00
|
|
|
res=CallWindowProcW((WNDPROC)lpcf->lpfnHook, hDlg, uMsg, wParam, lParam);
|
|
|
|
if (res)
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
lpcf=(LPCHOOSEFONTW)lParam;
|
2010-03-11 17:37:30 +00:00
|
|
|
if (!CFn_WMInitDialog(hDlg, lParam, lpcf))
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
|
|
|
TRACE("CFn_WMInitDialog returned FALSE\n");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
if (CFn_HookCallChk32(lpcf))
|
|
|
|
return CallWindowProcW((WNDPROC)lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
|
|
|
|
}
|
|
|
|
switch (uMsg)
|
|
|
|
{
|
|
|
|
case WM_MEASUREITEM:
|
2010-04-20 08:30:10 +00:00
|
|
|
return CFn_WMMeasureItem(hDlg, lParam);
|
2005-07-31 12:11:56 +00:00
|
|
|
case WM_DRAWITEM:
|
2010-04-20 08:30:10 +00:00
|
|
|
return CFn_WMDrawItem(lParam);
|
2005-07-31 12:11:56 +00:00
|
|
|
case WM_COMMAND:
|
|
|
|
return CFn_WMCommand(hDlg, wParam, lParam, lpcf);
|
|
|
|
case WM_DESTROY:
|
|
|
|
return TRUE;
|
|
|
|
case WM_CHOOSEFONT_GETLOGFONT:
|
|
|
|
TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam);
|
2013-10-05 20:43:34 +00:00
|
|
|
memcpy( (LOGFONTW *)lParam, lpcf->lpLogFont, sizeof(LOGFONTW) );
|
2005-07-31 12:11:56 +00:00
|
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
|
|
return CFn_WMPaint(hDlg, wParam, lParam, lpcf);
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|