2 * COMMDLG - Font Dialog
4 * Copyright 1994 Martin Ayotte
5 * Copyright 1996 Albrecht Kleine
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
34 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
39 static const WCHAR strWineFontData[] = {'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A',0};
40 static const WCHAR strWineFontData_a[] =
41 {'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A','_','A',0};
42 static const WCHAR chooseFontW[] = {'C','H','O','O','S','E','_','F','O','N','T',0};
46 /* image list with TrueType bitmaps and more */
47 static HIMAGELIST himlTT = 0;
48 #define TTBITMAP_XSIZE 20 /* x-size of the bitmaps */
50 static INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
51 static INT_PTR CALLBACK FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
53 /* There is a table here of all charsets, and the sample text for each.
54 * There is a second table that translates a charset into an index into
58 #define CI(cs) ((IDS_CHARSET_##cs)-IDS_CHARSET_ANSI)
61 static const WCHAR stWestern[]={'A','a','B','b','Y','y','Z','z',0}; /* Western and default */
62 static const WCHAR stSymbol[]={'S','y','m','b','o','l',0}; /* Symbol */
63 static const WCHAR stShiftJis[]={'A','a',0x3042,0x3041,0x30a2,0x30a1,0x4e9c,0x5b87,0}; /* Shift JIS */
64 static const WCHAR stHangul[]={0xac00,0xb098,0xb2e4,'A','a','B','Y','y','Z','z',0}; /* Hangul */
65 static const WCHAR stGB2312[]={0x5fae,0x8f6f,0x4e2d,0x6587,0x8f6f,0x4ef6,0}; /* GB2312 */
66 static const WCHAR stBIG5[]={0x4e2d,0x6587,0x5b57,0x578b,0x7bc4,0x4f8b,0}; /* BIG5 */
67 static const WCHAR stGreek[]={'A','a','B','b',0x0391,0x03b1,0x0392,0x03b2,0}; /* Greek */
68 static const WCHAR stTurkish[]={'A','a','B','b',0x011e,0x011f,0x015e,0x015f,0}; /* Turkish */
69 static const WCHAR stHebrew[]={'A','a','B','b',0x05e0,0x05e1,0x05e9,0x05ea,0}; /* Hebrew */
70 static const WCHAR stArabic[]={'A','a','B','b',0x0627,0x0628,0x062c,0x062f,0x0647,0x0648,0x0632,0};/* Arabic */
71 static const WCHAR stBaltic[]={'A','a','B','b','Y','y','Z','z',0}; /* Baltic */
72 static const WCHAR stVietname[]={'A','a','B','b',0x01a0,0x01a1,0x01af,0x01b0,0}; /* Vietnamese */
73 static const WCHAR stCyrillic[]={'A','a','B','b',0x0411,0x0431,0x0424,0x0444,0}; /* Cyrillic */
74 static const WCHAR stEastEur[]={'A','a','B','b',0xc1,0xe1,0xd4,0xf4,0}; /* East European */
75 static const WCHAR stThai[]={'A','a','B','b',0x0e2d,0x0e31,0x0e01,0x0e29,0x0e23,0x0e44,0x0e17,0x0e22,0}; /* Thai */
76 static const WCHAR stJohab[]={0xac00,0xb098,0xb2e4,'A','a','B','Y','y','Z','z',0}; /* Johab */
77 static const WCHAR stMac[]={'A','a','B','b','Y','y','Z','z',0}; /* Mac */
78 static const WCHAR stOEM[]={'A','a','B','b',0xf8,0xf1,0xfd,0}; /* OEM */
79 /* the following character sets actually behave different (Win2K observation):
80 * the sample string is 'sticky': it uses the sample string of the previous
81 * selected character set. That behaviour looks like some default, which is
82 * not (yet) implemented. */
83 static const WCHAR stVISCII[]={'A','a','B','b',0}; /* VISCII */
84 static const WCHAR stTCVN[]={'A','a','B','b',0}; /* TCVN */
85 static const WCHAR stKOI8[]={'A','a','B','b',0}; /* KOI-8 */
86 static const WCHAR stIso88593[]={'A','a','B','b',0}; /* ISO-8859-3 */
87 static const WCHAR stIso88594[]={'A','a','B','b',0}; /* ISO-8859-4 */
88 static const WCHAR stIso885910[]={'A','a','B','b',0}; /* ISO-8859-10 */
89 static const WCHAR stCeltic[]={'A','a','B','b',0};/* Celtic */
91 static const WCHAR * const sample_lang_text[]={
92 stWestern,stSymbol,stShiftJis,stHangul,stGB2312,
93 stBIG5,stGreek,stTurkish,stHebrew,stArabic,
94 stBaltic,stVietname,stCyrillic,stEastEur,stThai,
95 stJohab,stMac,stOEM,stVISCII,stTCVN,
96 stKOI8,stIso88593,stIso88594,stIso885910,stCeltic};
99 static const BYTE CHARSET_ORDER[256]={
100 CI(ANSI), 0, CI(SYMBOL), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
104 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(MAC), 0, 0,
105 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108 CI(JIS), CI(HANGUL), CI(JOHAB), 0, 0, 0, CI(GB2312), 0, CI(BIG5), 0, 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 0, CI(GREEK), CI(TURKISH), CI(VIETNAMESE), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111 0, CI(HEBREW), CI(ARABIC), 0, 0, 0, 0, 0, 0, 0, CI(BALTIC), 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(RUSSIAN), 0, 0, 0,
113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(THAI), 0,
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(EE), 0,
115 CI(VISCII), CI(TCVN), CI(KOI8), CI(ISO3), CI(ISO4), CI(ISO10), CI(CELTIC), 0, 0, 0, 0, 0, 0, 0, 0, CI(OEM),
118 static const struct {
122 #define XX(x) { x, #x },
127 XX(CF_ENABLETEMPLATE)
128 XX(CF_ENABLETEMPLATEHANDLE)
129 XX(CF_INITTOLOGFONTSTRUCT)
137 XX(CF_FIXEDPITCHONLY)
139 XX(CF_FORCEFONTEXIST)
151 void _dump_cf_flags(DWORD cflags)
155 for (i = 0; i < sizeof(cfflags)/sizeof(cfflags[0]); i++)
156 if (cfflags[i].mask & cflags)
157 TRACE("%s|",cfflags[i].name);
161 /***********************************************************************
162 * ChooseFontW (COMDLG32.@)
164 * Create a font dialog box.
167 * lpChFont [I/O] in: information to initialize the dialog box.
168 * out: User's color selection
171 * TRUE: Ok button clicked.
172 * FALSE: Cancel button clicked, or error.
174 BOOL WINAPI ChooseFontW(LPCHOOSEFONTW lpChFont)
181 TRACE("(%p)\n", lpChFont);
183 if ( (lpChFont->Flags&CF_ENABLETEMPLATEHANDLE)!=0 )
185 template=(LPCVOID)lpChFont->hInstance;
188 if ( (lpChFont->Flags&CF_ENABLETEMPLATE)!=0 )
190 hDlginst=lpChFont->hInstance;
191 if( !(hResInfo = FindResourceW(hDlginst, lpChFont->lpTemplateName,
194 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
199 hDlginst=COMDLG32_hInstance;
200 if (!(hResInfo = FindResourceW(hDlginst, chooseFontW, (LPWSTR)RT_DIALOG)))
202 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
206 if (!(hDlgTmpl = LoadResource(hDlginst, hResInfo )) ||
207 !(template = LockResource( hDlgTmpl )))
209 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
213 if (TRACE_ON(commdlg))
214 _dump_cf_flags(lpChFont->Flags);
216 if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS ))
217 FIXME(": unimplemented flag (ignored)\n");
219 return DialogBoxIndirectParamW(COMDLG32_hInstance, template,
220 lpChFont->hwndOwner, FormatCharDlgProcW, (LPARAM)lpChFont );
223 /***********************************************************************
224 * ChooseFontA (COMDLG32.@)
228 BOOL WINAPI ChooseFontA(LPCHOOSEFONTA lpChFont)
235 TRACE("(%p)\n", lpChFont);
237 if ( (lpChFont->Flags&CF_ENABLETEMPLATEHANDLE)!=0 )
239 template=(LPCVOID)lpChFont->hInstance;
242 if ( (lpChFont->Flags&CF_ENABLETEMPLATE)!=0 )
244 hDlginst=lpChFont->hInstance;
245 if( !(hResInfo = FindResourceA(hDlginst, lpChFont->lpTemplateName,
248 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
253 hDlginst=COMDLG32_hInstance;
254 if (!(hResInfo = FindResourceW(hDlginst, chooseFontW, (LPWSTR)RT_DIALOG)))
256 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
260 if (!(hDlgTmpl = LoadResource(hDlginst, hResInfo )) ||
261 !(template = LockResource( hDlgTmpl )))
263 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
267 if (TRACE_ON(commdlg))
268 _dump_cf_flags(lpChFont->Flags);
269 if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS ))
270 FIXME(": unimplemented flag (ignored)\n");
272 return DialogBoxIndirectParamA(COMDLG32_hInstance, template,
273 lpChFont->hwndOwner, FormatCharDlgProcA, (LPARAM)lpChFont );
276 #define TEXT_EXTRAS 4
277 #define TEXT_COLORS 16
279 static const COLORREF textcolors[TEXT_COLORS]=
281 0x00000000L,0x00000080L,0x00008000L,0x00008080L,
282 0x00800000L,0x00800080L,0x00808000L,0x00808080L,
283 0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL,
284 0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL
287 /***********************************************************************
288 * CFn_HookCallChk32 [internal]
290 static BOOL CFn_HookCallChk32(const CHOOSEFONTW *lpcf)
293 if(lpcf->Flags & CF_ENABLEHOOK)
299 /*************************************************************************
300 * AddFontFamily [internal]
302 INT AddFontFamily(const ENUMLOGFONTEXW *lpElfex, const NEWTEXTMETRICEXW *lpNTM,
303 UINT nFontType, const CHOOSEFONTW *lpcf, HWND hwnd, LPCFn_ENUMSTRUCT e)
307 const LOGFONTW *lplf = &(lpElfex->elfLogFont);
309 TRACE("font=%s (nFontType=%d)\n", debugstr_w(lplf->lfFaceName), nFontType);
311 if (lpcf->Flags & CF_FIXEDPITCHONLY)
312 if (!(lplf->lfPitchAndFamily & FIXED_PITCH))
314 if (lpcf->Flags & CF_ANSIONLY)
315 if (lplf->lfCharSet != ANSI_CHARSET)
317 if (lpcf->Flags & CF_TTONLY)
318 if (!(nFontType & TRUETYPE_FONTTYPE))
323 i=SendMessageW(hwnd, CB_FINDSTRINGEXACT, 0, (LPARAM)lplf->lfFaceName);
325 i = SendMessageW(hwnd, CB_ADDSTRING, 0, (LPARAM)lplf->lfFaceName);
327 /* store some important font information */
328 w = (lplf->lfPitchAndFamily) << 8 |
329 (HIWORD(lpNTM->ntmTm.ntmFlags) & 0xff);
330 SendMessageW(hwnd, CB_SETITEMDATA, i, MAKELONG(nFontType,w));
336 /*************************************************************************
337 * FontFamilyEnumProc32 [internal]
339 static INT WINAPI FontFamilyEnumProc(const ENUMLOGFONTEXW *lpElfex,
340 const TEXTMETRICW *metrics, DWORD dwFontType, LPARAM lParam)
343 e=(LPCFn_ENUMSTRUCT)lParam;
344 return AddFontFamily( lpElfex, (const NEWTEXTMETRICEXW *) metrics,
345 dwFontType, e->lpcf32w, e->hWnd1, e);
348 /*************************************************************************
349 * SetFontStylesToCombo2 [internal]
351 * Fill font style information into combobox (without using font.c directly)
353 static int SetFontStylesToCombo2(HWND hwnd, HDC hdc, const LOGFONTW *lplf)
362 static const WCHAR strRegular[] = {'R','e','g','u','l','a','r',0};
363 static const WCHAR strItalic[] = {'I','t','a','l','i','c',0};
364 static const WCHAR strBold[] = {'B','o','l','d',0};
365 static const WCHAR strBoldItalic[] = {'B','o','l','d',' ','I','t','a','l','i','c',0};
366 static const struct FONTSTYLE fontstyles[FSTYLES]={
367 { 0, FW_NORMAL, strRegular },
368 { 1, FW_NORMAL, strItalic },
369 { 0, FW_BOLD, strBold },
370 { 1, FW_BOLD, strBoldItalic }
377 memcpy(&lf, lplf, sizeof(LOGFONTW));
379 for (i=0;i<FSTYLES;i++)
381 lf.lfItalic=fontstyles[i].italic;
382 lf.lfWeight=fontstyles[i].weight;
383 hf=CreateFontIndirectW(&lf);
384 hf=SelectObject(hdc,hf);
385 GetTextMetricsW(hdc,&tm);
386 hf=SelectObject(hdc,hf);
388 /* font successful created ? */
389 if (((fontstyles[i].weight == FW_NORMAL && tm.tmWeight <= FW_MEDIUM) ||
390 (fontstyles[i].weight == FW_BOLD && tm.tmWeight > FW_MEDIUM)) &&
391 ((tm.tmItalic != 0)==fontstyles[i].italic))
393 j=SendMessageW(hwnd,CB_ADDSTRING,0,(LPARAM)fontstyles[i].stname );
394 if (j==CB_ERR) return 1;
395 j=SendMessageW(hwnd, CB_SETITEMDATA, j,
396 MAKELONG(tm.tmWeight,fontstyles[i].italic));
397 if (j==CB_ERR) return 1;
403 /*************************************************************************
404 * AddFontSizeToCombo3 [internal]
406 static int AddFontSizeToCombo3(HWND hwnd, UINT h, const CHOOSEFONTW *lpcf)
410 static const WCHAR strFormat[] = {'%','2','d',0};
412 if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
413 ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
415 wsprintfW(buffer, strFormat, h);
416 j=SendMessageW(hwnd, CB_FINDSTRINGEXACT, -1, (LPARAM)buffer);
419 j=SendMessageW(hwnd, CB_ADDSTRING, 0, (LPARAM)buffer);
420 if (j!=CB_ERR) j = SendMessageW(hwnd, CB_SETITEMDATA, j, h);
421 if (j==CB_ERR) return 1;
427 /*************************************************************************
428 * SetFontSizesToCombo3 [internal]
430 static int SetFontSizesToCombo3(HWND hwnd, const CHOOSEFONTW *lpcf)
432 static const BYTE sizes[]={6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
435 for (i = 0; i < sizeof(sizes)/sizeof(sizes[0]); i++)
436 if (AddFontSizeToCombo3(hwnd, sizes[i], lpcf)) return 1;
440 /*************************************************************************
441 * CFn_GetDC [internal]
443 static inline HDC CFn_GetDC(const CHOOSEFONTW *lpcf)
445 HDC ret = ((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC) ?
448 if(!ret) ERR("HDC failure!!!\n");
452 /*************************************************************************
453 * CFn_ReleaseDC [internal]
455 static inline void CFn_ReleaseDC(const CHOOSEFONTW *lpcf, HDC hdc)
457 if(!((lpcf->Flags & CF_PRINTERFONTS) && lpcf->hDC))
461 /***********************************************************************
462 * AddFontStyle [internal]
464 INT AddFontStyle( const ENUMLOGFONTEXW *lpElfex, const NEWTEXTMETRICEXW *lpNTM,
465 UINT nFontType, const CHOOSEFONTW *lpcf, HWND hcmb2, HWND hcmb3,
466 HWND hDlg, BOOL iswin16)
469 const LOGFONTW *lplf = &(lpElfex->elfLogFont);
473 TRACE("(nFontType=%d)\n",nFontType);
474 TRACE(" %s h=%d w=%d e=%d o=%d wg=%d i=%d u=%d s=%d"
475 " ch=%d op=%d cp=%d q=%d pf=%xh\n",
476 debugstr_w(lplf->lfFaceName),lplf->lfHeight,lplf->lfWidth,
477 lplf->lfEscapement,lplf->lfOrientation,
478 lplf->lfWeight,lplf->lfItalic,lplf->lfUnderline,
479 lplf->lfStrikeOut,lplf->lfCharSet, lplf->lfOutPrecision,
480 lplf->lfClipPrecision,lplf->lfQuality, lplf->lfPitchAndFamily);
481 if (nFontType & RASTER_FONTTYPE)
484 if(!(hdc = CFn_GetDC(lpcf))) return 0;
485 points = MulDiv( lpNTM->ntmTm.tmHeight - lpNTM->ntmTm.tmInternalLeading,
486 72, GetDeviceCaps(hdc, LOGPIXELSY));
487 CFn_ReleaseDC(lpcf, hdc);
488 i = AddFontSizeToCombo3(hcmb3, points, lpcf);
490 } else if (SetFontSizesToCombo3(hcmb3, lpcf)) return 0;
492 if (!SendMessageW(hcmb2, CB_GETCOUNT, 0, 0))
494 if(!(hdc = CFn_GetDC(lpcf))) return 0;
495 i=SetFontStylesToCombo2(hcmb2,hdc,lplf);
496 CFn_ReleaseDC(lpcf, hdc);
500 if( iswin16 || !( hcmb5 = GetDlgItem(hDlg, cmb5))) return 1;
501 i = SendMessageW( hcmb5, CB_FINDSTRINGEXACT, 0,
502 (LPARAM)lpElfex->elfScript);
504 i = SendMessageW( hcmb5, CB_ADDSTRING, 0,
505 (LPARAM)lpElfex->elfScript);
507 SendMessageW( hcmb5, CB_SETITEMDATA, i, lplf->lfCharSet);
512 static INT CFn_FitFontSize( HWND hDlg, int points)
516 /* look for fitting font size in combobox3 */
517 n=SendDlgItemMessageW(hDlg, cmb3, CB_GETCOUNT, 0, 0);
520 if (points == (int)SendDlgItemMessageW
521 (hDlg,cmb3, CB_GETITEMDATA,i,0))
523 SendDlgItemMessageW(hDlg,cmb3,CB_SETCURSEL,i,0);
524 SendMessageW(hDlg, WM_COMMAND,
525 MAKEWPARAM(cmb3, CBN_SELCHANGE),
526 (LPARAM)GetDlgItem(hDlg,cmb3));
534 static INT CFn_FitFontStyle( HWND hDlg, LONG packedstyle )
538 /* look for fitting font style in combobox2 */
539 for (i=0;i<TEXT_EXTRAS;i++)
541 id = SendDlgItemMessageW(hDlg, cmb2, CB_GETITEMDATA, i, 0);
542 if (packedstyle == id)
544 SendDlgItemMessageW(hDlg, cmb2, CB_SETCURSEL, i, 0);
545 SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb2, CBN_SELCHANGE),
546 (LPARAM)GetDlgItem(hDlg,cmb2));
555 static INT CFn_FitCharSet( HWND hDlg, int charset )
558 /* look for fitting char set in combobox5 */
559 n=SendDlgItemMessageW(hDlg, cmb5, CB_GETCOUNT, 0, 0);
562 cs =SendDlgItemMessageW(hDlg, cmb5, CB_GETITEMDATA, i, 0);
565 SendDlgItemMessageW(hDlg, cmb5, CB_SETCURSEL, i, 0);
566 SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb5, CBN_SELCHANGE),
567 (LPARAM)GetDlgItem(hDlg,cmb2));
571 /* no charset fits: select the first one in the list */
572 SendDlgItemMessageW(hDlg, cmb5, CB_SETCURSEL, 0, 0);
573 SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb5, CBN_SELCHANGE),
574 (LPARAM)GetDlgItem(hDlg,cmb2));
578 /***********************************************************************
579 * FontStyleEnumProc32 [internal]
581 static INT WINAPI FontStyleEnumProc( const ENUMLOGFONTEXW *lpElfex,
582 const TEXTMETRICW *metrics, DWORD dwFontType, LPARAM lParam )
584 LPCFn_ENUMSTRUCT s=(LPCFn_ENUMSTRUCT)lParam;
587 HWND hDlg=GetParent(hcmb3);
588 return AddFontStyle( lpElfex, (const NEWTEXTMETRICEXW *) metrics,
589 dwFontType, s->lpcf32w, hcmb2, hcmb3, hDlg, FALSE);
592 /***********************************************************************
593 * CFn_WMInitDialog [internal]
595 LRESULT CFn_WMInitDialog(HWND hDlg, WPARAM wParam, LPARAM lParam,
603 HCURSOR hcursor=SetCursor(LoadCursorW(0,(LPWSTR)IDC_WAIT));
604 static const WCHAR strColorName[] = {'[','c','o','l','o','r',' ','n','a','m','e',']',0};
606 SetPropW(hDlg, strWineFontData, (HANDLE)lpcf);
607 lpxx=lpcf->lpLogFont;
608 TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
610 if (lpcf->lStructSize != sizeof(CHOOSEFONTW))
612 ERR("structure size failure !!!\n");
617 himlTT = ImageList_LoadImageW( COMDLG32_hInstance, MAKEINTRESOURCEW(38),
618 TTBITMAP_XSIZE, 0, CLR_DEFAULT, IMAGE_BITMAP, 0);
620 /* Set effect flags */
621 if((lpcf->Flags & CF_EFFECTS) && (lpcf->Flags & CF_INITTOLOGFONTSTRUCT))
623 if(lpxx->lfUnderline)
624 CheckDlgButton(hDlg, chx2, TRUE);
625 if(lpxx->lfStrikeOut)
626 CheckDlgButton(hDlg, chx1, TRUE);
629 if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow(lpcf->hwndOwner))
630 ShowWindow(GetDlgItem(hDlg,pshHelp),SW_HIDE);
631 if (!(lpcf->Flags & CF_APPLY))
632 ShowWindow(GetDlgItem(hDlg,psh3),SW_HIDE);
633 if (lpcf->Flags & CF_NOSCRIPTSEL)
634 EnableWindow(GetDlgItem(hDlg,cmb5),FALSE);
635 if (lpcf->Flags & CF_EFFECTS)
637 for (i=0;i<TEXT_COLORS;i++)
641 if( LoadStringW(COMDLG32_hInstance, IDS_COLOR_BLACK+i, name,
642 sizeof(name)/sizeof(*name) )==0 )
644 memcpy(name, strColorName, sizeof(strColorName));
646 j=SendDlgItemMessageW(hDlg, cmb4, CB_ADDSTRING, 0, (LPARAM)name);
647 SendDlgItemMessageW(hDlg, cmb4, CB_SETITEMDATA, j, textcolors[i]);
648 /* look for a fitting value in color combobox */
649 if (textcolors[i]==lpcf->rgbColors)
650 SendDlgItemMessageW(hDlg,cmb4, CB_SETCURSEL,j,0);
655 ShowWindow(GetDlgItem(hDlg,cmb4),SW_HIDE);
656 ShowWindow(GetDlgItem(hDlg,chx1),SW_HIDE);
657 ShowWindow(GetDlgItem(hDlg,chx2),SW_HIDE);
658 ShowWindow(GetDlgItem(hDlg,grp1),SW_HIDE);
659 ShowWindow(GetDlgItem(hDlg,stc4),SW_HIDE);
661 if(!(hdc = CFn_GetDC(lpcf)))
666 s.hWnd1=GetDlgItem(hDlg,cmb1);
671 elf.lfCharSet = DEFAULT_CHARSET; /* enum all charsets */
672 elf.lfPitchAndFamily = 0;
673 elf.lfFaceName[0] = '\0'; /* enum all fonts */
674 if (!EnumFontFamiliesExW(hdc, &elf, (FONTENUMPROCW)FontFamilyEnumProc, (LPARAM)&s, 0))
676 TRACE("EnumFontFamiliesEx returns 0\n");
680 if (lpcf->Flags & CF_FIXEDPITCHONLY) {
681 FIXME("No font found with fixed pitch only, dropping flag.\n");
682 lpcf->Flags &= ~CF_FIXEDPITCHONLY;
685 if (lpcf->Flags & CF_TTONLY) {
686 FIXME("No font found with truetype only, dropping flag.\n");
687 lpcf->Flags &= ~CF_TTONLY;
694 if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
696 /* look for fitting font name in combobox1 */
697 j=SendDlgItemMessageW(hDlg,cmb1,CB_FINDSTRING,-1,(LPARAM)lpxx->lfFaceName);
700 INT height = lpxx->lfHeight < 0 ? -lpxx->lfHeight :
703 int charset = lpxx->lfCharSet;
704 points = MulDiv( height, 72, GetDeviceCaps(hdc, LOGPIXELSY));
705 pstyle = MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:
706 FW_NORMAL,lpxx->lfItalic !=0);
707 SendDlgItemMessageW(hDlg, cmb1, CB_SETCURSEL, j, 0);
708 SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
709 (LPARAM)GetDlgItem(hDlg,cmb1));
711 /* look for fitting font style in combobox2 */
712 CFn_FitFontStyle(hDlg, pstyle);
713 /* look for fitting font size in combobox3 */
714 CFn_FitFontSize(hDlg, points);
715 CFn_FitCharSet( hDlg, charset );
720 SendDlgItemMessageW(hDlg,cmb1,CB_SETCURSEL,0,0);
721 SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
722 (LPARAM)GetDlgItem(hDlg,cmb1));
723 SendDlgItemMessageW(hDlg,cmb2,CB_SETCURSEL,0,0);
724 SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb2, CBN_SELCHANGE),
725 (LPARAM)GetDlgItem(hDlg,cmb1));
726 SendDlgItemMessageW(hDlg,cmb3,CB_SETCURSEL,0,0);
727 SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb3, CBN_SELCHANGE),
728 (LPARAM)GetDlgItem(hDlg,cmb3));
729 SendDlgItemMessageW(hDlg,cmb5,CB_SETCURSEL,0,0);
730 SendMessageW(hDlg, WM_COMMAND, MAKEWPARAM(cmb5, CBN_SELCHANGE),
731 (LPARAM)GetDlgItem(hDlg,cmb5));
733 if ((lpcf->Flags & CF_USESTYLE) && lpcf->lpszStyle)
735 j=SendDlgItemMessageW(hDlg,cmb2,CB_FINDSTRING,-1,(LPARAM)lpcf->lpszStyle);
738 j=SendDlgItemMessageW(hDlg,cmb2,CB_SETCURSEL,j,0);
739 SendMessageW(hDlg,WM_COMMAND,cmb2,
740 MAKELONG(HWND_16(GetDlgItem(hDlg,cmb2)),CBN_SELCHANGE));
743 CFn_ReleaseDC(lpcf, hdc);
749 /***********************************************************************
750 * CFn_WMMeasureItem [internal]
752 LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
757 LPMEASUREITEMSTRUCT lpmi=(LPMEASUREITEMSTRUCT)lParam;
761 himlTT = ImageList_LoadImageW( COMDLG32_hInstance, MAKEINTRESOURCEW(38),
762 TTBITMAP_XSIZE, 0, CLR_DEFAULT, IMAGE_BITMAP, 0);
763 ImageList_GetIconSize( himlTT, 0, &height);
764 lpmi->itemHeight = height + 2;
765 /* use MAX of bitmap height and tm.tmHeight .*/
768 hfontprev = SelectObject( hdc, GetStockObject( SYSTEM_FONT));
769 GetTextMetricsW(hdc, &tm);
770 if( tm.tmHeight > lpmi->itemHeight) lpmi->itemHeight = tm.tmHeight;
771 SelectObject(hdc, hfontprev);
772 ReleaseDC(hDlg, hdc);
777 /***********************************************************************
778 * CFn_WMDrawItem [internal]
780 LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
784 COLORREF cr, oldText=0, oldBk=0;
788 LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam;
790 if (lpdi->itemID == (UINT)-1) /* got no items */
791 DrawFocusRect(lpdi->hDC, &lpdi->rcItem);
794 if (lpdi->CtlType == ODT_COMBOBOX)
796 if (lpdi->itemState & ODS_SELECTED)
798 hBrush=GetSysColorBrush(COLOR_HIGHLIGHT);
799 oldText=SetTextColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
800 oldBk=SetBkColor(lpdi->hDC, GetSysColor(COLOR_HIGHLIGHT));
803 hBrush = SelectObject(lpdi->hDC, GetStockObject(LTGRAY_BRUSH));
804 SelectObject(lpdi->hDC, hBrush);
806 FillRect(lpdi->hDC, &lpdi->rcItem, hBrush);
809 return TRUE; /* this should never happen */
815 /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
816 SendMessageW(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
818 TextOutW(lpdi->hDC, lpdi->rcItem.left + TTBITMAP_XSIZE + 10,
819 lpdi->rcItem.top, buffer, lstrlenW(buffer));
820 nFontType = SendMessageW(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
822 if (nFontType & TRUETYPE_FONTTYPE) {
823 idx = 0; /* picture: TT */
824 if( nFontType & NTM_TT_OPENTYPE)
825 idx = 2; /* picture: O */
826 } else if( nFontType & NTM_PS_OPENTYPE)
827 idx = 3; /* picture: O+ps */
828 else if( nFontType & NTM_TYPE1)
829 idx = 4; /* picture: a */
830 else if( nFontType & DEVICE_FONTTYPE)
831 idx = 1; /* picture: printer */
833 ImageList_Draw( himlTT, idx, lpdi->hDC, lpdi->rcItem.left,
834 lpdi->rcItem.top, ILD_TRANSPARENT);
838 /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
840 SendMessageW(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
842 TextOutW(lpdi->hDC, lpdi->rcItem.left,
843 lpdi->rcItem.top, buffer, lstrlenW(buffer));
847 /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
848 SendMessageW(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
850 TextOutW(lpdi->hDC, lpdi->rcItem.left + 25+5,
851 lpdi->rcItem.top, buffer, lstrlenW(buffer));
852 cr = SendMessageW(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
853 hBrush = CreateSolidBrush(cr);
856 hBrush = SelectObject (lpdi->hDC, hBrush) ;
857 rect.right=rect.left+25;
861 Rectangle( lpdi->hDC, rect.left, rect.top,
862 rect.right, rect.bottom );
863 DeleteObject( SelectObject (lpdi->hDC, hBrush)) ;
870 return TRUE; /* this should never happen */
872 if (lpdi->itemState & ODS_SELECTED)
874 SetTextColor(lpdi->hDC, oldText);
875 SetBkColor(lpdi->hDC, oldBk);
881 /***********************************************************************
882 * CFn_WMCommand [internal]
884 LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam,
890 LPLOGFONTW lpxx=lpcf->lpLogFont;
892 TRACE("WM_COMMAND wParam=%08X lParam=%08lX\n", (LONG)wParam, lParam);
893 switch (LOWORD(wParam))
896 if (HIWORD(wParam)==CBN_SELCHANGE)
898 INT pointsize; /* save current pointsize */
899 LONG pstyle; /* save current style */
902 if(!(hdc = CFn_GetDC(lpcf)))
907 idx = SendDlgItemMessageW(hDlg, cmb3, CB_GETCURSEL, 0, 0);
908 pointsize = (int)SendDlgItemMessageW( hDlg, cmb3, CB_GETITEMDATA,
910 idx = SendDlgItemMessageW(hDlg, cmb2, CB_GETCURSEL, 0, 0);
911 pstyle = SendDlgItemMessageW(hDlg, cmb2, CB_GETITEMDATA, idx, 0);
912 idx = SendDlgItemMessageW(hDlg, cmb5, CB_GETCURSEL, 0, 0);
913 charset = SendDlgItemMessageW(hDlg, cmb5, CB_GETITEMDATA, idx, 0);
915 SendDlgItemMessageW(hDlg, cmb2, CB_RESETCONTENT, 0, 0);
916 SendDlgItemMessageW(hDlg, cmb3, CB_RESETCONTENT, 0, 0);
917 SendDlgItemMessageW(hDlg, cmb5, CB_RESETCONTENT, 0, 0);
918 i=SendDlgItemMessageW(hDlg, cmb1, CB_GETCURSEL, 0, 0);
921 HCURSOR hcursor=SetCursor(LoadCursorW(0,(LPWSTR)IDC_WAIT));
924 SendDlgItemMessageW(hDlg, cmb1, CB_GETLBTEXT, i,
925 (LPARAM)enumlf.lfFaceName);
926 TRACE("WM_COMMAND/cmb1 =>%s\n", debugstr_w(enumlf.lfFaceName));
927 s.hWnd1=GetDlgItem(hDlg, cmb2);
928 s.hWnd2=GetDlgItem(hDlg, cmb3);
930 enumlf.lfCharSet = DEFAULT_CHARSET; /* enum all charsets */
931 enumlf.lfPitchAndFamily = 0;
932 EnumFontFamiliesExW(hdc, &enumlf,
933 (FONTENUMPROCW)FontStyleEnumProc, (LPARAM)&s, 0);
934 CFn_FitFontStyle(hDlg, pstyle);
935 if( pointsize != CB_ERR) CFn_FitFontSize(hDlg, pointsize);
936 if( charset != CB_ERR) CFn_FitCharSet( hDlg, charset );
939 CFn_ReleaseDC(lpcf, hdc);
946 if (HIWORD(wParam)==CBN_SELCHANGE || HIWORD(wParam)== BN_CLICKED )
951 TRACE("WM_COMMAND/cmb2,3 =%08lX\n", lParam);
952 i=SendDlgItemMessageW(hDlg,cmb1,CB_GETCURSEL,0,0);
954 i=GetDlgItemTextW( hDlg, cmb1, str, 256 );
957 SendDlgItemMessageW(hDlg,cmb1,CB_GETLBTEXT,i,
959 l=SendDlgItemMessageW(hDlg,cmb1,CB_GETITEMDATA,i,0);
960 lpcf->nFontType = LOWORD(l);
961 /* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
962 /* same value reported to the EnumFonts
963 call back with the extra FONTTYPE_... bits added */
964 lpxx->lfPitchAndFamily = HIWORD(l) >> 8;
966 lstrcpyW(lpxx->lfFaceName,str);
967 i=SendDlgItemMessageW(hDlg, cmb2, CB_GETCURSEL, 0, 0);
970 l=SendDlgItemMessageW(hDlg, cmb2, CB_GETITEMDATA, i, 0);
971 if (0!=(lpxx->lfItalic=HIWORD(l)))
972 lpcf->nFontType |= ITALIC_FONTTYPE;
973 if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
974 lpcf->nFontType |= BOLD_FONTTYPE;
976 i=SendDlgItemMessageW(hDlg, cmb3, CB_GETCURSEL, 0, 0);
978 lpcf->iPointSize = 10 * LOWORD(SendDlgItemMessageW(hDlg, cmb3,
979 CB_GETITEMDATA , i, 0));
981 lpcf->iPointSize = 100;
982 hdc = CFn_GetDC(lpcf);
985 lpxx->lfHeight = - MulDiv( lpcf->iPointSize ,
986 GetDeviceCaps(hdc, LOGPIXELSY), 720);
987 CFn_ReleaseDC(lpcf, hdc);
989 lpxx->lfHeight = -lpcf->iPointSize / 10;
990 i=SendDlgItemMessageW(hDlg, cmb5, CB_GETCURSEL, 0, 0);
992 lpxx->lfCharSet=SendDlgItemMessageW(hDlg, cmb5, CB_GETITEMDATA, i, 0);
994 lpxx->lfCharSet = DEFAULT_CHARSET;
995 lpxx->lfStrikeOut=IsDlgButtonChecked(hDlg,chx1);
996 lpxx->lfUnderline=IsDlgButtonChecked(hDlg,chx2);
997 lpxx->lfWidth=lpxx->lfOrientation=lpxx->lfEscapement=0;
998 lpxx->lfOutPrecision=OUT_DEFAULT_PRECIS;
999 lpxx->lfClipPrecision=CLIP_DEFAULT_PRECIS;
1000 lpxx->lfQuality=DEFAULT_QUALITY;
1002 wininfo.cbSize=sizeof(wininfo);
1004 if( GetWindowInfo( GetDlgItem( hDlg, stc5), &wininfo ) )
1006 MapWindowPoints( 0, hDlg, (LPPOINT) &wininfo.rcWindow, 2);
1007 InvalidateRect( hDlg, &wininfo.rcWindow, TRUE );
1013 i=SendDlgItemMessageW(hDlg, cmb4, CB_GETCURSEL, 0, 0);
1018 lpcf->rgbColors = SendDlgItemMessageW(hDlg, cmb4, CB_GETITEMDATA, i, 0);
1019 wininfo.cbSize=sizeof(wininfo);
1021 if( GetWindowInfo( GetDlgItem( hDlg, stc5), &wininfo ) )
1023 MapWindowPoints( 0, hDlg, (LPPOINT) &wininfo.rcWindow, 2);
1024 InvalidateRect( hDlg, &wininfo.rcWindow, TRUE );
1030 i=RegisterWindowMessageW( HELPMSGSTRINGW );
1031 if (lpcf->hwndOwner)
1032 SendMessageW(lpcf->hwndOwner, i, 0, (LPARAM)GetPropW(hDlg, strWineFontData));
1033 /* if (CFn_HookCallChk(lpcf))
1034 CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);*/
1038 if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
1039 ( (lpcf->Flags & CF_LIMITSIZE) &&
1040 (lpcf->iPointSize >= 10 * lpcf->nSizeMin) &&
1041 (lpcf->iPointSize <= 10 * lpcf->nSizeMax)))
1042 EndDialog(hDlg, TRUE);
1047 LoadStringW(COMDLG32_hInstance, IDS_FONT_SIZE, format, sizeof(format)/sizeof(WCHAR));
1048 wsprintfW(buffer, format, lpcf->nSizeMin,lpcf->nSizeMax);
1049 MessageBoxW(hDlg, buffer, NULL, MB_OK);
1053 EndDialog(hDlg, FALSE);
1059 static LRESULT CFn_WMDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam, LPCHOOSEFONTW lpcfw)
1061 LPCHOOSEFONTA lpcfa;
1063 LPLOGFONTA lpLogFonta;
1066 lpcfa = GetPropW(hwnd, strWineFontData_a);
1067 lpLogFonta = lpcfa->lpLogFont;
1068 lpszStyle = lpcfa->lpszStyle;
1069 memcpy(lpcfa, lpcfw, sizeof(CHOOSEFONTA));
1070 lpcfa->lpLogFont = lpLogFonta;
1071 lpcfa->lpszStyle = lpszStyle;
1072 memcpy(lpcfa->lpLogFont, lpcfw->lpLogFont, sizeof(LOGFONTA));
1073 WideCharToMultiByte(CP_ACP, 0, lpcfw->lpLogFont->lfFaceName,
1074 LF_FACESIZE, lpcfa->lpLogFont->lfFaceName, LF_FACESIZE, 0, 0);
1076 if((lpcfw->Flags & CF_USESTYLE) && lpcfw->lpszStyle) {
1077 len = WideCharToMultiByte(CP_ACP, 0, lpcfw->lpszStyle, -1, NULL, -1, 0, 0);
1078 WideCharToMultiByte(CP_ACP, 0, lpcfw->lpszStyle, -1, lpcfa->lpszStyle, len, 0, 0);
1079 HeapFree(GetProcessHeap(), 0, lpcfw->lpszStyle);
1082 HeapFree(GetProcessHeap(), 0, lpcfw->lpLogFont);
1083 HeapFree(GetProcessHeap(), 0, lpcfw);
1084 SetPropW(hwnd, strWineFontData, 0);
1089 LRESULT CFn_WMPaint(HWND hDlg, WPARAM wParam, LPARAM lParam, const CHOOSEFONTW *lpcf)
1093 info.cbSize=sizeof(info);
1094 if( GetWindowInfo( GetDlgItem( hDlg, stc5), &info ) )
1100 LOGFONTW lf = *(lpcf->lpLogFont);
1102 MapWindowPoints( 0, hDlg, (LPPOINT) &info.rcWindow, 2);
1103 hdc = BeginPaint( hDlg, &ps );
1105 TRACE("erase %d, rect=(%d,%d)-(%d,%d)\n", ps.fErase,
1106 ps.rcPaint.left, ps.rcPaint.top,
1107 ps.rcPaint.right, ps.rcPaint.bottom);
1110 MoveToEx( hdc, info.rcWindow.left, info.rcWindow.bottom, NULL );
1111 hOrigPen=SelectObject( hdc, CreatePen( PS_SOLID, 2,
1112 GetSysColor( COLOR_3DSHADOW ) ));
1113 LineTo( hdc, info.rcWindow.left, info.rcWindow.top );
1114 LineTo( hdc, info.rcWindow.right, info.rcWindow.top );
1115 DeleteObject(SelectObject( hdc, CreatePen( PS_SOLID, 2,
1116 GetSysColor( COLOR_3DLIGHT ) )));
1117 LineTo( hdc, info.rcWindow.right, info.rcWindow.bottom );
1118 LineTo( hdc, info.rcWindow.left, info.rcWindow.bottom );
1119 DeleteObject(SelectObject( hdc, hOrigPen ));
1121 /* Draw the sample text itself */
1122 info.rcWindow.right--;
1123 info.rcWindow.bottom--;
1124 info.rcWindow.top++;
1125 info.rcWindow.left++;
1126 hOrigFont = SelectObject( hdc, CreateFontIndirectW( &lf ) );
1127 SetTextColor( hdc, lpcf->rgbColors );
1130 sample_lang_text[CHARSET_ORDER[lpcf->lpLogFont->lfCharSet]],
1131 -1, &info.rcWindow, DT_CENTER|DT_VCENTER|DT_SINGLELINE );
1133 DeleteObject(SelectObject( hdc, hOrigFont ));
1134 EndPaint( hDlg, &ps );
1139 /***********************************************************************
1140 * FormatCharDlgProcA [internal]
1142 INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam,
1145 LPCHOOSEFONTW lpcfw;
1146 LPCHOOSEFONTA lpcfa;
1147 INT_PTR res = FALSE;
1150 if (uMsg!=WM_INITDIALOG) {
1151 lpcfw = (LPCHOOSEFONTW)GetPropW(hDlg, strWineFontData);
1154 if (CFn_HookCallChk32(lpcfw))
1155 res=CallWindowProcA((WNDPROC)lpcfw->lpfnHook, hDlg, uMsg, wParam, lParam);
1159 lpcfa=(LPCHOOSEFONTA)lParam;
1160 SetPropW(hDlg, strWineFontData_a, (HANDLE)lParam);
1162 lpcfw = HeapAlloc(GetProcessHeap(), 0, sizeof(CHOOSEFONTW));
1163 memcpy(lpcfw, lpcfa, sizeof(CHOOSEFONTA));
1164 lpcfw->lpLogFont = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGFONTW));
1165 memcpy(lpcfw->lpLogFont, lpcfa->lpLogFont, sizeof(LOGFONTA));
1166 MultiByteToWideChar(CP_ACP, 0, lpcfa->lpLogFont->lfFaceName,
1167 LF_FACESIZE, lpcfw->lpLogFont->lfFaceName, LF_FACESIZE);
1169 if((lpcfa->Flags & CF_USESTYLE) && lpcfa->lpszStyle) {
1170 len = MultiByteToWideChar(CP_ACP, 0, lpcfa->lpszStyle, -1, NULL, 0);
1171 lpcfw->lpszStyle = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
1172 MultiByteToWideChar(CP_ACP, 0, lpcfa->lpszStyle, -1, lpcfw->lpszStyle, len);
1175 if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcfw))
1177 TRACE("CFn_WMInitDialog returned FALSE\n");
1180 if (CFn_HookCallChk32(lpcfw))
1181 return CallWindowProcA((WNDPROC)lpcfa->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
1185 case WM_MEASUREITEM:
1186 return CFn_WMMeasureItem(hDlg, wParam, lParam);
1188 return CFn_WMDrawItem(hDlg, wParam, lParam);
1190 return CFn_WMCommand(hDlg, wParam, lParam, lpcfw);
1192 return CFn_WMDestroy(hDlg, wParam, lParam, lpcfw);
1193 case WM_CHOOSEFONT_GETLOGFONT:
1194 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam);
1195 FIXME("current logfont back to caller\n");
1198 return CFn_WMPaint(hDlg, wParam, lParam, lpcfw);
1203 /***********************************************************************
1204 * FormatCharDlgProcW [internal]
1206 INT_PTR CALLBACK FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam,
1210 INT_PTR res = FALSE;
1212 if (uMsg!=WM_INITDIALOG)
1214 lpcf=(LPCHOOSEFONTW)GetPropW(hDlg, strWineFontData);
1217 if (CFn_HookCallChk32(lpcf))
1218 res=CallWindowProcW((WNDPROC)lpcf->lpfnHook, hDlg, uMsg, wParam, lParam);
1224 lpcf=(LPCHOOSEFONTW)lParam;
1225 if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf))
1227 TRACE("CFn_WMInitDialog returned FALSE\n");
1230 if (CFn_HookCallChk32(lpcf))
1231 return CallWindowProcW((WNDPROC)lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
1235 case WM_MEASUREITEM:
1236 return CFn_WMMeasureItem(hDlg, wParam, lParam);
1238 return CFn_WMDrawItem(hDlg, wParam, lParam);
1240 return CFn_WMCommand(hDlg, wParam, lParam, lpcf);
1243 case WM_CHOOSEFONT_GETLOGFONT:
1244 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam);
1245 FIXME("current logfont back to caller\n");
1248 return CFn_WMPaint(hDlg, wParam, lParam, lpcf);