8237f1edae9b4744c387b11d64487c11154dcfcb
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 INT_PTR CALLBACK
FormatCharDlgProcA(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
51 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
*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 BOOL WINAPI
ChooseFontW(LPCHOOSEFONTW lpChFont
)
171 TRACE("(%p)\n", lpChFont
);
173 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATEHANDLE
)!=0 )
175 template=(LPCVOID
)lpChFont
->hInstance
;
178 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATE
)!=0 )
180 hDlginst
=lpChFont
->hInstance
;
181 if( !(hResInfo
= FindResourceW(hDlginst
, lpChFont
->lpTemplateName
,
184 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
189 hDlginst
=COMDLG32_hInstance
;
190 if (!(hResInfo
= FindResourceW(hDlginst
, chooseFontW
, (LPWSTR
)RT_DIALOG
)))
192 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
196 if (!(hDlgTmpl
= LoadResource(hDlginst
, hResInfo
)) ||
197 !(template = LockResource( hDlgTmpl
)))
199 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE
);
203 if (TRACE_ON(commdlg
))
204 _dump_cf_flags(lpChFont
->Flags
);
206 if (lpChFont
->Flags
& (CF_SELECTSCRIPT
| CF_NOVERTFONTS
))
207 FIXME(": unimplemented flag (ignored)\n");
209 return DialogBoxIndirectParamW(COMDLG32_hInstance
, template,
210 lpChFont
->hwndOwner
, FormatCharDlgProcW
, (LPARAM
)lpChFont
);
213 /***********************************************************************
214 * ChooseFontA (COMDLG32.@)
216 BOOL WINAPI
ChooseFontA(LPCHOOSEFONTA lpChFont
)
223 TRACE("(%p)\n", lpChFont
);
225 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATEHANDLE
)!=0 )
227 template=(LPCVOID
)lpChFont
->hInstance
;
230 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATE
)!=0 )
232 hDlginst
=lpChFont
->hInstance
;
233 if( !(hResInfo
= FindResourceA(hDlginst
, lpChFont
->lpTemplateName
,
236 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
241 hDlginst
=COMDLG32_hInstance
;
242 if (!(hResInfo
= FindResourceW(hDlginst
, chooseFontW
, (LPWSTR
)RT_DIALOG
)))
244 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
248 if (!(hDlgTmpl
= LoadResource(hDlginst
, hResInfo
)) ||
249 !(template = LockResource( hDlgTmpl
)))
251 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE
);
255 if (TRACE_ON(commdlg
))
256 _dump_cf_flags(lpChFont
->Flags
);
257 if (lpChFont
->Flags
& (CF_SELECTSCRIPT
| CF_NOVERTFONTS
))
258 FIXME(": unimplemented flag (ignored)\n");
260 return DialogBoxIndirectParamA(COMDLG32_hInstance
, template,
261 lpChFont
->hwndOwner
, FormatCharDlgProcA
, (LPARAM
)lpChFont
);
264 #define TEXT_EXTRAS 4
265 #define TEXT_COLORS 16
267 static const COLORREF textcolors
[TEXT_COLORS
]=
269 0x00000000L
,0x00000080L
,0x00008000L
,0x00008080L
,
270 0x00800000L
,0x00800080L
,0x00808000L
,0x00808080L
,
271 0x00c0c0c0L
,0x000000ffL
,0x0000ff00L
,0x0000ffffL
,
272 0x00ff0000L
,0x00ff00ffL
,0x00ffff00L
,0x00FFFFFFL
275 /***********************************************************************
276 * CFn_HookCallChk32 [internal]
278 static BOOL
CFn_HookCallChk32(LPCHOOSEFONTW lpcf
)
281 if(lpcf
->Flags
& CF_ENABLEHOOK
)
287 /*************************************************************************
288 * AddFontFamily [internal]
290 INT
AddFontFamily(const ENUMLOGFONTEXW
*lpElfex
, const NEWTEXTMETRICEXW
*lpNTM
,
291 UINT nFontType
, LPCHOOSEFONTW lpcf
, HWND hwnd
, LPCFn_ENUMSTRUCT e
)
295 const LOGFONTW
*lplf
= &(lpElfex
->elfLogFont
);
297 TRACE("font=%s (nFontType=%d)\n", debugstr_w(lplf
->lfFaceName
), nFontType
);
299 if (lpcf
->Flags
& CF_FIXEDPITCHONLY
)
300 if (!(lplf
->lfPitchAndFamily
& FIXED_PITCH
))
302 if (lpcf
->Flags
& CF_ANSIONLY
)
303 if (lplf
->lfCharSet
!= ANSI_CHARSET
)
305 if (lpcf
->Flags
& CF_TTONLY
)
306 if (!(nFontType
& TRUETYPE_FONTTYPE
))
311 i
=SendMessageW(hwnd
, CB_FINDSTRINGEXACT
, 0, (LPARAM
)lplf
->lfFaceName
);
313 i
= SendMessageW(hwnd
, CB_ADDSTRING
, 0, (LPARAM
)lplf
->lfFaceName
);
315 /* store some important font information */
316 w
= (lplf
->lfPitchAndFamily
) << 8 |
317 (HIWORD(lpNTM
->ntmTm
.ntmFlags
) & 0xff);
318 SendMessageW(hwnd
, CB_SETITEMDATA
, i
, MAKELONG(nFontType
,w
));
324 /*************************************************************************
325 * FontFamilyEnumProc32 [internal]
327 static INT WINAPI
FontFamilyEnumProc(const ENUMLOGFONTEXW
*lpElfex
,
328 const TEXTMETRICW
*metrics
, DWORD dwFontType
, LPARAM lParam
)
331 e
=(LPCFn_ENUMSTRUCT
)lParam
;
332 return AddFontFamily( lpElfex
, (NEWTEXTMETRICEXW
*) metrics
,
333 dwFontType
, e
->lpcf32w
, e
->hWnd1
, e
);
336 /*************************************************************************
337 * SetFontStylesToCombo2 [internal]
339 * Fill font style information into combobox (without using font.c directly)
341 static int SetFontStylesToCombo2(HWND hwnd
, HDC hdc
, const LOGFONTW
*lplf
)
350 static const WCHAR strRegular
[] = {'R','e','g','u','l','a','r',0};
351 static const WCHAR strItalic
[] = {'I','t','a','l','i','c',0};
352 static const WCHAR strBold
[] = {'B','o','l','d',0};
353 static const WCHAR strBoldItalic
[] = {'B','o','l','d',' ','I','t','a','l','i','c',0};
354 static const struct FONTSTYLE fontstyles
[FSTYLES
]={
355 { 0, FW_NORMAL
, strRegular
},
356 { 1, FW_NORMAL
, strItalic
},
357 { 0, FW_BOLD
, strBold
},
358 { 1, FW_BOLD
, strBoldItalic
}
365 memcpy(&lf
, lplf
, sizeof(LOGFONTW
));
367 for (i
=0;i
<FSTYLES
;i
++)
369 lf
.lfItalic
=fontstyles
[i
].italic
;
370 lf
.lfWeight
=fontstyles
[i
].weight
;
371 hf
=CreateFontIndirectW(&lf
);
372 hf
=SelectObject(hdc
,hf
);
373 GetTextMetricsW(hdc
,&tm
);
374 hf
=SelectObject(hdc
,hf
);
376 /* font successful created ? */
377 if (tm
.tmWeight
==fontstyles
[i
].weight
&&
378 ((tm
.tmItalic
!= 0)==fontstyles
[i
].italic
))
380 j
=SendMessageW(hwnd
,CB_ADDSTRING
,0,(LPARAM
)fontstyles
[i
].stname
);
381 if (j
==CB_ERR
) return 1;
382 j
=SendMessageW(hwnd
, CB_SETITEMDATA
, j
,
383 MAKELONG(fontstyles
[i
].weight
,fontstyles
[i
].italic
));
384 if (j
==CB_ERR
) return 1;
390 /*************************************************************************
391 * AddFontSizeToCombo3 [internal]
393 static int AddFontSizeToCombo3(HWND hwnd
, UINT h
, LPCHOOSEFONTW lpcf
)
397 static const WCHAR strFormat
[] = {'%','2','d',0};
399 if ( (!(lpcf
->Flags
& CF_LIMITSIZE
)) ||
400 ((lpcf
->Flags
& CF_LIMITSIZE
) && (h
>= lpcf
->nSizeMin
) && (h
<= lpcf
->nSizeMax
)))
402 wsprintfW(buffer
, strFormat
, h
);
403 j
=SendMessageW(hwnd
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)buffer
);
406 j
=SendMessageW(hwnd
, CB_ADDSTRING
, 0, (LPARAM
)buffer
);
407 if (j
!=CB_ERR
) j
= SendMessageW(hwnd
, CB_SETITEMDATA
, j
, h
);
408 if (j
==CB_ERR
) return 1;
414 /*************************************************************************
415 * SetFontSizesToCombo3 [internal]
417 static int SetFontSizesToCombo3(HWND hwnd
, LPCHOOSEFONTW lpcf
)
419 static const BYTE sizes
[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
422 for (i
= 0; i
< sizeof(sizes
)/sizeof(sizes
[0]); i
++)
423 if (AddFontSizeToCombo3(hwnd
, sizes
[i
], lpcf
)) return 1;
427 /*************************************************************************
428 * CFn_GetDC [internal]
430 inline HDC
CFn_GetDC(LPCHOOSEFONTW lpcf
)
432 HDC ret
= ((lpcf
->Flags
& CF_PRINTERFONTS
) && lpcf
->hDC
) ?
435 if(!ret
) ERR("HDC failure!!!\n");
439 /*************************************************************************
440 * CFn_ReleaseDC [internal]
442 inline void CFn_ReleaseDC(LPCHOOSEFONTW lpcf
, HDC hdc
)
444 if(!((lpcf
->Flags
& CF_PRINTERFONTS
) && lpcf
->hDC
))
448 /***********************************************************************
449 * AddFontStyle [internal]
451 INT
AddFontStyle( const ENUMLOGFONTEXW
*lpElfex
, const NEWTEXTMETRICEXW
*lpNTM
,
452 UINT nFontType
, LPCHOOSEFONTW lpcf
, HWND hcmb2
, HWND hcmb3
,
453 HWND hDlg
, BOOL iswin16
)
456 const LOGFONTW
*lplf
= &(lpElfex
->elfLogFont
);
460 TRACE("(nFontType=%d)\n",nFontType
);
461 TRACE(" %s h=%ld w=%ld e=%ld o=%ld wg=%ld i=%d u=%d s=%d"
462 " ch=%d op=%d cp=%d q=%d pf=%xh\n",
463 debugstr_w(lplf
->lfFaceName
),lplf
->lfHeight
,lplf
->lfWidth
,
464 lplf
->lfEscapement
,lplf
->lfOrientation
,
465 lplf
->lfWeight
,lplf
->lfItalic
,lplf
->lfUnderline
,
466 lplf
->lfStrikeOut
,lplf
->lfCharSet
, lplf
->lfOutPrecision
,
467 lplf
->lfClipPrecision
,lplf
->lfQuality
, lplf
->lfPitchAndFamily
);
468 if (nFontType
& RASTER_FONTTYPE
)
471 if(!(hdc
= CFn_GetDC(lpcf
))) return 0;
472 points
= MulDiv( lpNTM
->ntmTm
.tmHeight
- lpNTM
->ntmTm
.tmInternalLeading
,
473 72, GetDeviceCaps(hdc
, LOGPIXELSY
));
474 CFn_ReleaseDC(lpcf
, hdc
);
475 i
= AddFontSizeToCombo3(hcmb3
, points
, lpcf
);
477 } else if (SetFontSizesToCombo3(hcmb3
, lpcf
)) return 0;
479 if (!SendMessageW(hcmb2
, CB_GETCOUNT
, 0, 0))
481 if(!(hdc
= CFn_GetDC(lpcf
))) return 0;
482 i
=SetFontStylesToCombo2(hcmb2
,hdc
,lplf
);
483 CFn_ReleaseDC(lpcf
, hdc
);
487 if( iswin16
|| !( hcmb5
= GetDlgItem(hDlg
, cmb5
))) return 1;
488 i
= SendMessageW( hcmb5
, CB_FINDSTRINGEXACT
, 0,
489 (LPARAM
)lpElfex
->elfScript
);
491 i
= SendMessageW( hcmb5
, CB_ADDSTRING
, 0,
492 (LPARAM
)lpElfex
->elfScript
);
494 SendMessageW( hcmb5
, CB_SETITEMDATA
, i
, lplf
->lfCharSet
);
499 static INT
CFn_FitFontSize( HWND hDlg
, int points
)
503 /* look for fitting font size in combobox3 */
504 n
=SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCOUNT
, 0, 0);
507 if (points
== (int)SendDlgItemMessageW
508 (hDlg
,cmb3
, CB_GETITEMDATA
,i
,0))
510 SendDlgItemMessageW(hDlg
,cmb3
,CB_SETCURSEL
,i
,0);
511 SendMessageW(hDlg
, WM_COMMAND
,
512 MAKEWPARAM(cmb3
, CBN_SELCHANGE
),
513 (LPARAM
)GetDlgItem(hDlg
,cmb3
));
521 static INT
CFn_FitFontStyle( HWND hDlg
, LONG packedstyle
)
525 /* look for fitting font style in combobox2 */
526 for (i
=0;i
<TEXT_EXTRAS
;i
++)
528 id
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, i
, 0);
529 if (packedstyle
== id
)
531 SendDlgItemMessageW(hDlg
, cmb2
, CB_SETCURSEL
, i
, 0);
532 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb2
, CBN_SELCHANGE
),
533 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
542 static INT
CFn_FitCharSet( HWND hDlg
, int charset
)
545 /* look for fitting char set in combobox5 */
546 n
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCOUNT
, 0, 0);
549 cs
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, i
, 0);
552 SendDlgItemMessageW(hDlg
, cmb5
, CB_SETCURSEL
, i
, 0);
553 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
554 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
558 /* no charset fits: select the first one in the list */
559 SendDlgItemMessageW(hDlg
, cmb5
, CB_SETCURSEL
, 0, 0);
560 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
561 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
565 /***********************************************************************
566 * FontStyleEnumProc32 [internal]
568 static INT WINAPI
FontStyleEnumProc( const ENUMLOGFONTEXW
*lpElfex
,
569 const TEXTMETRICW
*metrics
, DWORD dwFontType
, LPARAM lParam
)
571 LPCFn_ENUMSTRUCT s
=(LPCFn_ENUMSTRUCT
)lParam
;
574 HWND hDlg
=GetParent(hcmb3
);
575 return AddFontStyle( lpElfex
, (const NEWTEXTMETRICEXW
*) metrics
,
576 dwFontType
, s
->lpcf32w
, hcmb2
, hcmb3
, hDlg
, FALSE
);
579 /***********************************************************************
580 * CFn_WMInitDialog [internal]
582 LRESULT
CFn_WMInitDialog(HWND hDlg
, WPARAM wParam
, LPARAM lParam
,
590 HCURSOR hcursor
=SetCursor(LoadCursorW(0,(LPWSTR
)IDC_WAIT
));
591 static const WCHAR strColorName
[] = {'[','c','o','l','o','r',' ','n','a','m','e',']',0};
593 SetPropW(hDlg
, strWineFontData
, (HANDLE
)lpcf
);
594 lpxx
=lpcf
->lpLogFont
;
595 TRACE("WM_INITDIALOG lParam=%08lX\n", lParam
);
597 if (lpcf
->lStructSize
!= sizeof(CHOOSEFONTW
))
599 ERR("structure size failure !!!\n");
604 himlTT
= ImageList_LoadImageW( COMDLG32_hInstance
, MAKEINTRESOURCEW(38),
605 TTBITMAP_XSIZE
, 0, CLR_DEFAULT
, IMAGE_BITMAP
, 0);
607 if (!(lpcf
->Flags
& CF_SHOWHELP
) || !IsWindow(lpcf
->hwndOwner
))
608 ShowWindow(GetDlgItem(hDlg
,pshHelp
),SW_HIDE
);
609 if (!(lpcf
->Flags
& CF_APPLY
))
610 ShowWindow(GetDlgItem(hDlg
,psh3
),SW_HIDE
);
611 if (lpcf
->Flags
& CF_EFFECTS
)
613 for (i
=0;i
<TEXT_COLORS
;i
++)
617 if( LoadStringW(COMDLG32_hInstance
, IDS_COLOR_BLACK
+i
, name
,
618 sizeof(name
)/sizeof(*name
) )==0 )
620 memcpy(name
, strColorName
, sizeof(strColorName
));
622 j
=SendDlgItemMessageW(hDlg
, cmb4
, CB_ADDSTRING
, 0, (LPARAM
)name
);
623 SendDlgItemMessageW(hDlg
, cmb4
, CB_SETITEMDATA
, j
, textcolors
[j
]);
624 /* look for a fitting value in color combobox */
625 if (textcolors
[j
]==lpcf
->rgbColors
)
626 SendDlgItemMessageW(hDlg
,cmb4
, CB_SETCURSEL
,j
,0);
631 ShowWindow(GetDlgItem(hDlg
,cmb4
),SW_HIDE
);
632 ShowWindow(GetDlgItem(hDlg
,chx1
),SW_HIDE
);
633 ShowWindow(GetDlgItem(hDlg
,chx2
),SW_HIDE
);
634 ShowWindow(GetDlgItem(hDlg
,grp1
),SW_HIDE
);
635 ShowWindow(GetDlgItem(hDlg
,stc4
),SW_HIDE
);
637 if(!(hdc
= CFn_GetDC(lpcf
)))
642 s
.hWnd1
=GetDlgItem(hDlg
,cmb1
);
647 elf
.lfCharSet
= DEFAULT_CHARSET
; /* enum all charsets */
648 elf
.lfPitchAndFamily
= 0;
649 elf
.lfFaceName
[0] = '\0'; /* enum all fonts */
650 if (!EnumFontFamiliesExW(hdc
, &elf
, (FONTENUMPROCW
)FontFamilyEnumProc
, (LPARAM
)&s
, 0))
652 TRACE("EnumFontFamiliesEx returns 0\n");
656 if (lpcf
->Flags
& CF_FIXEDPITCHONLY
) {
657 FIXME("No font found with fixed pitch only, dropping flag.\n");
658 lpcf
->Flags
&= ~CF_FIXEDPITCHONLY
;
661 if (lpcf
->Flags
& CF_TTONLY
) {
662 FIXME("No font found with truetype only, dropping flag.\n");
663 lpcf
->Flags
&= ~CF_TTONLY
;
670 if (lpcf
->Flags
& CF_INITTOLOGFONTSTRUCT
)
672 /* look for fitting font name in combobox1 */
673 j
=SendDlgItemMessageW(hDlg
,cmb1
,CB_FINDSTRING
,-1,(LONG
)lpxx
->lfFaceName
);
676 INT height
= lpxx
->lfHeight
< 0 ? -lpxx
->lfHeight
:
679 int charset
= lpxx
->lfCharSet
;
680 points
= MulDiv( height
, 72, GetDeviceCaps(hdc
, LOGPIXELSY
));
681 pstyle
= MAKELONG(lpxx
->lfWeight
> FW_MEDIUM
? FW_BOLD
:
682 FW_NORMAL
,lpxx
->lfItalic
!=0);
683 SendDlgItemMessageW(hDlg
, cmb1
, CB_SETCURSEL
, j
, 0);
684 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb1
, CBN_SELCHANGE
),
685 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
687 /* look for fitting font style in combobox2 */
688 CFn_FitFontStyle(hDlg
, pstyle
);
689 /* look for fitting font size in combobox3 */
690 CFn_FitFontSize(hDlg
, points
);
691 CFn_FitCharSet( hDlg
, charset
);
696 SendDlgItemMessageW(hDlg
,cmb1
,CB_SETCURSEL
,0,0);
697 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb1
, CBN_SELCHANGE
),
698 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
700 if ((lpcf
->Flags
& CF_USESTYLE
) && lpcf
->lpszStyle
)
702 j
=SendDlgItemMessageW(hDlg
,cmb2
,CB_FINDSTRING
,-1,(LONG
)lpcf
->lpszStyle
);
705 j
=SendDlgItemMessageW(hDlg
,cmb2
,CB_SETCURSEL
,j
,0);
706 SendMessageW(hDlg
,WM_COMMAND
,cmb2
,
707 MAKELONG(HWND_16(GetDlgItem(hDlg
,cmb2
)),CBN_SELCHANGE
));
710 CFn_ReleaseDC(lpcf
, hdc
);
716 /***********************************************************************
717 * CFn_WMMeasureItem [internal]
719 LRESULT
CFn_WMMeasureItem(HWND hDlg
, WPARAM wParam
, LPARAM lParam
)
724 LPMEASUREITEMSTRUCT lpmi
=(LPMEASUREITEMSTRUCT
)lParam
;
726 himlTT
= ImageList_LoadImageW( COMDLG32_hInstance
, MAKEINTRESOURCEW(38),
727 TTBITMAP_XSIZE
, 0, CLR_DEFAULT
, IMAGE_BITMAP
, 0);
728 ImageList_GetIconSize( himlTT
, 0, &lpmi
->itemHeight
);
729 lpmi
->itemHeight
+= 2;
730 /* use MAX of bitmap height and tm.tmHeight .*/
733 hfontprev
= SelectObject( hdc
, GetStockObject( SYSTEM_FONT
));
734 GetTextMetricsW(hdc
, &tm
);
735 if( tm
.tmHeight
> lpmi
->itemHeight
) lpmi
->itemHeight
= tm
.tmHeight
;
736 SelectObject(hdc
, hfontprev
);
737 ReleaseDC(hDlg
, hdc
);
742 /***********************************************************************
743 * CFn_WMDrawItem [internal]
745 LRESULT
CFn_WMDrawItem(HWND hDlg
, WPARAM wParam
, LPARAM lParam
)
749 COLORREF cr
, oldText
=0, oldBk
=0;
753 LPDRAWITEMSTRUCT lpdi
= (LPDRAWITEMSTRUCT
)lParam
;
755 if (lpdi
->itemID
== (UINT
)-1) /* got no items */
756 DrawFocusRect(lpdi
->hDC
, &lpdi
->rcItem
);
759 if (lpdi
->CtlType
== ODT_COMBOBOX
)
761 if (lpdi
->itemState
& ODS_SELECTED
)
763 hBrush
=GetSysColorBrush(COLOR_HIGHLIGHT
);
764 oldText
=SetTextColor(lpdi
->hDC
, GetSysColor(COLOR_HIGHLIGHTTEXT
));
765 oldBk
=SetBkColor(lpdi
->hDC
, GetSysColor(COLOR_HIGHLIGHT
));
768 hBrush
= SelectObject(lpdi
->hDC
, GetStockObject(LTGRAY_BRUSH
));
769 SelectObject(lpdi
->hDC
, hBrush
);
771 FillRect(lpdi
->hDC
, &lpdi
->rcItem
, hBrush
);
774 return TRUE
; /* this should never happen */
780 /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
781 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
783 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
+ TTBITMAP_XSIZE
+ 10,
784 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
785 nFontType
= SendMessageW(lpdi
->hwndItem
, CB_GETITEMDATA
, lpdi
->itemID
,0L);
787 if (nFontType
& TRUETYPE_FONTTYPE
) {
788 idx
= 0; /* picture: TT */
789 if( nFontType
& NTM_TT_OPENTYPE
)
790 idx
= 2; /* picture: O */
791 } else if( nFontType
& NTM_PS_OPENTYPE
)
792 idx
= 3; /* picture: O+ps */
793 else if( nFontType
& NTM_TYPE1
)
794 idx
= 4; /* picture: a */
795 else if( nFontType
& DEVICE_FONTTYPE
)
796 idx
= 1; /* picture: printer */
798 ImageList_Draw( himlTT
, idx
, lpdi
->hDC
, lpdi
->rcItem
.left
,
799 lpdi
->rcItem
.top
, ILD_TRANSPARENT
);
803 /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
805 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
807 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
,
808 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
812 /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
813 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
815 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
+ 25+5,
816 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
817 cr
= SendMessageW(lpdi
->hwndItem
, CB_GETITEMDATA
, lpdi
->itemID
,0L);
818 hBrush
= CreateSolidBrush(cr
);
821 hBrush
= SelectObject (lpdi
->hDC
, hBrush
) ;
822 rect
.right
=rect
.left
+25;
826 Rectangle( lpdi
->hDC
, rect
.left
, rect
.top
,
827 rect
.right
, rect
.bottom
);
828 DeleteObject( SelectObject (lpdi
->hDC
, hBrush
)) ;
835 return TRUE
; /* this should never happen */
837 if (lpdi
->itemState
& ODS_SELECTED
)
839 SetTextColor(lpdi
->hDC
, oldText
);
840 SetBkColor(lpdi
->hDC
, oldBk
);
846 /***********************************************************************
847 * CFn_WMCommand [internal]
849 LRESULT
CFn_WMCommand(HWND hDlg
, WPARAM wParam
, LPARAM lParam
,
855 LPLOGFONTW lpxx
=lpcf
->lpLogFont
;
857 TRACE("WM_COMMAND wParam=%08lX lParam=%08lX\n", (LONG
)wParam
, lParam
);
858 switch (LOWORD(wParam
))
861 if (HIWORD(wParam
)==CBN_SELCHANGE
)
863 INT pointsize
; /* save current pointsize */
864 LONG pstyle
; /* save current style */
867 if(!(hdc
= CFn_GetDC(lpcf
)))
872 idx
= SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCURSEL
, 0, 0);
873 pointsize
= (int)SendDlgItemMessageW( hDlg
, cmb3
, CB_GETITEMDATA
,
875 idx
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETCURSEL
, 0, 0);
876 pstyle
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, idx
, 0);
877 idx
= SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCURSEL
, 0, 0);
878 charset
= SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, idx
, 0);
880 SendDlgItemMessageW(hDlg
, cmb2
, CB_RESETCONTENT
, 0, 0);
881 SendDlgItemMessageW(hDlg
, cmb3
, CB_RESETCONTENT
, 0, 0);
882 SendDlgItemMessageW(hDlg
, cmb5
, CB_RESETCONTENT
, 0, 0);
883 i
=SendDlgItemMessageW(hDlg
, cmb1
, CB_GETCURSEL
, 0, 0);
886 HCURSOR hcursor
=SetCursor(LoadCursorW(0,(LPWSTR
)IDC_WAIT
));
889 SendDlgItemMessageW(hDlg
, cmb1
, CB_GETLBTEXT
, i
,
890 (LPARAM
)enumlf
.lfFaceName
);
891 TRACE("WM_COMMAND/cmb1 =>%s\n", debugstr_w(enumlf
.lfFaceName
));
892 s
.hWnd1
=GetDlgItem(hDlg
, cmb2
);
893 s
.hWnd2
=GetDlgItem(hDlg
, cmb3
);
895 enumlf
.lfCharSet
= DEFAULT_CHARSET
; /* enum all charsets */
896 enumlf
.lfPitchAndFamily
= 0;
897 EnumFontFamiliesExW(hdc
, &enumlf
,
898 (FONTENUMPROCW
)FontStyleEnumProc
, (LPARAM
)&s
, 0);
899 CFn_FitFontStyle(hDlg
, pstyle
);
900 if( pointsize
!= CB_ERR
) CFn_FitFontSize(hDlg
, pointsize
);
901 if( charset
!= CB_ERR
) CFn_FitCharSet( hDlg
, charset
);
904 CFn_ReleaseDC(lpcf
, hdc
);
911 if (HIWORD(wParam
)==CBN_SELCHANGE
|| HIWORD(wParam
)== BN_CLICKED
)
916 TRACE("WM_COMMAND/cmb2,3 =%08lX\n", lParam
);
917 i
=SendDlgItemMessageW(hDlg
,cmb1
,CB_GETCURSEL
,0,0);
919 i
=GetDlgItemTextW( hDlg
, cmb1
, str
, 256 );
922 SendDlgItemMessageW(hDlg
,cmb1
,CB_GETLBTEXT
,i
,
924 l
=SendDlgItemMessageW(hDlg
,cmb1
,CB_GETITEMDATA
,i
,0);
925 lpcf
->nFontType
= LOWORD(l
);
926 /* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
927 /* same value reported to the EnumFonts
928 call back with the extra FONTTYPE_... bits added */
929 lpxx
->lfPitchAndFamily
= HIWORD(l
) >> 8;
931 lstrcpyW(lpxx
->lfFaceName
,str
);
932 i
=SendDlgItemMessageW(hDlg
, cmb2
, CB_GETCURSEL
, 0, 0);
935 l
=SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, i
, 0);
936 if (0!=(lpxx
->lfItalic
=HIWORD(l
)))
937 lpcf
->nFontType
|= ITALIC_FONTTYPE
;
938 if ((lpxx
->lfWeight
=LOWORD(l
)) > FW_MEDIUM
)
939 lpcf
->nFontType
|= BOLD_FONTTYPE
;
941 i
=SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCURSEL
, 0, 0);
943 lpcf
->iPointSize
= 10 * LOWORD(SendDlgItemMessageW(hDlg
, cmb3
,
944 CB_GETITEMDATA
, i
, 0));
946 lpcf
->iPointSize
= 100;
947 hdc
= CFn_GetDC(lpcf
);
950 lpxx
->lfHeight
= - MulDiv( lpcf
->iPointSize
,
951 GetDeviceCaps(hdc
, LOGPIXELSY
), 720);
952 CFn_ReleaseDC(lpcf
, hdc
);
954 lpxx
->lfHeight
= -lpcf
->iPointSize
/ 10;
955 i
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCURSEL
, 0, 0);
957 lpxx
->lfCharSet
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, i
, 0);
959 lpxx
->lfCharSet
= DEFAULT_CHARSET
;
960 lpxx
->lfStrikeOut
=IsDlgButtonChecked(hDlg
,chx1
);
961 lpxx
->lfUnderline
=IsDlgButtonChecked(hDlg
,chx2
);
962 lpxx
->lfWidth
=lpxx
->lfOrientation
=lpxx
->lfEscapement
=0;
963 lpxx
->lfOutPrecision
=OUT_DEFAULT_PRECIS
;
964 lpxx
->lfClipPrecision
=CLIP_DEFAULT_PRECIS
;
965 lpxx
->lfQuality
=DEFAULT_QUALITY
;
967 wininfo
.cbSize
=sizeof(wininfo
);
969 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &wininfo
) )
971 MapWindowPoints( 0, hDlg
, (LPPOINT
) &wininfo
.rcWindow
, 2);
972 InvalidateRect( hDlg
, &wininfo
.rcWindow
, TRUE
);
978 i
=SendDlgItemMessageW(hDlg
, cmb4
, CB_GETCURSEL
, 0, 0);
983 lpcf
->rgbColors
=textcolors
[i
];
984 wininfo
.cbSize
=sizeof(wininfo
);
986 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &wininfo
) )
988 MapWindowPoints( 0, hDlg
, (LPPOINT
) &wininfo
.rcWindow
, 2);
989 InvalidateRect( hDlg
, &wininfo
.rcWindow
, TRUE
);
995 i
=RegisterWindowMessageW( HELPMSGSTRINGW
);
997 SendMessageW(lpcf
->hwndOwner
, i
, 0, (LPARAM
)GetPropW(hDlg
, strWineFontData
));
998 /* if (CFn_HookCallChk(lpcf))
999 CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);*/
1003 if ( (!(lpcf
->Flags
& CF_LIMITSIZE
)) ||
1004 ( (lpcf
->Flags
& CF_LIMITSIZE
) &&
1005 (lpcf
->iPointSize
>= 10 * lpcf
->nSizeMin
) &&
1006 (lpcf
->iPointSize
<= 10 * lpcf
->nSizeMax
)))
1007 EndDialog(hDlg
, TRUE
);
1012 LoadStringW(COMDLG32_hInstance
, IDS_FONT_SIZE
, format
, sizeof(format
)/sizeof(WCHAR
));
1013 wsprintfW(buffer
, format
, lpcf
->nSizeMin
,lpcf
->nSizeMax
);
1014 MessageBoxW(hDlg
, buffer
, NULL
, MB_OK
);
1018 EndDialog(hDlg
, FALSE
);
1024 LRESULT
CFn_WMDestroy(HWND hwnd
, WPARAM wParam
, LPARAM lParam
, LPCHOOSEFONTW lpcfw
)
1026 LPCHOOSEFONTA lpcfa
;
1027 LPCSTR lpTemplateName
;
1029 LPLOGFONTA lpLogFonta
;
1032 lpcfa
= GetPropW(hwnd
, strWineFontData_a
);
1033 lpLogFonta
= lpcfa
->lpLogFont
;
1034 lpTemplateName
= lpcfa
->lpTemplateName
;
1035 lpszStyle
= lpcfa
->lpszStyle
;
1036 memcpy(lpcfa
, lpcfw
, sizeof(CHOOSEFONTA
));
1037 lpcfa
->lpLogFont
= lpLogFonta
;
1038 lpcfa
->lpTemplateName
= lpTemplateName
;
1039 lpcfa
->lpszStyle
= lpszStyle
;
1040 memcpy(lpcfa
->lpLogFont
, lpcfw
->lpLogFont
, sizeof(LOGFONTA
));
1041 WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpLogFont
->lfFaceName
,
1042 LF_FACESIZE
, lpcfa
->lpLogFont
->lfFaceName
, LF_FACESIZE
, 0, 0);
1044 if((lpcfw
->Flags
& CF_USESTYLE
) && lpcfw
->lpszStyle
) {
1045 len
= WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpszStyle
, -1, NULL
, -1, 0, 0);
1046 WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpszStyle
, -1, lpcfa
->lpszStyle
, len
, 0, 0);
1047 HeapFree(GetProcessHeap(), 0, lpcfw
->lpszStyle
);
1050 HeapFree(GetProcessHeap(), 0, (LPBYTE
)lpcfw
->lpTemplateName
);
1051 HeapFree(GetProcessHeap(), 0, lpcfw
->lpLogFont
);
1052 HeapFree(GetProcessHeap(), 0, lpcfw
);
1057 LRESULT
CFn_WMPaint(HWND hDlg
, WPARAM wParam
, LPARAM lParam
, LPCHOOSEFONTW lpcf
)
1061 info
.cbSize
=sizeof(info
);
1062 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &info
) )
1069 LOGFONTW lf
= *(lpcf
->lpLogFont
);
1071 MapWindowPoints( 0, hDlg
, (LPPOINT
) &info
.rcWindow
, 2);
1072 hdc
= BeginPaint( hDlg
, &ps
);
1074 TRACE("erase %d, rect=(%ld,%ld)-(%ld,%ld)\n", ps
.fErase
,
1075 ps
.rcPaint
.left
, ps
.rcPaint
.top
,
1076 ps
.rcPaint
.right
, ps
.rcPaint
.bottom
);
1079 MoveToEx( hdc
, info
.rcWindow
.left
, info
.rcWindow
.bottom
, NULL
);
1080 hOrigPen
=SelectObject( hdc
, CreatePen( PS_SOLID
, 2,
1081 GetSysColor( COLOR_3DSHADOW
) ));
1082 LineTo( hdc
, info
.rcWindow
.left
, info
.rcWindow
.top
);
1083 LineTo( hdc
, info
.rcWindow
.right
, info
.rcWindow
.top
);
1084 DeleteObject(SelectObject( hdc
, CreatePen( PS_SOLID
, 2,
1085 GetSysColor( COLOR_3DLIGHT
) )));
1086 LineTo( hdc
, info
.rcWindow
.right
, info
.rcWindow
.bottom
);
1087 LineTo( hdc
, info
.rcWindow
.left
, info
.rcWindow
.bottom
);
1088 DeleteObject(SelectObject( hdc
, hOrigPen
));
1090 /* Draw the sample text itself */
1091 info
.rcWindow
.right
--;
1092 info
.rcWindow
.bottom
--;
1093 info
.rcWindow
.top
++;
1094 info
.rcWindow
.left
++;
1095 hOrigFont
= SelectObject( hdc
, CreateFontIndirectW( &lf
) );
1096 rgbPrev
=SetTextColor( hdc
, lpcf
->rgbColors
);
1099 sample_lang_text
[CHARSET_ORDER
[lpcf
->lpLogFont
->lfCharSet
]],
1100 -1, &info
.rcWindow
, DT_CENTER
|DT_VCENTER
|DT_SINGLELINE
);
1102 DeleteObject(SelectObject( hdc
, hOrigFont
));
1103 EndPaint( hDlg
, &ps
);
1108 /***********************************************************************
1109 * FormatCharDlgProcA [internal]
1111 INT_PTR CALLBACK
FormatCharDlgProcA(HWND hDlg
, UINT uMsg
, WPARAM wParam
,
1114 LPCHOOSEFONTW lpcfw
;
1115 LPCHOOSEFONTA lpcfa
;
1116 INT_PTR res
= FALSE
;
1119 if (uMsg
!=WM_INITDIALOG
) {
1120 lpcfw
= (LPCHOOSEFONTW
)GetPropW(hDlg
, strWineFontData
);
1123 if (CFn_HookCallChk32(lpcfw
))
1124 res
=CallWindowProcA((WNDPROC
)lpcfw
->lpfnHook
, hDlg
, uMsg
, wParam
, lParam
);
1128 lpcfa
=(LPCHOOSEFONTA
)lParam
;
1129 SetPropW(hDlg
, strWineFontData_a
, (HANDLE
)lParam
);
1131 lpcfw
= HeapAlloc(GetProcessHeap(), 0, sizeof(CHOOSEFONTW
));
1132 memcpy(lpcfw
, lpcfa
, sizeof(CHOOSEFONTA
));
1133 lpcfw
->lpLogFont
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOGFONTW
));
1134 memcpy(lpcfw
->lpLogFont
, lpcfa
->lpLogFont
, sizeof(LOGFONTA
));
1135 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpLogFont
->lfFaceName
,
1136 LF_FACESIZE
, lpcfw
->lpLogFont
->lfFaceName
, LF_FACESIZE
);
1138 if((lpcfa
->Flags
& CF_USESTYLE
) && lpcfa
->lpszStyle
) {
1139 len
= MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpszStyle
, -1, NULL
, 0);
1140 lpcfw
->lpszStyle
= HeapAlloc(GetProcessHeap(), 0, len
*sizeof(WCHAR
));
1141 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpszStyle
, -1, lpcfw
->lpszStyle
, len
);
1144 if((lpcfa
->Flags
& CF_ENABLETEMPLATE
) && lpcfa
->lpTemplateName
) {
1145 len
= MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpTemplateName
, -1, NULL
, 0);
1146 lpcfw
->lpTemplateName
= HeapAlloc(GetProcessHeap(), 0, len
*sizeof(WCHAR
));
1147 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpTemplateName
,
1148 -1, (LPWSTR
)lpcfw
->lpTemplateName
, len
);
1151 if (!CFn_WMInitDialog(hDlg
, wParam
, lParam
, lpcfw
))
1153 TRACE("CFn_WMInitDialog returned FALSE\n");
1156 if (CFn_HookCallChk32(lpcfw
))
1157 return CallWindowProcA((WNDPROC
)lpcfa
->lpfnHook
,hDlg
,WM_INITDIALOG
,wParam
,lParam
);
1161 case WM_MEASUREITEM
:
1162 return CFn_WMMeasureItem(hDlg
, wParam
, lParam
);
1164 return CFn_WMDrawItem(hDlg
, wParam
, lParam
);
1166 return CFn_WMCommand(hDlg
, wParam
, lParam
, lpcfw
);
1168 return CFn_WMDestroy(hDlg
, wParam
, lParam
, lpcfw
);
1169 case WM_CHOOSEFONT_GETLOGFONT
:
1170 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam
);
1171 FIXME("current logfont back to caller\n");
1174 return CFn_WMPaint(hDlg
, wParam
, lParam
, lpcfw
);
1179 /***********************************************************************
1180 * FormatCharDlgProcW [internal]
1182 INT_PTR CALLBACK
FormatCharDlgProcW(HWND hDlg
, UINT uMsg
, WPARAM wParam
,
1186 INT_PTR res
= FALSE
;
1188 if (uMsg
!=WM_INITDIALOG
)
1190 lpcf
=(LPCHOOSEFONTW
)GetPropW(hDlg
, strWineFontData
);
1193 if (CFn_HookCallChk32(lpcf
))
1194 res
=CallWindowProcW((WNDPROC
)lpcf
->lpfnHook
, hDlg
, uMsg
, wParam
, lParam
);
1200 lpcf
=(LPCHOOSEFONTW
)lParam
;
1201 if (!CFn_WMInitDialog(hDlg
, wParam
, lParam
, lpcf
))
1203 TRACE("CFn_WMInitDialog returned FALSE\n");
1206 if (CFn_HookCallChk32(lpcf
))
1207 return CallWindowProcW((WNDPROC
)lpcf
->lpfnHook
,hDlg
,WM_INITDIALOG
,wParam
,lParam
);
1211 case WM_MEASUREITEM
:
1212 return CFn_WMMeasureItem(hDlg
, wParam
, lParam
);
1214 return CFn_WMDrawItem(hDlg
, wParam
, lParam
);
1216 return CFn_WMCommand(hDlg
, wParam
, lParam
, lpcf
);
1219 case WM_CHOOSEFONT_GETLOGFONT
:
1220 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam
);
1221 FIXME("current logfont back to caller\n");
1224 return CFn_WMPaint(hDlg
, wParam
, lParam
, lpcf
);