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
24 WINE_DEFAULT_DEBUG_CHANNEL(commdlg
);
26 static const WCHAR strWineFontData
[] = {'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A',0};
27 static const WCHAR strWineFontData_a
[] =
28 {'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A','_','A',0};
29 static const WCHAR chooseFontW
[] = {'C','H','O','O','S','E','_','F','O','N','T',0};
33 /* image list with TrueType bitmaps and more */
34 static HIMAGELIST himlTT
= 0;
35 #define TTBITMAP_XSIZE 20 /* x-size of the bitmaps */
37 INT_PTR CALLBACK
FormatCharDlgProcA(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
38 INT_PTR CALLBACK
FormatCharDlgProcW(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
40 /* There is a table here of all charsets, and the sample text for each.
41 * There is a second table that translates a charset into an index into
45 #define CI(cs) ((IDS_CHARSET_##cs)-IDS_CHARSET_ANSI)
48 static const WCHAR stWestern
[]={'A','a','B','b','Y','y','Z','z',0}; /* Western and default */
49 static const WCHAR stSymbol
[]={'S','y','m','b','o','l',0}; /* Symbol */
50 static const WCHAR stShiftJis
[]={'A','a',0x3042,0x3041,0x30a2,0x30a1,0x4e9c,0x5b87,0}; /* Shift JIS */
51 static const WCHAR stHangul
[]={0xac00,0xb098,0xb2e4,'A','a','B','Y','y','Z','z',0}; /* Hangul */
52 static const WCHAR stGB2312
[]={0x5fae,0x8f6f,0x4e2d,0x6587,0x8f6f,0x4ef6,0}; /* GB2312 */
53 static const WCHAR stBIG5
[]={0x4e2d,0x6587,0x5b57,0x578b,0x7bc4,0x4f8b,0}; /* BIG5 */
54 static const WCHAR stGreek
[]={'A','a','B','b',0x0391,0x03b1,0x0392,0x03b2,0}; /* Greek */
55 static const WCHAR stTurkish
[]={'A','a','B','b',0x011e,0x011f,0x015e,0x015f,0}; /* Turkish */
56 static const WCHAR stHebrew
[]={'A','a','B','b',0x05e0,0x05e1,0x05e9,0x05ea,0}; /* Hebrew */
57 static const WCHAR stArabic
[]={'A','a','B','b',0x0627,0x0628,0x062c,0x062f,0x0647,0x0648,0x0632,0};/* Arabic */
58 static const WCHAR stBaltic
[]={'A','a','B','b','Y','y','Z','z',0}; /* Baltic */
59 static const WCHAR stVietname
[]={'A','a','B','b',0x01a0,0x01a1,0x01af,0x01b0,0}; /* Vietnamese */
60 static const WCHAR stCyrillic
[]={'A','a','B','b',0x0411,0x0431,0x0424,0x0444,0}; /* Cyrillic */
61 static const WCHAR stEastEur
[]={'A','a','B','b',0xc1,0xe1,0xd4,0xf4,0}; /* East European */
62 static const WCHAR stThai
[]={'A','a','B','b',0x0e2d,0x0e31,0x0e01,0x0e29,0x0e23,0x0e44,0x0e17,0x0e22,0}; /* Thai */
63 static const WCHAR stJohab
[]={0xac00,0xb098,0xb2e4,'A','a','B','Y','y','Z','z',0}; /* Johab */
64 static const WCHAR stMac
[]={'A','a','B','b','Y','y','Z','z',0}; /* Mac */
65 static const WCHAR stOEM
[]={'A','a','B','b',0xf8,0xf1,0xfd,0}; /* OEM */
66 /* the following character sets actually behave different (Win2K observation):
67 * the sample string is 'sticky': it uses the sample string of the previous
68 * selected character set. That behaviour looks like some default, which is
69 * not (yet) implemented. */
70 static const WCHAR stVISCII
[]={'A','a','B','b',0}; /* VISCII */
71 static const WCHAR stTCVN
[]={'A','a','B','b',0}; /* TCVN */
72 static const WCHAR stKOI8
[]={'A','a','B','b',0}; /* KOI-8 */
73 static const WCHAR stIso88593
[]={'A','a','B','b',0}; /* ISO-8859-3 */
74 static const WCHAR stIso88594
[]={'A','a','B','b',0}; /* ISO-8859-4 */
75 static const WCHAR stIso885910
[]={'A','a','B','b',0}; /* ISO-8859-10 */
76 static const WCHAR stCeltic
[]={'A','a','B','b',0};/* Celtic */
78 static const WCHAR
*sample_lang_text
[]={
79 stWestern
,stSymbol
,stShiftJis
,stHangul
,stGB2312
,
80 stBIG5
,stGreek
,stTurkish
,stHebrew
,stArabic
,
81 stBaltic
,stVietname
,stCyrillic
,stEastEur
,stThai
,
82 stJohab
,stMac
,stOEM
,stVISCII
,stTCVN
,
83 stKOI8
,stIso88593
,stIso88594
,stIso885910
,stCeltic
};
86 static const BYTE CHARSET_ORDER
[256]={
87 CI(ANSI
), 0, CI(SYMBOL
), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
88 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
89 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
90 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
91 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(MAC
), 0, 0,
92 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
93 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
94 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
95 CI(JIS
), CI(HANGUL
), CI(JOHAB
), 0, 0, 0, CI(GB2312
), 0, CI(BIG5
), 0, 0, 0, 0, 0, 0, 0,
96 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
97 0, CI(GREEK
), CI(TURKISH
), CI(VIETNAMESE
), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
98 0, CI(HEBREW
), CI(ARABIC
), 0, 0, 0, 0, 0, 0, 0, CI(BALTIC
), 0, 0, 0, 0, 0,
99 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(RUSSIAN
), 0, 0, 0,
100 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(THAI
), 0,
101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(EE
), 0,
102 CI(VISCII
), CI(TCVN
), CI(KOI8
), CI(ISO3
), CI(ISO4
), CI(ISO10
), CI(CELTIC
), 0, 0, 0, 0, 0, 0, 0, 0, CI(OEM
),
105 static const struct {
109 #define XX(x) { x, #x },
114 XX(CF_ENABLETEMPLATE
)
115 XX(CF_ENABLETEMPLATEHANDLE
)
116 XX(CF_INITTOLOGFONTSTRUCT
)
124 XX(CF_FIXEDPITCHONLY
)
126 XX(CF_FORCEFONTEXIST
)
138 void _dump_cf_flags(DWORD cflags
)
142 for (i
= 0; i
< sizeof(cfflags
)/sizeof(cfflags
[0]); i
++)
143 if (cfflags
[i
].mask
& cflags
)
144 TRACE("%s|",cfflags
[i
].name
);
148 /***********************************************************************
149 * ChooseFontW (COMDLG32.@)
151 * Create a font dialog box.
154 * lpChFont [I/O] in: information to initialize the dialog box.
155 * out: User's color selection
158 * TRUE: Ok button clicked.
159 * FALSE: Cancel button clicked, or error.
161 BOOL WINAPI
ChooseFontW(LPCHOOSEFONTW lpChFont
)
168 TRACE("(%p)\n", lpChFont
);
170 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATEHANDLE
)!=0 )
172 template=(LPCVOID
)lpChFont
->hInstance
;
175 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATE
)!=0 )
177 hDlginst
=lpChFont
->hInstance
;
178 if( !(hResInfo
= FindResourceW(hDlginst
, lpChFont
->lpTemplateName
,
181 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
186 hDlginst
=COMDLG32_hInstance
;
187 if (!(hResInfo
= FindResourceW(hDlginst
, chooseFontW
, (LPWSTR
)RT_DIALOG
)))
189 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
193 if (!(hDlgTmpl
= LoadResource(hDlginst
, hResInfo
)) ||
194 !(template = LockResource( hDlgTmpl
)))
196 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE
);
200 if (TRACE_ON(commdlg
))
201 _dump_cf_flags(lpChFont
->Flags
);
203 if (lpChFont
->Flags
& (CF_SELECTSCRIPT
| CF_NOVERTFONTS
))
204 FIXME(": unimplemented flag (ignored)\n");
206 return DialogBoxIndirectParamW(COMDLG32_hInstance
, template,
207 lpChFont
->hwndOwner
, FormatCharDlgProcW
, (LPARAM
)lpChFont
);
210 /***********************************************************************
211 * ChooseFontA (COMDLG32.@)
215 BOOL WINAPI
ChooseFontA(LPCHOOSEFONTA lpChFont
)
222 TRACE("(%p)\n", lpChFont
);
224 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATEHANDLE
)!=0 )
226 template=(LPCVOID
)lpChFont
->hInstance
;
229 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATE
)!=0 )
231 hDlginst
=lpChFont
->hInstance
;
232 if( !(hResInfo
= FindResourceA(hDlginst
, lpChFont
->lpTemplateName
,
235 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
240 hDlginst
=COMDLG32_hInstance
;
241 if (!(hResInfo
= FindResourceW(hDlginst
, chooseFontW
, (LPWSTR
)RT_DIALOG
)))
243 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
247 if (!(hDlgTmpl
= LoadResource(hDlginst
, hResInfo
)) ||
248 !(template = LockResource( hDlgTmpl
)))
250 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE
);
254 if (TRACE_ON(commdlg
))
255 _dump_cf_flags(lpChFont
->Flags
);
256 if (lpChFont
->Flags
& (CF_SELECTSCRIPT
| CF_NOVERTFONTS
))
257 FIXME(": unimplemented flag (ignored)\n");
259 return DialogBoxIndirectParamA(COMDLG32_hInstance
, template,
260 lpChFont
->hwndOwner
, FormatCharDlgProcA
, (LPARAM
)lpChFont
);
263 #define TEXT_EXTRAS 4
264 #define TEXT_COLORS 16
266 static const COLORREF textcolors
[TEXT_COLORS
]=
268 0x00000000L
,0x00000080L
,0x00008000L
,0x00008080L
,
269 0x00800000L
,0x00800080L
,0x00808000L
,0x00808080L
,
270 0x00c0c0c0L
,0x000000ffL
,0x0000ff00L
,0x0000ffffL
,
271 0x00ff0000L
,0x00ff00ffL
,0x00ffff00L
,0x00FFFFFFL
274 /***********************************************************************
275 * CFn_HookCallChk32 [internal]
277 static BOOL
CFn_HookCallChk32(LPCHOOSEFONTW lpcf
)
280 if(lpcf
->Flags
& CF_ENABLEHOOK
)
286 /*************************************************************************
287 * AddFontFamily [internal]
289 INT
AddFontFamily(const ENUMLOGFONTEXW
*lpElfex
, const NEWTEXTMETRICEXW
*lpNTM
,
290 UINT nFontType
, LPCHOOSEFONTW lpcf
, HWND hwnd
, LPCFn_ENUMSTRUCT e
)
294 const LOGFONTW
*lplf
= &(lpElfex
->elfLogFont
);
296 TRACE("font=%s (nFontType=%d)\n", debugstr_w(lplf
->lfFaceName
), nFontType
);
298 if (lpcf
->Flags
& CF_FIXEDPITCHONLY
)
299 if (!(lplf
->lfPitchAndFamily
& FIXED_PITCH
))
301 if (lpcf
->Flags
& CF_ANSIONLY
)
302 if (lplf
->lfCharSet
!= ANSI_CHARSET
)
304 if (lpcf
->Flags
& CF_TTONLY
)
305 if (!(nFontType
& TRUETYPE_FONTTYPE
))
310 i
=SendMessageW(hwnd
, CB_FINDSTRINGEXACT
, 0, (LPARAM
)lplf
->lfFaceName
);
312 i
= SendMessageW(hwnd
, CB_ADDSTRING
, 0, (LPARAM
)lplf
->lfFaceName
);
314 /* store some important font information */
315 w
= (lplf
->lfPitchAndFamily
) << 8 |
316 (HIWORD(lpNTM
->ntmTm
.ntmFlags
) & 0xff);
317 SendMessageW(hwnd
, CB_SETITEMDATA
, i
, MAKELONG(nFontType
,w
));
323 /*************************************************************************
324 * FontFamilyEnumProc32 [internal]
326 static INT WINAPI
FontFamilyEnumProc(const ENUMLOGFONTEXW
*lpElfex
,
327 const TEXTMETRICW
*metrics
, DWORD dwFontType
, LPARAM lParam
)
330 e
=(LPCFn_ENUMSTRUCT
)lParam
;
331 return AddFontFamily( lpElfex
, (NEWTEXTMETRICEXW
*) metrics
,
332 dwFontType
, e
->lpcf32w
, e
->hWnd1
, e
);
335 /*************************************************************************
336 * SetFontStylesToCombo2 [internal]
338 * Fill font style information into combobox (without using font.c directly)
340 static int SetFontStylesToCombo2(HWND hwnd
, HDC hdc
, const LOGFONTW
*lplf
)
349 static const WCHAR strRegular
[] = {'R','e','g','u','l','a','r',0};
350 static const WCHAR strItalic
[] = {'I','t','a','l','i','c',0};
351 static const WCHAR strBold
[] = {'B','o','l','d',0};
352 static const WCHAR strBoldItalic
[] = {'B','o','l','d',' ','I','t','a','l','i','c',0};
353 static const struct FONTSTYLE fontstyles
[FSTYLES
]={
354 { 0, FW_NORMAL
, strRegular
},
355 { 1, FW_NORMAL
, strItalic
},
356 { 0, FW_BOLD
, strBold
},
357 { 1, FW_BOLD
, strBoldItalic
}
364 memcpy(&lf
, lplf
, sizeof(LOGFONTW
));
366 for (i
=0;i
<FSTYLES
;i
++)
368 lf
.lfItalic
=fontstyles
[i
].italic
;
369 lf
.lfWeight
=fontstyles
[i
].weight
;
370 hf
=CreateFontIndirectW(&lf
);
371 hf
=SelectObject(hdc
,hf
);
372 GetTextMetricsW(hdc
,&tm
);
373 hf
=SelectObject(hdc
,hf
);
375 /* font successful created ? */
376 if (tm
.tmWeight
==fontstyles
[i
].weight
&&
377 ((tm
.tmItalic
!= 0)==fontstyles
[i
].italic
))
379 j
=SendMessageW(hwnd
,CB_ADDSTRING
,0,(LPARAM
)fontstyles
[i
].stname
);
380 if (j
==CB_ERR
) return 1;
381 j
=SendMessageW(hwnd
, CB_SETITEMDATA
, j
,
382 MAKELONG(fontstyles
[i
].weight
,fontstyles
[i
].italic
));
383 if (j
==CB_ERR
) return 1;
389 /*************************************************************************
390 * AddFontSizeToCombo3 [internal]
392 static int AddFontSizeToCombo3(HWND hwnd
, UINT h
, LPCHOOSEFONTW lpcf
)
396 static const WCHAR strFormat
[] = {'%','2','d',0};
398 if ( (!(lpcf
->Flags
& CF_LIMITSIZE
)) ||
399 ((lpcf
->Flags
& CF_LIMITSIZE
) && (h
>= lpcf
->nSizeMin
) && (h
<= lpcf
->nSizeMax
)))
401 wsprintfW(buffer
, strFormat
, h
);
402 j
=SendMessageW(hwnd
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)buffer
);
405 j
=SendMessageW(hwnd
, CB_ADDSTRING
, 0, (LPARAM
)buffer
);
406 if (j
!=CB_ERR
) j
= SendMessageW(hwnd
, CB_SETITEMDATA
, j
, h
);
407 if (j
==CB_ERR
) return 1;
413 /*************************************************************************
414 * SetFontSizesToCombo3 [internal]
416 static int SetFontSizesToCombo3(HWND hwnd
, LPCHOOSEFONTW lpcf
)
418 static const BYTE sizes
[]={6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
421 for (i
= 0; i
< sizeof(sizes
)/sizeof(sizes
[0]); i
++)
422 if (AddFontSizeToCombo3(hwnd
, sizes
[i
], lpcf
)) return 1;
426 /*************************************************************************
427 * CFn_GetDC [internal]
429 static inline HDC
CFn_GetDC(LPCHOOSEFONTW lpcf
)
431 HDC ret
= ((lpcf
->Flags
& CF_PRINTERFONTS
) && lpcf
->hDC
) ?
434 if(!ret
) ERR("HDC failure!!!\n");
438 /*************************************************************************
439 * CFn_ReleaseDC [internal]
441 static inline void CFn_ReleaseDC(LPCHOOSEFONTW lpcf
, HDC hdc
)
443 if(!((lpcf
->Flags
& CF_PRINTERFONTS
) && lpcf
->hDC
))
447 /***********************************************************************
448 * AddFontStyle [internal]
450 INT
AddFontStyle( const ENUMLOGFONTEXW
*lpElfex
, const NEWTEXTMETRICEXW
*lpNTM
,
451 UINT nFontType
, LPCHOOSEFONTW lpcf
, HWND hcmb2
, HWND hcmb3
,
452 HWND hDlg
, BOOL iswin16
)
455 const LOGFONTW
*lplf
= &(lpElfex
->elfLogFont
);
459 TRACE("(nFontType=%d)\n",nFontType
);
460 TRACE(" %s h=%ld w=%ld e=%ld o=%ld wg=%ld i=%d u=%d s=%d"
461 " ch=%d op=%d cp=%d q=%d pf=%xh\n",
462 debugstr_w(lplf
->lfFaceName
),lplf
->lfHeight
,lplf
->lfWidth
,
463 lplf
->lfEscapement
,lplf
->lfOrientation
,
464 lplf
->lfWeight
,lplf
->lfItalic
,lplf
->lfUnderline
,
465 lplf
->lfStrikeOut
,lplf
->lfCharSet
, lplf
->lfOutPrecision
,
466 lplf
->lfClipPrecision
,lplf
->lfQuality
, lplf
->lfPitchAndFamily
);
467 if (nFontType
& RASTER_FONTTYPE
)
470 if(!(hdc
= CFn_GetDC(lpcf
))) return 0;
471 points
= MulDiv( lpNTM
->ntmTm
.tmHeight
- lpNTM
->ntmTm
.tmInternalLeading
,
472 72, GetDeviceCaps(hdc
, LOGPIXELSY
));
473 CFn_ReleaseDC(lpcf
, hdc
);
474 i
= AddFontSizeToCombo3(hcmb3
, points
, lpcf
);
476 } else if (SetFontSizesToCombo3(hcmb3
, lpcf
)) return 0;
478 if (!SendMessageW(hcmb2
, CB_GETCOUNT
, 0, 0))
480 if(!(hdc
= CFn_GetDC(lpcf
))) return 0;
481 i
=SetFontStylesToCombo2(hcmb2
,hdc
,lplf
);
482 CFn_ReleaseDC(lpcf
, hdc
);
486 if( iswin16
|| !( hcmb5
= GetDlgItem(hDlg
, cmb5
))) return 1;
487 i
= SendMessageW( hcmb5
, CB_FINDSTRINGEXACT
, 0,
488 (LPARAM
)lpElfex
->elfScript
);
490 i
= SendMessageW( hcmb5
, CB_ADDSTRING
, 0,
491 (LPARAM
)lpElfex
->elfScript
);
493 SendMessageW( hcmb5
, CB_SETITEMDATA
, i
, lplf
->lfCharSet
);
498 static INT
CFn_FitFontSize( HWND hDlg
, int points
)
502 /* look for fitting font size in combobox3 */
503 n
=SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCOUNT
, 0, 0);
506 if (points
== (int)SendDlgItemMessageW
507 (hDlg
,cmb3
, CB_GETITEMDATA
,i
,0))
509 SendDlgItemMessageW(hDlg
,cmb3
,CB_SETCURSEL
,i
,0);
510 SendMessageW(hDlg
, WM_COMMAND
,
511 MAKEWPARAM(cmb3
, CBN_SELCHANGE
),
512 (LPARAM
)GetDlgItem(hDlg
,cmb3
));
520 static INT
CFn_FitFontStyle( HWND hDlg
, LONG packedstyle
)
524 /* look for fitting font style in combobox2 */
525 for (i
=0;i
<TEXT_EXTRAS
;i
++)
527 id
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, i
, 0);
528 if (packedstyle
== id
)
530 SendDlgItemMessageW(hDlg
, cmb2
, CB_SETCURSEL
, i
, 0);
531 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb2
, CBN_SELCHANGE
),
532 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
541 static INT
CFn_FitCharSet( HWND hDlg
, int charset
)
544 /* look for fitting char set in combobox5 */
545 n
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCOUNT
, 0, 0);
548 cs
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, i
, 0);
551 SendDlgItemMessageW(hDlg
, cmb5
, CB_SETCURSEL
, i
, 0);
552 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
553 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
557 /* no charset fits: select the first one in the list */
558 SendDlgItemMessageW(hDlg
, cmb5
, CB_SETCURSEL
, 0, 0);
559 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
560 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
564 /***********************************************************************
565 * FontStyleEnumProc32 [internal]
567 static INT WINAPI
FontStyleEnumProc( const ENUMLOGFONTEXW
*lpElfex
,
568 const TEXTMETRICW
*metrics
, DWORD dwFontType
, LPARAM lParam
)
570 LPCFn_ENUMSTRUCT s
=(LPCFn_ENUMSTRUCT
)lParam
;
573 HWND hDlg
=GetParent(hcmb3
);
574 return AddFontStyle( lpElfex
, (const NEWTEXTMETRICEXW
*) metrics
,
575 dwFontType
, s
->lpcf32w
, hcmb2
, hcmb3
, hDlg
, FALSE
);
578 /***********************************************************************
579 * CFn_WMInitDialog [internal]
581 LRESULT
CFn_WMInitDialog(HWND hDlg
, WPARAM wParam
, LPARAM lParam
,
589 HCURSOR hcursor
=SetCursor(LoadCursorW(0,(LPWSTR
)IDC_WAIT
));
590 static const WCHAR strColorName
[] = {'[','c','o','l','o','r',' ','n','a','m','e',']',0};
592 SetPropW(hDlg
, strWineFontData
, (HANDLE
)lpcf
);
593 lpxx
=lpcf
->lpLogFont
;
594 TRACE("WM_INITDIALOG lParam=%08lX\n", lParam
);
596 if (lpcf
->lStructSize
!= sizeof(CHOOSEFONTW
))
598 ERR("structure size failure !!!\n");
603 himlTT
= ImageList_LoadImageW( COMDLG32_hInstance
, MAKEINTRESOURCEW(38),
604 TTBITMAP_XSIZE
, 0, CLR_DEFAULT
, IMAGE_BITMAP
, 0);
606 if (!(lpcf
->Flags
& CF_SHOWHELP
) || !IsWindow(lpcf
->hwndOwner
))
607 ShowWindow(GetDlgItem(hDlg
,pshHelp
),SW_HIDE
);
608 if (!(lpcf
->Flags
& CF_APPLY
))
609 ShowWindow(GetDlgItem(hDlg
,psh3
),SW_HIDE
);
610 if (lpcf
->Flags
& CF_EFFECTS
)
612 for (i
=0;i
<TEXT_COLORS
;i
++)
616 if( LoadStringW(COMDLG32_hInstance
, IDS_COLOR_BLACK
+i
, name
,
617 sizeof(name
)/sizeof(*name
) )==0 )
619 memcpy(name
, strColorName
, sizeof(strColorName
));
621 j
=SendDlgItemMessageW(hDlg
, cmb4
, CB_ADDSTRING
, 0, (LPARAM
)name
);
622 SendDlgItemMessageW(hDlg
, cmb4
, CB_SETITEMDATA
, j
, textcolors
[i
]);
623 /* look for a fitting value in color combobox */
624 if (textcolors
[i
]==lpcf
->rgbColors
)
625 SendDlgItemMessageW(hDlg
,cmb4
, CB_SETCURSEL
,j
,0);
630 ShowWindow(GetDlgItem(hDlg
,cmb4
),SW_HIDE
);
631 ShowWindow(GetDlgItem(hDlg
,chx1
),SW_HIDE
);
632 ShowWindow(GetDlgItem(hDlg
,chx2
),SW_HIDE
);
633 ShowWindow(GetDlgItem(hDlg
,grp1
),SW_HIDE
);
634 ShowWindow(GetDlgItem(hDlg
,stc4
),SW_HIDE
);
636 if(!(hdc
= CFn_GetDC(lpcf
)))
641 s
.hWnd1
=GetDlgItem(hDlg
,cmb1
);
646 elf
.lfCharSet
= DEFAULT_CHARSET
; /* enum all charsets */
647 elf
.lfPitchAndFamily
= 0;
648 elf
.lfFaceName
[0] = '\0'; /* enum all fonts */
649 if (!EnumFontFamiliesExW(hdc
, &elf
, (FONTENUMPROCW
)FontFamilyEnumProc
, (LPARAM
)&s
, 0))
651 TRACE("EnumFontFamiliesEx returns 0\n");
655 if (lpcf
->Flags
& CF_FIXEDPITCHONLY
) {
656 FIXME("No font found with fixed pitch only, dropping flag.\n");
657 lpcf
->Flags
&= ~CF_FIXEDPITCHONLY
;
660 if (lpcf
->Flags
& CF_TTONLY
) {
661 FIXME("No font found with truetype only, dropping flag.\n");
662 lpcf
->Flags
&= ~CF_TTONLY
;
669 if (lpcf
->Flags
& CF_INITTOLOGFONTSTRUCT
)
671 /* look for fitting font name in combobox1 */
672 j
=SendDlgItemMessageW(hDlg
,cmb1
,CB_FINDSTRING
,-1,(LPARAM
)lpxx
->lfFaceName
);
675 INT height
= lpxx
->lfHeight
< 0 ? -lpxx
->lfHeight
:
678 int charset
= lpxx
->lfCharSet
;
679 points
= MulDiv( height
, 72, GetDeviceCaps(hdc
, LOGPIXELSY
));
680 pstyle
= MAKELONG(lpxx
->lfWeight
> FW_MEDIUM
? FW_BOLD
:
681 FW_NORMAL
,lpxx
->lfItalic
!=0);
682 SendDlgItemMessageW(hDlg
, cmb1
, CB_SETCURSEL
, j
, 0);
683 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb1
, CBN_SELCHANGE
),
684 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
686 /* look for fitting font style in combobox2 */
687 CFn_FitFontStyle(hDlg
, pstyle
);
688 /* look for fitting font size in combobox3 */
689 CFn_FitFontSize(hDlg
, points
);
690 CFn_FitCharSet( hDlg
, charset
);
695 SendDlgItemMessageW(hDlg
,cmb1
,CB_SETCURSEL
,0,0);
696 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb1
, CBN_SELCHANGE
),
697 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
699 if ((lpcf
->Flags
& CF_USESTYLE
) && lpcf
->lpszStyle
)
701 j
=SendDlgItemMessageW(hDlg
,cmb2
,CB_FINDSTRING
,-1,(LPARAM
)lpcf
->lpszStyle
);
704 j
=SendDlgItemMessageW(hDlg
,cmb2
,CB_SETCURSEL
,j
,0);
705 SendMessageW(hDlg
,WM_COMMAND
,cmb2
,
706 MAKELONG(HWND_16(GetDlgItem(hDlg
,cmb2
)),CBN_SELCHANGE
));
709 CFn_ReleaseDC(lpcf
, hdc
);
715 /***********************************************************************
716 * CFn_WMMeasureItem [internal]
718 LRESULT
CFn_WMMeasureItem(HWND hDlg
, WPARAM wParam
, LPARAM lParam
)
723 LPMEASUREITEMSTRUCT lpmi
=(LPMEASUREITEMSTRUCT
)lParam
;
727 himlTT
= ImageList_LoadImageW( COMDLG32_hInstance
, MAKEINTRESOURCEW(38),
728 TTBITMAP_XSIZE
, 0, CLR_DEFAULT
, IMAGE_BITMAP
, 0);
729 ImageList_GetIconSize( himlTT
, 0, &height
);
730 lpmi
->itemHeight
= height
+ 2;
731 /* use MAX of bitmap height and tm.tmHeight .*/
734 hfontprev
= SelectObject( hdc
, GetStockObject( SYSTEM_FONT
));
735 GetTextMetricsW(hdc
, &tm
);
736 if( tm
.tmHeight
> lpmi
->itemHeight
) lpmi
->itemHeight
= tm
.tmHeight
;
737 SelectObject(hdc
, hfontprev
);
738 ReleaseDC(hDlg
, hdc
);
743 /***********************************************************************
744 * CFn_WMDrawItem [internal]
746 LRESULT
CFn_WMDrawItem(HWND hDlg
, WPARAM wParam
, LPARAM lParam
)
750 COLORREF cr
, oldText
=0, oldBk
=0;
754 LPDRAWITEMSTRUCT lpdi
= (LPDRAWITEMSTRUCT
)lParam
;
756 if (lpdi
->itemID
== (UINT
)-1) /* got no items */
757 DrawFocusRect(lpdi
->hDC
, &lpdi
->rcItem
);
760 if (lpdi
->CtlType
== ODT_COMBOBOX
)
762 if (lpdi
->itemState
& ODS_SELECTED
)
764 hBrush
=GetSysColorBrush(COLOR_HIGHLIGHT
);
765 oldText
=SetTextColor(lpdi
->hDC
, GetSysColor(COLOR_HIGHLIGHTTEXT
));
766 oldBk
=SetBkColor(lpdi
->hDC
, GetSysColor(COLOR_HIGHLIGHT
));
769 hBrush
= SelectObject(lpdi
->hDC
, GetStockObject(LTGRAY_BRUSH
));
770 SelectObject(lpdi
->hDC
, hBrush
);
772 FillRect(lpdi
->hDC
, &lpdi
->rcItem
, hBrush
);
775 return TRUE
; /* this should never happen */
781 /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
782 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
784 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
+ TTBITMAP_XSIZE
+ 10,
785 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
786 nFontType
= SendMessageW(lpdi
->hwndItem
, CB_GETITEMDATA
, lpdi
->itemID
,0L);
788 if (nFontType
& TRUETYPE_FONTTYPE
) {
789 idx
= 0; /* picture: TT */
790 if( nFontType
& NTM_TT_OPENTYPE
)
791 idx
= 2; /* picture: O */
792 } else if( nFontType
& NTM_PS_OPENTYPE
)
793 idx
= 3; /* picture: O+ps */
794 else if( nFontType
& NTM_TYPE1
)
795 idx
= 4; /* picture: a */
796 else if( nFontType
& DEVICE_FONTTYPE
)
797 idx
= 1; /* picture: printer */
799 ImageList_Draw( himlTT
, idx
, lpdi
->hDC
, lpdi
->rcItem
.left
,
800 lpdi
->rcItem
.top
, ILD_TRANSPARENT
);
804 /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
806 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
808 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
,
809 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
813 /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
814 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
816 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
+ 25+5,
817 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
818 cr
= SendMessageW(lpdi
->hwndItem
, CB_GETITEMDATA
, lpdi
->itemID
,0L);
819 hBrush
= CreateSolidBrush(cr
);
822 hBrush
= SelectObject (lpdi
->hDC
, hBrush
) ;
823 rect
.right
=rect
.left
+25;
827 Rectangle( lpdi
->hDC
, rect
.left
, rect
.top
,
828 rect
.right
, rect
.bottom
);
829 DeleteObject( SelectObject (lpdi
->hDC
, hBrush
)) ;
836 return TRUE
; /* this should never happen */
838 if (lpdi
->itemState
& ODS_SELECTED
)
840 SetTextColor(lpdi
->hDC
, oldText
);
841 SetBkColor(lpdi
->hDC
, oldBk
);
847 /***********************************************************************
848 * CFn_WMCommand [internal]
850 LRESULT
CFn_WMCommand(HWND hDlg
, WPARAM wParam
, LPARAM lParam
,
856 LPLOGFONTW lpxx
=lpcf
->lpLogFont
;
858 TRACE("WM_COMMAND wParam=%08lX lParam=%08lX\n", (LONG
)wParam
, lParam
);
859 switch (LOWORD(wParam
))
862 if (HIWORD(wParam
)==CBN_SELCHANGE
)
864 INT pointsize
; /* save current pointsize */
865 LONG pstyle
; /* save current style */
868 if(!(hdc
= CFn_GetDC(lpcf
)))
873 idx
= SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCURSEL
, 0, 0);
874 pointsize
= (int)SendDlgItemMessageW( hDlg
, cmb3
, CB_GETITEMDATA
,
876 idx
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETCURSEL
, 0, 0);
877 pstyle
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, idx
, 0);
878 idx
= SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCURSEL
, 0, 0);
879 charset
= SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, idx
, 0);
881 SendDlgItemMessageW(hDlg
, cmb2
, CB_RESETCONTENT
, 0, 0);
882 SendDlgItemMessageW(hDlg
, cmb3
, CB_RESETCONTENT
, 0, 0);
883 SendDlgItemMessageW(hDlg
, cmb5
, CB_RESETCONTENT
, 0, 0);
884 i
=SendDlgItemMessageW(hDlg
, cmb1
, CB_GETCURSEL
, 0, 0);
887 HCURSOR hcursor
=SetCursor(LoadCursorW(0,(LPWSTR
)IDC_WAIT
));
890 SendDlgItemMessageW(hDlg
, cmb1
, CB_GETLBTEXT
, i
,
891 (LPARAM
)enumlf
.lfFaceName
);
892 TRACE("WM_COMMAND/cmb1 =>%s\n", debugstr_w(enumlf
.lfFaceName
));
893 s
.hWnd1
=GetDlgItem(hDlg
, cmb2
);
894 s
.hWnd2
=GetDlgItem(hDlg
, cmb3
);
896 enumlf
.lfCharSet
= DEFAULT_CHARSET
; /* enum all charsets */
897 enumlf
.lfPitchAndFamily
= 0;
898 EnumFontFamiliesExW(hdc
, &enumlf
,
899 (FONTENUMPROCW
)FontStyleEnumProc
, (LPARAM
)&s
, 0);
900 CFn_FitFontStyle(hDlg
, pstyle
);
901 if( pointsize
!= CB_ERR
) CFn_FitFontSize(hDlg
, pointsize
);
902 if( charset
!= CB_ERR
) CFn_FitCharSet( hDlg
, charset
);
905 CFn_ReleaseDC(lpcf
, hdc
);
912 if (HIWORD(wParam
)==CBN_SELCHANGE
|| HIWORD(wParam
)== BN_CLICKED
)
917 TRACE("WM_COMMAND/cmb2,3 =%08lX\n", lParam
);
918 i
=SendDlgItemMessageW(hDlg
,cmb1
,CB_GETCURSEL
,0,0);
920 i
=GetDlgItemTextW( hDlg
, cmb1
, str
, 256 );
923 SendDlgItemMessageW(hDlg
,cmb1
,CB_GETLBTEXT
,i
,
925 l
=SendDlgItemMessageW(hDlg
,cmb1
,CB_GETITEMDATA
,i
,0);
926 lpcf
->nFontType
= LOWORD(l
);
927 /* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
928 /* same value reported to the EnumFonts
929 call back with the extra FONTTYPE_... bits added */
930 lpxx
->lfPitchAndFamily
= HIWORD(l
) >> 8;
932 lstrcpyW(lpxx
->lfFaceName
,str
);
933 i
=SendDlgItemMessageW(hDlg
, cmb2
, CB_GETCURSEL
, 0, 0);
936 l
=SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, i
, 0);
937 if (0!=(lpxx
->lfItalic
=HIWORD(l
)))
938 lpcf
->nFontType
|= ITALIC_FONTTYPE
;
939 if ((lpxx
->lfWeight
=LOWORD(l
)) > FW_MEDIUM
)
940 lpcf
->nFontType
|= BOLD_FONTTYPE
;
942 i
=SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCURSEL
, 0, 0);
944 lpcf
->iPointSize
= 10 * LOWORD(SendDlgItemMessageW(hDlg
, cmb3
,
945 CB_GETITEMDATA
, i
, 0));
947 lpcf
->iPointSize
= 100;
948 hdc
= CFn_GetDC(lpcf
);
951 lpxx
->lfHeight
= - MulDiv( lpcf
->iPointSize
,
952 GetDeviceCaps(hdc
, LOGPIXELSY
), 720);
953 CFn_ReleaseDC(lpcf
, hdc
);
955 lpxx
->lfHeight
= -lpcf
->iPointSize
/ 10;
956 i
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCURSEL
, 0, 0);
958 lpxx
->lfCharSet
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, i
, 0);
960 lpxx
->lfCharSet
= DEFAULT_CHARSET
;
961 lpxx
->lfStrikeOut
=IsDlgButtonChecked(hDlg
,chx1
);
962 lpxx
->lfUnderline
=IsDlgButtonChecked(hDlg
,chx2
);
963 lpxx
->lfWidth
=lpxx
->lfOrientation
=lpxx
->lfEscapement
=0;
964 lpxx
->lfOutPrecision
=OUT_DEFAULT_PRECIS
;
965 lpxx
->lfClipPrecision
=CLIP_DEFAULT_PRECIS
;
966 lpxx
->lfQuality
=DEFAULT_QUALITY
;
968 wininfo
.cbSize
=sizeof(wininfo
);
970 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &wininfo
) )
972 MapWindowPoints( 0, hDlg
, (LPPOINT
) &wininfo
.rcWindow
, 2);
973 InvalidateRect( hDlg
, &wininfo
.rcWindow
, TRUE
);
979 i
=SendDlgItemMessageW(hDlg
, cmb4
, CB_GETCURSEL
, 0, 0);
984 lpcf
->rgbColors
= SendDlgItemMessageW(hDlg
, cmb4
, CB_GETITEMDATA
, i
, 0);
985 wininfo
.cbSize
=sizeof(wininfo
);
987 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &wininfo
) )
989 MapWindowPoints( 0, hDlg
, (LPPOINT
) &wininfo
.rcWindow
, 2);
990 InvalidateRect( hDlg
, &wininfo
.rcWindow
, TRUE
);
996 i
=RegisterWindowMessageW( HELPMSGSTRINGW
);
998 SendMessageW(lpcf
->hwndOwner
, i
, 0, (LPARAM
)GetPropW(hDlg
, strWineFontData
));
999 /* if (CFn_HookCallChk(lpcf))
1000 CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);*/
1004 if ( (!(lpcf
->Flags
& CF_LIMITSIZE
)) ||
1005 ( (lpcf
->Flags
& CF_LIMITSIZE
) &&
1006 (lpcf
->iPointSize
>= 10 * lpcf
->nSizeMin
) &&
1007 (lpcf
->iPointSize
<= 10 * lpcf
->nSizeMax
)))
1008 EndDialog(hDlg
, TRUE
);
1013 LoadStringW(COMDLG32_hInstance
, IDS_FONT_SIZE
, format
, sizeof(format
)/sizeof(WCHAR
));
1014 wsprintfW(buffer
, format
, lpcf
->nSizeMin
,lpcf
->nSizeMax
);
1015 MessageBoxW(hDlg
, buffer
, NULL
, MB_OK
);
1019 EndDialog(hDlg
, FALSE
);
1025 static LRESULT
CFn_WMDestroy(HWND hwnd
, WPARAM wParam
, LPARAM lParam
, LPCHOOSEFONTW lpcfw
)
1027 LPCHOOSEFONTA lpcfa
;
1029 LPLOGFONTA lpLogFonta
;
1032 lpcfa
= GetPropW(hwnd
, strWineFontData_a
);
1033 lpLogFonta
= lpcfa
->lpLogFont
;
1034 lpszStyle
= lpcfa
->lpszStyle
;
1035 memcpy(lpcfa
, lpcfw
, sizeof(CHOOSEFONTA
));
1036 lpcfa
->lpLogFont
= lpLogFonta
;
1037 lpcfa
->lpszStyle
= lpszStyle
;
1038 memcpy(lpcfa
->lpLogFont
, lpcfw
->lpLogFont
, sizeof(LOGFONTA
));
1039 WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpLogFont
->lfFaceName
,
1040 LF_FACESIZE
, lpcfa
->lpLogFont
->lfFaceName
, LF_FACESIZE
, 0, 0);
1042 if((lpcfw
->Flags
& CF_USESTYLE
) && lpcfw
->lpszStyle
) {
1043 len
= WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpszStyle
, -1, NULL
, -1, 0, 0);
1044 WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpszStyle
, -1, lpcfa
->lpszStyle
, len
, 0, 0);
1045 HeapFree(GetProcessHeap(), 0, lpcfw
->lpszStyle
);
1048 HeapFree(GetProcessHeap(), 0, lpcfw
->lpLogFont
);
1049 HeapFree(GetProcessHeap(), 0, lpcfw
);
1050 SetPropW(hwnd
, strWineFontData
, 0);
1055 LRESULT
CFn_WMPaint(HWND hDlg
, WPARAM wParam
, LPARAM lParam
, LPCHOOSEFONTW lpcf
)
1059 info
.cbSize
=sizeof(info
);
1060 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &info
) )
1066 LOGFONTW lf
= *(lpcf
->lpLogFont
);
1068 MapWindowPoints( 0, hDlg
, (LPPOINT
) &info
.rcWindow
, 2);
1069 hdc
= BeginPaint( hDlg
, &ps
);
1071 TRACE("erase %d, rect=(%ld,%ld)-(%ld,%ld)\n", ps
.fErase
,
1072 ps
.rcPaint
.left
, ps
.rcPaint
.top
,
1073 ps
.rcPaint
.right
, ps
.rcPaint
.bottom
);
1076 MoveToEx( hdc
, info
.rcWindow
.left
, info
.rcWindow
.bottom
, NULL
);
1077 hOrigPen
=SelectObject( hdc
, CreatePen( PS_SOLID
, 2,
1078 GetSysColor( COLOR_3DSHADOW
) ));
1079 LineTo( hdc
, info
.rcWindow
.left
, info
.rcWindow
.top
);
1080 LineTo( hdc
, info
.rcWindow
.right
, info
.rcWindow
.top
);
1081 DeleteObject(SelectObject( hdc
, CreatePen( PS_SOLID
, 2,
1082 GetSysColor( COLOR_3DLIGHT
) )));
1083 LineTo( hdc
, info
.rcWindow
.right
, info
.rcWindow
.bottom
);
1084 LineTo( hdc
, info
.rcWindow
.left
, info
.rcWindow
.bottom
);
1085 DeleteObject(SelectObject( hdc
, hOrigPen
));
1087 /* Draw the sample text itself */
1088 info
.rcWindow
.right
--;
1089 info
.rcWindow
.bottom
--;
1090 info
.rcWindow
.top
++;
1091 info
.rcWindow
.left
++;
1092 hOrigFont
= SelectObject( hdc
, CreateFontIndirectW( &lf
) );
1093 SetTextColor( hdc
, lpcf
->rgbColors
);
1096 sample_lang_text
[CHARSET_ORDER
[lpcf
->lpLogFont
->lfCharSet
]],
1097 -1, &info
.rcWindow
, DT_CENTER
|DT_VCENTER
|DT_SINGLELINE
);
1099 DeleteObject(SelectObject( hdc
, hOrigFont
));
1100 EndPaint( hDlg
, &ps
);
1105 /***********************************************************************
1106 * FormatCharDlgProcA [internal]
1108 INT_PTR CALLBACK
FormatCharDlgProcA(HWND hDlg
, UINT uMsg
, WPARAM wParam
,
1111 LPCHOOSEFONTW lpcfw
;
1112 LPCHOOSEFONTA lpcfa
;
1113 INT_PTR res
= FALSE
;
1116 if (uMsg
!=WM_INITDIALOG
) {
1117 lpcfw
= (LPCHOOSEFONTW
)GetPropW(hDlg
, strWineFontData
);
1120 if (CFn_HookCallChk32(lpcfw
))
1121 res
=CallWindowProcA((WNDPROC
)lpcfw
->lpfnHook
, hDlg
, uMsg
, wParam
, lParam
);
1125 lpcfa
=(LPCHOOSEFONTA
)lParam
;
1126 SetPropW(hDlg
, strWineFontData_a
, (HANDLE
)lParam
);
1128 lpcfw
= HeapAlloc(GetProcessHeap(), 0, sizeof(CHOOSEFONTW
));
1129 memcpy(lpcfw
, lpcfa
, sizeof(CHOOSEFONTA
));
1130 lpcfw
->lpLogFont
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOGFONTW
));
1131 memcpy(lpcfw
->lpLogFont
, lpcfa
->lpLogFont
, sizeof(LOGFONTA
));
1132 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpLogFont
->lfFaceName
,
1133 LF_FACESIZE
, lpcfw
->lpLogFont
->lfFaceName
, LF_FACESIZE
);
1135 if((lpcfa
->Flags
& CF_USESTYLE
) && lpcfa
->lpszStyle
) {
1136 len
= MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpszStyle
, -1, NULL
, 0);
1137 lpcfw
->lpszStyle
= HeapAlloc(GetProcessHeap(), 0, len
*sizeof(WCHAR
));
1138 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpszStyle
, -1, lpcfw
->lpszStyle
, len
);
1141 if (!CFn_WMInitDialog(hDlg
, wParam
, lParam
, lpcfw
))
1143 TRACE("CFn_WMInitDialog returned FALSE\n");
1146 if (CFn_HookCallChk32(lpcfw
))
1147 return CallWindowProcA((WNDPROC
)lpcfa
->lpfnHook
,hDlg
,WM_INITDIALOG
,wParam
,lParam
);
1151 case WM_MEASUREITEM
:
1152 return CFn_WMMeasureItem(hDlg
, wParam
, lParam
);
1154 return CFn_WMDrawItem(hDlg
, wParam
, lParam
);
1156 return CFn_WMCommand(hDlg
, wParam
, lParam
, lpcfw
);
1158 return CFn_WMDestroy(hDlg
, wParam
, lParam
, lpcfw
);
1159 case WM_CHOOSEFONT_GETLOGFONT
:
1160 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam
);
1161 FIXME("current logfont back to caller\n");
1164 return CFn_WMPaint(hDlg
, wParam
, lParam
, lpcfw
);
1169 /***********************************************************************
1170 * FormatCharDlgProcW [internal]
1172 INT_PTR CALLBACK
FormatCharDlgProcW(HWND hDlg
, UINT uMsg
, WPARAM wParam
,
1176 INT_PTR res
= FALSE
;
1178 if (uMsg
!=WM_INITDIALOG
)
1180 lpcf
=(LPCHOOSEFONTW
)GetPropW(hDlg
, strWineFontData
);
1183 if (CFn_HookCallChk32(lpcf
))
1184 res
=CallWindowProcW((WNDPROC
)lpcf
->lpfnHook
, hDlg
, uMsg
, wParam
, lParam
);
1190 lpcf
=(LPCHOOSEFONTW
)lParam
;
1191 if (!CFn_WMInitDialog(hDlg
, wParam
, lParam
, lpcf
))
1193 TRACE("CFn_WMInitDialog returned FALSE\n");
1196 if (CFn_HookCallChk32(lpcf
))
1197 return CallWindowProcW((WNDPROC
)lpcf
->lpfnHook
,hDlg
,WM_INITDIALOG
,wParam
,lParam
);
1201 case WM_MEASUREITEM
:
1202 return CFn_WMMeasureItem(hDlg
, wParam
, lParam
);
1204 return CFn_WMDrawItem(hDlg
, wParam
, lParam
);
1206 return CFn_WMCommand(hDlg
, wParam
, lParam
, lpcf
);
1209 case WM_CHOOSEFONT_GETLOGFONT
:
1210 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam
);
1211 FIXME("current logfont back to caller\n");
1214 return CFn_WMPaint(hDlg
, wParam
, lParam
, lpcf
);