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"
38 WINE_DEFAULT_DEBUG_CHANNEL(commdlg
);
44 LPCHOOSEFONTW lpcf32w
;
46 } CFn_ENUMSTRUCT
, *LPCFn_ENUMSTRUCT
;
49 static const WCHAR strWineFontData
[] = {'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A',0};
50 static const WCHAR strWineFontData_a
[] =
51 {'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A','_','A',0};
52 static const WCHAR chooseFontW
[] = {'C','H','O','O','S','E','_','F','O','N','T',0};
54 /* image list with TrueType bitmaps and more */
55 static HIMAGELIST himlTT
= 0;
56 #define TTBITMAP_XSIZE 20 /* x-size of the bitmaps */
58 static INT_PTR CALLBACK
FormatCharDlgProcA(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
59 static INT_PTR CALLBACK
FormatCharDlgProcW(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
61 /* There is a table here of all charsets, and the sample text for each.
62 * There is a second table that translates a charset into an index into
66 #define CI(cs) ((IDS_CHARSET_##cs)-IDS_CHARSET_ANSI)
69 static const WCHAR stWestern
[]={'A','a','B','b','Y','y','Z','z',0}; /* Western and default */
70 static const WCHAR stSymbol
[]={'S','y','m','b','o','l',0}; /* Symbol */
71 static const WCHAR stShiftJis
[]={'A','a',0x3042,0x3041,0x30a2,0x30a1,0x4e9c,0x5b87,0}; /* Shift JIS */
72 static const WCHAR stHangul
[]={0xac00,0xb098,0xb2e4,'A','a','B','Y','y','Z','z',0}; /* Hangul */
73 static const WCHAR stGB2312
[]={0x5fae,0x8f6f,0x4e2d,0x6587,0x8f6f,0x4ef6,0}; /* GB2312 */
74 static const WCHAR stBIG5
[]={0x4e2d,0x6587,0x5b57,0x578b,0x7bc4,0x4f8b,0}; /* BIG5 */
75 static const WCHAR stGreek
[]={'A','a','B','b',0x0391,0x03b1,0x0392,0x03b2,0}; /* Greek */
76 static const WCHAR stTurkish
[]={'A','a','B','b',0x011e,0x011f,0x015e,0x015f,0}; /* Turkish */
77 static const WCHAR stHebrew
[]={'A','a','B','b',0x05e0,0x05e1,0x05e9,0x05ea,0}; /* Hebrew */
78 static const WCHAR stArabic
[]={'A','a','B','b',0x0627,0x0628,0x062c,0x062f,0x0647,0x0648,0x0632,0};/* Arabic */
79 static const WCHAR stBaltic
[]={'A','a','B','b','Y','y','Z','z',0}; /* Baltic */
80 static const WCHAR stVietname
[]={'A','a','B','b',0x01a0,0x01a1,0x01af,0x01b0,0}; /* Vietnamese */
81 static const WCHAR stCyrillic
[]={'A','a','B','b',0x0411,0x0431,0x0424,0x0444,0}; /* Cyrillic */
82 static const WCHAR stEastEur
[]={'A','a','B','b',0xc1,0xe1,0xd4,0xf4,0}; /* East European */
83 static const WCHAR stThai
[]={'A','a','B','b',0x0e2d,0x0e31,0x0e01,0x0e29,0x0e23,0x0e44,0x0e17,0x0e22,0}; /* Thai */
84 static const WCHAR stJohab
[]={0xac00,0xb098,0xb2e4,'A','a','B','Y','y','Z','z',0}; /* Johab */
85 static const WCHAR stMac
[]={'A','a','B','b','Y','y','Z','z',0}; /* Mac */
86 static const WCHAR stOEM
[]={'A','a','B','b',0xf8,0xf1,0xfd,0}; /* OEM */
87 /* the following character sets actually behave different (Win2K observation):
88 * the sample string is 'sticky': it uses the sample string of the previous
89 * selected character set. That behaviour looks like some default, which is
90 * not (yet) implemented. */
91 static const WCHAR stVISCII
[]={'A','a','B','b',0}; /* VISCII */
92 static const WCHAR stTCVN
[]={'A','a','B','b',0}; /* TCVN */
93 static const WCHAR stKOI8
[]={'A','a','B','b',0}; /* KOI-8 */
94 static const WCHAR stIso88593
[]={'A','a','B','b',0}; /* ISO-8859-3 */
95 static const WCHAR stIso88594
[]={'A','a','B','b',0}; /* ISO-8859-4 */
96 static const WCHAR stIso885910
[]={'A','a','B','b',0}; /* ISO-8859-10 */
97 static const WCHAR stCeltic
[]={'A','a','B','b',0};/* Celtic */
99 static const WCHAR
* const sample_lang_text
[]={
100 stWestern
,stSymbol
,stShiftJis
,stHangul
,stGB2312
,
101 stBIG5
,stGreek
,stTurkish
,stHebrew
,stArabic
,
102 stBaltic
,stVietname
,stCyrillic
,stEastEur
,stThai
,
103 stJohab
,stMac
,stOEM
,stVISCII
,stTCVN
,
104 stKOI8
,stIso88593
,stIso88594
,stIso885910
,stCeltic
};
107 static const BYTE CHARSET_ORDER
[256]={
108 CI(ANSI
), 0, CI(SYMBOL
), 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(MAC
), 0, 0,
113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116 CI(JIS
), CI(HANGUL
), CI(JOHAB
), 0, 0, 0, CI(GB2312
), 0, CI(BIG5
), 0, 0, 0, 0, 0, 0, 0,
117 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
118 0, CI(GREEK
), CI(TURKISH
), CI(VIETNAMESE
), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
119 0, CI(HEBREW
), CI(ARABIC
), 0, 0, 0, 0, 0, 0, 0, CI(BALTIC
), 0, 0, 0, 0, 0,
120 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(RUSSIAN
), 0, 0, 0,
121 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(THAI
), 0,
122 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CI(EE
), 0,
123 CI(VISCII
), CI(TCVN
), CI(KOI8
), CI(ISO3
), CI(ISO4
), CI(ISO10
), CI(CELTIC
), 0, 0, 0, 0, 0, 0, 0, 0, CI(OEM
),
126 static const struct {
130 #define XX(x) { x, #x },
135 XX(CF_ENABLETEMPLATE
)
136 XX(CF_ENABLETEMPLATEHANDLE
)
137 XX(CF_INITTOLOGFONTSTRUCT
)
145 XX(CF_FIXEDPITCHONLY
)
147 XX(CF_FORCEFONTEXIST
)
159 static void _dump_cf_flags(DWORD cflags
)
163 for (i
= 0; i
< sizeof(cfflags
)/sizeof(cfflags
[0]); i
++)
164 if (cfflags
[i
].mask
& cflags
)
165 TRACE("%s|",cfflags
[i
].name
);
169 /***********************************************************************
170 * ChooseFontW (COMDLG32.@)
172 * Create a font dialog box.
175 * lpChFont [I/O] in: information to initialize the dialog box.
176 * out: User's color selection
179 * TRUE: Ok button clicked.
180 * FALSE: Cancel button clicked, or error.
182 BOOL WINAPI
ChooseFontW(LPCHOOSEFONTW lpChFont
)
189 TRACE("(%p)\n", lpChFont
);
191 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATEHANDLE
)!=0 )
193 template=lpChFont
->hInstance
;
196 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATE
)!=0 )
198 hDlginst
=lpChFont
->hInstance
;
199 if( !(hResInfo
= FindResourceW(hDlginst
, lpChFont
->lpTemplateName
,
202 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
207 hDlginst
=COMDLG32_hInstance
;
208 if (!(hResInfo
= FindResourceW(hDlginst
, chooseFontW
, (LPWSTR
)RT_DIALOG
)))
210 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
214 if (!(hDlgTmpl
= LoadResource(hDlginst
, hResInfo
)) ||
215 !(template = LockResource( hDlgTmpl
)))
217 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE
);
221 if (TRACE_ON(commdlg
))
222 _dump_cf_flags(lpChFont
->Flags
);
224 if (lpChFont
->Flags
& CF_SELECTSCRIPT
)
225 FIXME(": unimplemented flag (ignored)\n");
227 return DialogBoxIndirectParamW(COMDLG32_hInstance
, template,
228 lpChFont
->hwndOwner
, FormatCharDlgProcW
, (LPARAM
)lpChFont
);
231 /***********************************************************************
232 * ChooseFontA (COMDLG32.@)
236 BOOL WINAPI
ChooseFontA(LPCHOOSEFONTA lpChFont
)
243 TRACE("(%p)\n", lpChFont
);
245 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATEHANDLE
)!=0 )
247 template=lpChFont
->hInstance
;
250 if ( (lpChFont
->Flags
&CF_ENABLETEMPLATE
)!=0 )
252 hDlginst
=lpChFont
->hInstance
;
253 if( !(hResInfo
= FindResourceA(hDlginst
, lpChFont
->lpTemplateName
,
256 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
261 hDlginst
=COMDLG32_hInstance
;
262 if (!(hResInfo
= FindResourceW(hDlginst
, chooseFontW
, (LPWSTR
)RT_DIALOG
)))
264 COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE
);
268 if (!(hDlgTmpl
= LoadResource(hDlginst
, hResInfo
)) ||
269 !(template = LockResource( hDlgTmpl
)))
271 COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE
);
275 if (TRACE_ON(commdlg
))
276 _dump_cf_flags(lpChFont
->Flags
);
277 if (lpChFont
->Flags
& CF_SELECTSCRIPT
)
278 FIXME(": unimplemented flag (ignored)\n");
280 return DialogBoxIndirectParamA(COMDLG32_hInstance
, template,
281 lpChFont
->hwndOwner
, FormatCharDlgProcA
, (LPARAM
)lpChFont
);
284 #define TEXT_EXTRAS 4
285 #define TEXT_COLORS 16
287 static const COLORREF textcolors
[TEXT_COLORS
]=
289 0x00000000L
,0x00000080L
,0x00008000L
,0x00008080L
,
290 0x00800000L
,0x00800080L
,0x00808000L
,0x00808080L
,
291 0x00c0c0c0L
,0x000000ffL
,0x0000ff00L
,0x0000ffffL
,
292 0x00ff0000L
,0x00ff00ffL
,0x00ffff00L
,0x00FFFFFFL
295 /***********************************************************************
296 * CFn_HookCallChk32 [internal]
298 static BOOL
CFn_HookCallChk32(const CHOOSEFONTW
*lpcf
)
301 if(lpcf
->Flags
& CF_ENABLEHOOK
)
307 /*************************************************************************
308 * AddFontFamily [internal]
310 static INT
AddFontFamily(const ENUMLOGFONTEXW
*lpElfex
, const NEWTEXTMETRICEXW
*lpNTM
,
311 UINT nFontType
, const CHOOSEFONTW
*lpcf
, HWND hwnd
, LPCFn_ENUMSTRUCT e
)
315 const LOGFONTW
*lplf
= &(lpElfex
->elfLogFont
);
317 TRACE("font=%s (nFontType=%d)\n", debugstr_w(lplf
->lfFaceName
), nFontType
);
319 if (lpcf
->Flags
& CF_FIXEDPITCHONLY
)
320 if (!(lplf
->lfPitchAndFamily
& FIXED_PITCH
))
322 if (lpcf
->Flags
& CF_ANSIONLY
)
323 if (lplf
->lfCharSet
!= ANSI_CHARSET
)
325 if (lpcf
->Flags
& CF_TTONLY
)
326 if (!(nFontType
& TRUETYPE_FONTTYPE
))
328 if (lpcf
->Flags
& CF_NOVERTFONTS
)
329 if (lplf
->lfFaceName
[0] == '@')
334 i
=SendMessageW(hwnd
, CB_FINDSTRINGEXACT
, 0, (LPARAM
)lplf
->lfFaceName
);
336 i
= SendMessageW(hwnd
, CB_ADDSTRING
, 0, (LPARAM
)lplf
->lfFaceName
);
338 /* store some important font information */
339 w
= (lplf
->lfPitchAndFamily
) << 8 |
340 (HIWORD(lpNTM
->ntmTm
.ntmFlags
) & 0xff);
341 SendMessageW(hwnd
, CB_SETITEMDATA
, i
, MAKELONG(nFontType
,w
));
347 /*************************************************************************
348 * FontFamilyEnumProc32 [internal]
350 static INT WINAPI
FontFamilyEnumProc(const ENUMLOGFONTEXW
*lpElfex
,
351 const TEXTMETRICW
*metrics
, DWORD dwFontType
, LPARAM lParam
)
354 e
=(LPCFn_ENUMSTRUCT
)lParam
;
355 return AddFontFamily( lpElfex
, (const NEWTEXTMETRICEXW
*) metrics
,
356 dwFontType
, e
->lpcf32w
, e
->hWnd1
, e
);
359 /*************************************************************************
360 * SetFontStylesToCombo2 [internal]
362 * Fill font style information into combobox (without using font.c directly)
364 static BOOL
SetFontStylesToCombo2(HWND hwnd
, HDC hdc
, const LOGFONTW
*lplf
)
373 static const struct FONTSTYLE fontstyles
[FSTYLES
]={
374 { 0, FW_NORMAL
, IDS_FONT_REGULAR
},
375 { 1, FW_NORMAL
, IDS_FONT_ITALIC
},
376 { 0, FW_BOLD
, IDS_FONT_BOLD
},
377 { 1, FW_BOLD
, IDS_FONT_BOLD_ITALIC
}
386 for (i
=0;i
<FSTYLES
;i
++)
388 lf
.lfItalic
=fontstyles
[i
].italic
;
389 lf
.lfWeight
=fontstyles
[i
].weight
;
390 hf
=CreateFontIndirectW(&lf
);
391 hf
=SelectObject(hdc
,hf
);
392 GetTextMetricsW(hdc
,&tm
);
393 hf
=SelectObject(hdc
,hf
);
395 /* font successful created ? */
396 if (((fontstyles
[i
].weight
== FW_NORMAL
&& tm
.tmWeight
<= FW_MEDIUM
) ||
397 (fontstyles
[i
].weight
== FW_BOLD
&& tm
.tmWeight
> FW_MEDIUM
)) &&
398 ((tm
.tmItalic
!= 0)==fontstyles
[i
].italic
))
401 LoadStringW(COMDLG32_hInstance
, fontstyles
[i
].resId
, name
, 64);
402 j
=SendMessageW(hwnd
,CB_ADDSTRING
,0,(LPARAM
)name
);
403 if (j
==CB_ERR
) return TRUE
;
404 j
=SendMessageW(hwnd
, CB_SETITEMDATA
, j
,
405 MAKELONG(tm
.tmWeight
,fontstyles
[i
].italic
));
406 if (j
==CB_ERR
) return TRUE
;
412 /*************************************************************************
413 * AddFontSizeToCombo3 [internal]
415 static BOOL
AddFontSizeToCombo3(HWND hwnd
, UINT h
, const CHOOSEFONTW
*lpcf
)
419 static const WCHAR strFormat
[] = {'%','2','d',0};
421 if ( (!(lpcf
->Flags
& CF_LIMITSIZE
)) ||
422 ((lpcf
->Flags
& CF_LIMITSIZE
) && (h
>= lpcf
->nSizeMin
) && (h
<= lpcf
->nSizeMax
)))
424 wsprintfW(buffer
, strFormat
, h
);
425 j
=SendMessageW(hwnd
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)buffer
);
428 j
=SendMessageW(hwnd
, CB_ADDSTRING
, 0, (LPARAM
)buffer
);
429 if (j
!=CB_ERR
) j
= SendMessageW(hwnd
, CB_SETITEMDATA
, j
, h
);
430 if (j
==CB_ERR
) return TRUE
;
436 /*************************************************************************
437 * SetFontSizesToCombo3 [internal]
439 static BOOL
SetFontSizesToCombo3(HWND hwnd
, const CHOOSEFONTW
*lpcf
)
441 static const BYTE sizes
[]={6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
444 for (i
= 0; i
< sizeof(sizes
)/sizeof(sizes
[0]); i
++)
445 if (AddFontSizeToCombo3(hwnd
, sizes
[i
], lpcf
)) return TRUE
;
449 /*************************************************************************
450 * CFn_GetDC [internal]
452 static inline HDC
CFn_GetDC(const CHOOSEFONTW
*lpcf
)
454 HDC ret
= ((lpcf
->Flags
& CF_PRINTERFONTS
) && lpcf
->hDC
) ?
457 if(!ret
) ERR("HDC failure!!!\n");
461 /*************************************************************************
462 * GetScreenDPI [internal]
464 static inline int GetScreenDPI(void)
470 result
= GetDeviceCaps(hdc
, LOGPIXELSY
);
476 /*************************************************************************
477 * CFn_ReleaseDC [internal]
479 static inline void CFn_ReleaseDC(const CHOOSEFONTW
*lpcf
, HDC hdc
)
481 if(!((lpcf
->Flags
& CF_PRINTERFONTS
) && lpcf
->hDC
))
485 /***********************************************************************
486 * AddFontStyle [internal]
488 static INT
AddFontStyle( const ENUMLOGFONTEXW
*lpElfex
, const NEWTEXTMETRICEXW
*lpNTM
,
489 UINT nFontType
, const CHOOSEFONTW
*lpcf
, HWND hcmb2
, HWND hcmb3
, HWND hDlg
)
492 const LOGFONTW
*lplf
= &(lpElfex
->elfLogFont
);
496 TRACE("(nFontType=%d)\n",nFontType
);
497 TRACE(" %s h=%d w=%d e=%d o=%d wg=%d i=%d u=%d s=%d"
498 " ch=%d op=%d cp=%d q=%d pf=%xh\n",
499 debugstr_w(lplf
->lfFaceName
),lplf
->lfHeight
,lplf
->lfWidth
,
500 lplf
->lfEscapement
,lplf
->lfOrientation
,
501 lplf
->lfWeight
,lplf
->lfItalic
,lplf
->lfUnderline
,
502 lplf
->lfStrikeOut
,lplf
->lfCharSet
, lplf
->lfOutPrecision
,
503 lplf
->lfClipPrecision
,lplf
->lfQuality
, lplf
->lfPitchAndFamily
);
504 if (nFontType
& RASTER_FONTTYPE
)
507 points
= MulDiv( lpNTM
->ntmTm
.tmHeight
- lpNTM
->ntmTm
.tmInternalLeading
,
509 if (AddFontSizeToCombo3(hcmb3
, points
, lpcf
))
511 } else if (SetFontSizesToCombo3(hcmb3
, lpcf
)) return 0;
513 if (!SendMessageW(hcmb2
, CB_GETCOUNT
, 0, 0))
516 if(!(hdc
= CFn_GetDC(lpcf
))) return 0;
517 res
= SetFontStylesToCombo2(hcmb2
,hdc
,lplf
);
518 CFn_ReleaseDC(lpcf
, hdc
);
522 if (!( hcmb5
= GetDlgItem(hDlg
, cmb5
))) return 1;
523 i
= SendMessageW( hcmb5
, CB_FINDSTRINGEXACT
, 0,
524 (LPARAM
)lpElfex
->elfScript
);
526 i
= SendMessageW( hcmb5
, CB_ADDSTRING
, 0,
527 (LPARAM
)lpElfex
->elfScript
);
529 SendMessageW( hcmb5
, CB_SETITEMDATA
, i
, lplf
->lfCharSet
);
534 static BOOL
CFn_FitFontSize( HWND hDlg
, int points
)
538 /* look for fitting font size in combobox3 */
539 n
=SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCOUNT
, 0, 0);
542 if (points
== (int)SendDlgItemMessageW
543 (hDlg
,cmb3
, CB_GETITEMDATA
,i
,0))
545 SendDlgItemMessageW(hDlg
,cmb3
,CB_SETCURSEL
,i
,0);
546 SendMessageW(hDlg
, WM_COMMAND
,
547 MAKEWPARAM(cmb3
, CBN_SELCHANGE
),
548 (LPARAM
)GetDlgItem(hDlg
,cmb3
));
556 static BOOL
CFn_FitFontStyle( HWND hDlg
, LONG packedstyle
)
561 /* look for fitting font style in combobox2 */
562 for (i
=0;i
<TEXT_EXTRAS
;i
++)
564 id
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, i
, 0);
565 if (packedstyle
== id
)
567 SendDlgItemMessageW(hDlg
, cmb2
, CB_SETCURSEL
, i
, 0);
568 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb2
, CBN_SELCHANGE
),
569 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
578 static BOOL
CFn_FitCharSet( HWND hDlg
, int charset
)
581 /* look for fitting char set in combobox5 */
582 n
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCOUNT
, 0, 0);
585 cs
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, i
, 0);
588 SendDlgItemMessageW(hDlg
, cmb5
, CB_SETCURSEL
, i
, 0);
589 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
590 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
594 /* no charset fits: select the first one in the list */
595 SendDlgItemMessageW(hDlg
, cmb5
, CB_SETCURSEL
, 0, 0);
596 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
597 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
601 /***********************************************************************
602 * FontStyleEnumProc32 [internal]
604 static INT WINAPI
FontStyleEnumProc( const ENUMLOGFONTEXW
*lpElfex
,
605 const TEXTMETRICW
*metrics
, DWORD dwFontType
, LPARAM lParam
)
607 LPCFn_ENUMSTRUCT s
=(LPCFn_ENUMSTRUCT
)lParam
;
610 HWND hDlg
=GetParent(hcmb3
);
611 return AddFontStyle( lpElfex
, (const NEWTEXTMETRICEXW
*) metrics
,
612 dwFontType
, s
->lpcf32w
, hcmb2
, hcmb3
, hDlg
);
615 /***********************************************************************
616 * CFn_WMInitDialog [internal]
618 static LRESULT
CFn_WMInitDialog(HWND hDlg
, LPARAM lParam
, LPCHOOSEFONTW lpcf
)
626 HCURSOR hcursor
=SetCursor(LoadCursorW(0,(LPWSTR
)IDC_WAIT
));
627 static const WCHAR strColorName
[] = {'[','c','o','l','o','r',' ','n','a','m','e',']',0};
629 SetPropW(hDlg
, strWineFontData
, lpcf
);
630 lpxx
=lpcf
->lpLogFont
;
631 TRACE("WM_INITDIALOG lParam=%08lX\n", lParam
);
633 if (lpcf
->lStructSize
!= sizeof(CHOOSEFONTW
))
635 ERR("structure size failure!!!\n");
640 himlTT
= ImageList_LoadImageW( COMDLG32_hInstance
, MAKEINTRESOURCEW(38),
641 TTBITMAP_XSIZE
, 0, CLR_DEFAULT
, IMAGE_BITMAP
, 0);
643 /* Set effect flags */
644 if((lpcf
->Flags
& CF_EFFECTS
) && (lpcf
->Flags
& CF_INITTOLOGFONTSTRUCT
))
646 if(lpxx
->lfUnderline
)
647 CheckDlgButton(hDlg
, chx2
, TRUE
);
648 if(lpxx
->lfStrikeOut
)
649 CheckDlgButton(hDlg
, chx1
, TRUE
);
652 if (!(lpcf
->Flags
& CF_SHOWHELP
) || !IsWindow(lpcf
->hwndOwner
))
653 ShowWindow(GetDlgItem(hDlg
,pshHelp
),SW_HIDE
);
654 if (!(lpcf
->Flags
& CF_APPLY
))
655 ShowWindow(GetDlgItem(hDlg
,psh3
),SW_HIDE
);
656 if (lpcf
->Flags
& CF_NOSCRIPTSEL
)
657 EnableWindow(GetDlgItem(hDlg
,cmb5
),FALSE
);
658 if (lpcf
->Flags
& CF_EFFECTS
)
660 for (i
=0;i
<TEXT_COLORS
;i
++)
664 if( LoadStringW(COMDLG32_hInstance
, IDS_COLOR_BLACK
+i
, name
,
665 sizeof(name
)/sizeof(*name
) )==0 )
667 memcpy(name
, strColorName
, sizeof(strColorName
));
669 j
=SendDlgItemMessageW(hDlg
, cmb4
, CB_ADDSTRING
, 0, (LPARAM
)name
);
670 SendDlgItemMessageW(hDlg
, cmb4
, CB_SETITEMDATA
, j
, textcolors
[i
]);
671 /* look for a fitting value in color combobox */
672 if (textcolors
[i
]==lpcf
->rgbColors
)
673 SendDlgItemMessageW(hDlg
,cmb4
, CB_SETCURSEL
,j
,0);
678 ShowWindow(GetDlgItem(hDlg
,cmb4
),SW_HIDE
);
679 ShowWindow(GetDlgItem(hDlg
,chx1
),SW_HIDE
);
680 ShowWindow(GetDlgItem(hDlg
,chx2
),SW_HIDE
);
681 ShowWindow(GetDlgItem(hDlg
,grp1
),SW_HIDE
);
682 ShowWindow(GetDlgItem(hDlg
,stc4
),SW_HIDE
);
684 if(!(hdc
= CFn_GetDC(lpcf
)))
689 s
.hWnd1
=GetDlgItem(hDlg
,cmb1
);
694 elf
.lfCharSet
= DEFAULT_CHARSET
; /* enum all charsets */
695 elf
.lfPitchAndFamily
= 0;
696 elf
.lfFaceName
[0] = '\0'; /* enum all fonts */
697 if (!EnumFontFamiliesExW(hdc
, &elf
, (FONTENUMPROCW
)FontFamilyEnumProc
, (LPARAM
)&s
, 0))
699 TRACE("EnumFontFamiliesEx returns 0\n");
703 if (lpcf
->Flags
& CF_FIXEDPITCHONLY
) {
704 FIXME("No font found with fixed pitch only, dropping flag.\n");
705 lpcf
->Flags
&= ~CF_FIXEDPITCHONLY
;
708 if (lpcf
->Flags
& CF_TTONLY
) {
709 FIXME("No font found with truetype only, dropping flag.\n");
710 lpcf
->Flags
&= ~CF_TTONLY
;
717 if (lpcf
->Flags
& CF_INITTOLOGFONTSTRUCT
)
719 /* look for fitting font name in combobox1 */
720 j
=SendDlgItemMessageW(hDlg
,cmb1
,CB_FINDSTRING
,-1,(LPARAM
)lpxx
->lfFaceName
);
723 INT height
= lpxx
->lfHeight
< 0 ? -lpxx
->lfHeight
:
726 int charset
= lpxx
->lfCharSet
;
727 points
= MulDiv( height
, 72, GetScreenDPI());
728 pstyle
= MAKELONG(lpxx
->lfWeight
> FW_MEDIUM
? FW_BOLD
:
729 FW_NORMAL
,lpxx
->lfItalic
!=0);
730 SendDlgItemMessageW(hDlg
, cmb1
, CB_SETCURSEL
, j
, 0);
731 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb1
, CBN_SELCHANGE
),
732 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
734 /* look for fitting font style in combobox2 */
735 CFn_FitFontStyle(hDlg
, pstyle
);
736 /* look for fitting font size in combobox3 */
737 CFn_FitFontSize(hDlg
, points
);
738 CFn_FitCharSet( hDlg
, charset
);
743 SendDlgItemMessageW(hDlg
,cmb1
,CB_SETCURSEL
,0,0);
744 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb1
, CBN_SELCHANGE
),
745 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
746 SendDlgItemMessageW(hDlg
,cmb2
,CB_SETCURSEL
,0,0);
747 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb2
, CBN_SELCHANGE
),
748 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
749 SendDlgItemMessageW(hDlg
,cmb3
,CB_SETCURSEL
,0,0);
750 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb3
, CBN_SELCHANGE
),
751 (LPARAM
)GetDlgItem(hDlg
,cmb3
));
752 SendDlgItemMessageW(hDlg
,cmb5
,CB_SETCURSEL
,0,0);
753 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
754 (LPARAM
)GetDlgItem(hDlg
,cmb5
));
756 if ((lpcf
->Flags
& CF_USESTYLE
) && lpcf
->lpszStyle
)
758 j
=SendDlgItemMessageW(hDlg
,cmb2
,CB_FINDSTRING
,-1,(LPARAM
)lpcf
->lpszStyle
);
761 j
=SendDlgItemMessageW(hDlg
,cmb2
,CB_SETCURSEL
,j
,0);
762 SendMessageW(hDlg
,WM_COMMAND
,cmb2
,
763 MAKELONG(LOWORD(GetDlgItem(hDlg
,cmb2
)),CBN_SELCHANGE
));
766 CFn_ReleaseDC(lpcf
, hdc
);
772 /***********************************************************************
773 * CFn_WMMeasureItem [internal]
775 static LRESULT
CFn_WMMeasureItem(HWND hDlg
, LPARAM lParam
)
780 LPMEASUREITEMSTRUCT lpmi
=(LPMEASUREITEMSTRUCT
)lParam
;
784 himlTT
= ImageList_LoadImageW( COMDLG32_hInstance
, MAKEINTRESOURCEW(38),
785 TTBITMAP_XSIZE
, 0, CLR_DEFAULT
, IMAGE_BITMAP
, 0);
786 ImageList_GetIconSize( himlTT
, &cx
, &height
);
787 lpmi
->itemHeight
= height
+ 2;
788 /* use MAX of bitmap height and tm.tmHeight .*/
791 hfontprev
= SelectObject( hdc
, (HFONT
)SendMessageW( hDlg
, WM_GETFONT
, 0, 0 ));
792 GetTextMetricsW(hdc
, &tm
);
793 if( tm
.tmHeight
> lpmi
->itemHeight
) lpmi
->itemHeight
= tm
.tmHeight
;
794 SelectObject(hdc
, hfontprev
);
795 ReleaseDC(hDlg
, hdc
);
800 /***********************************************************************
801 * CFn_WMDrawItem [internal]
803 static LRESULT
CFn_WMDrawItem(LPARAM lParam
)
807 COLORREF cr
, oldText
=0, oldBk
=0;
811 LPDRAWITEMSTRUCT lpdi
= (LPDRAWITEMSTRUCT
)lParam
;
813 if (lpdi
->itemID
== (UINT
)-1) /* got no items */
814 DrawFocusRect(lpdi
->hDC
, &lpdi
->rcItem
);
817 if (lpdi
->CtlType
== ODT_COMBOBOX
)
819 if (lpdi
->itemState
& ODS_SELECTED
)
821 hBrush
=GetSysColorBrush(COLOR_HIGHLIGHT
);
822 oldText
=SetTextColor(lpdi
->hDC
, GetSysColor(COLOR_HIGHLIGHTTEXT
));
823 oldBk
=SetBkColor(lpdi
->hDC
, GetSysColor(COLOR_HIGHLIGHT
));
826 hBrush
= SelectObject(lpdi
->hDC
, GetStockObject(LTGRAY_BRUSH
));
827 SelectObject(lpdi
->hDC
, hBrush
);
829 FillRect(lpdi
->hDC
, &lpdi
->rcItem
, hBrush
);
832 return TRUE
; /* this should never happen */
838 /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
839 ImageList_GetIconSize( himlTT
, &cx
, &cy
);
840 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
842 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
+ cx
+ 4,
843 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
844 nFontType
= SendMessageW(lpdi
->hwndItem
, CB_GETITEMDATA
, lpdi
->itemID
,0L);
846 if (nFontType
& TRUETYPE_FONTTYPE
) {
847 idx
= 0; /* picture: TT */
848 if( nFontType
& NTM_TT_OPENTYPE
)
849 idx
= 2; /* picture: O */
850 } else if( nFontType
& NTM_PS_OPENTYPE
)
851 idx
= 3; /* picture: O+ps */
852 else if( nFontType
& NTM_TYPE1
)
853 idx
= 4; /* picture: a */
854 else if( nFontType
& DEVICE_FONTTYPE
)
855 idx
= 1; /* picture: printer */
857 ImageList_Draw( himlTT
, idx
, lpdi
->hDC
, lpdi
->rcItem
.left
,
858 (lpdi
->rcItem
.top
+ lpdi
->rcItem
.bottom
- cy
) / 2, ILD_TRANSPARENT
);
862 /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
864 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
866 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
,
867 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
871 /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
872 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
874 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
+ 25+5,
875 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
876 cr
= SendMessageW(lpdi
->hwndItem
, CB_GETITEMDATA
, lpdi
->itemID
,0L);
877 hBrush
= CreateSolidBrush(cr
);
880 hBrush
= SelectObject (lpdi
->hDC
, hBrush
) ;
881 rect
.right
=rect
.left
+25;
885 Rectangle( lpdi
->hDC
, rect
.left
, rect
.top
,
886 rect
.right
, rect
.bottom
);
887 DeleteObject( SelectObject (lpdi
->hDC
, hBrush
)) ;
894 return TRUE
; /* this should never happen */
896 if (lpdi
->itemState
& ODS_SELECTED
)
898 SetTextColor(lpdi
->hDC
, oldText
);
899 SetBkColor(lpdi
->hDC
, oldBk
);
905 /***********************************************************************
906 * CFn_WMCommand [internal]
908 static LRESULT
CFn_WMCommand(HWND hDlg
, WPARAM wParam
, LPARAM lParam
, LPCHOOSEFONTW lpcf
)
914 if (!lpcf
) return FALSE
;
916 TRACE("WM_COMMAND wParam=%08X lParam=%08lX\n", (LONG
)wParam
, lParam
);
917 switch (LOWORD(wParam
))
920 if (HIWORD(wParam
)==CBN_SELCHANGE
)
922 INT pointsize
; /* save current pointsize */
923 LONG pstyle
; /* save current style */
926 if(!(hdc
= CFn_GetDC(lpcf
)))
931 idx
= SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCURSEL
, 0, 0);
932 pointsize
= (int)SendDlgItemMessageW( hDlg
, cmb3
, CB_GETITEMDATA
,
934 idx
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETCURSEL
, 0, 0);
935 pstyle
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, idx
, 0);
936 idx
= SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCURSEL
, 0, 0);
937 charset
= SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, idx
, 0);
939 SendDlgItemMessageW(hDlg
, cmb2
, CB_RESETCONTENT
, 0, 0);
940 SendDlgItemMessageW(hDlg
, cmb3
, CB_RESETCONTENT
, 0, 0);
941 SendDlgItemMessageW(hDlg
, cmb5
, CB_RESETCONTENT
, 0, 0);
942 i
=SendDlgItemMessageW(hDlg
, cmb1
, CB_GETCURSEL
, 0, 0);
945 HCURSOR hcursor
=SetCursor(LoadCursorW(0,(LPWSTR
)IDC_WAIT
));
948 SendDlgItemMessageW(hDlg
, cmb1
, CB_GETLBTEXT
, i
,
949 (LPARAM
)enumlf
.lfFaceName
);
950 TRACE("WM_COMMAND/cmb1 =>%s\n", debugstr_w(enumlf
.lfFaceName
));
951 s
.hWnd1
=GetDlgItem(hDlg
, cmb2
);
952 s
.hWnd2
=GetDlgItem(hDlg
, cmb3
);
954 enumlf
.lfCharSet
= DEFAULT_CHARSET
; /* enum all charsets */
955 enumlf
.lfPitchAndFamily
= 0;
956 EnumFontFamiliesExW(hdc
, &enumlf
,
957 (FONTENUMPROCW
)FontStyleEnumProc
, (LPARAM
)&s
, 0);
958 CFn_FitFontStyle(hDlg
, pstyle
);
959 if( pointsize
!= CB_ERR
) CFn_FitFontSize(hDlg
, pointsize
);
960 if( charset
!= CB_ERR
) CFn_FitCharSet( hDlg
, charset
);
963 CFn_ReleaseDC(lpcf
, hdc
);
971 if (HIWORD(wParam
)==CBN_SELCHANGE
|| HIWORD(wParam
)== BN_CLICKED
)
975 LPLOGFONTW lpxx
=lpcf
->lpLogFont
;
977 TRACE("WM_COMMAND/cmb2,3 =%08lX\n", lParam
);
978 i
=SendDlgItemMessageW(hDlg
,cmb1
,CB_GETCURSEL
,0,0);
980 i
=GetDlgItemTextW( hDlg
, cmb1
, str
, 256 );
983 SendDlgItemMessageW(hDlg
,cmb1
,CB_GETLBTEXT
,i
,
985 l
=SendDlgItemMessageW(hDlg
,cmb1
,CB_GETITEMDATA
,i
,0);
986 lpcf
->nFontType
= LOWORD(l
);
987 /* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
988 /* same value reported to the EnumFonts
989 call back with the extra FONTTYPE_... bits added */
990 lpxx
->lfPitchAndFamily
= HIWORD(l
) >> 8;
992 lstrcpynW(lpxx
->lfFaceName
, str
, sizeof(lpxx
->lfFaceName
)/sizeof(lpxx
->lfFaceName
[0]));
993 i
=SendDlgItemMessageW(hDlg
, cmb2
, CB_GETCURSEL
, 0, 0);
996 l
=SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, i
, 0);
997 if (0!=(lpxx
->lfItalic
=HIWORD(l
)))
998 lpcf
->nFontType
|= ITALIC_FONTTYPE
;
999 if ((lpxx
->lfWeight
=LOWORD(l
)) > FW_MEDIUM
)
1000 lpcf
->nFontType
|= BOLD_FONTTYPE
;
1002 i
=SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCURSEL
, 0, 0);
1004 lpcf
->iPointSize
= 10 * LOWORD(SendDlgItemMessageW(hDlg
, cmb3
,
1005 CB_GETITEMDATA
, i
, 0));
1007 lpcf
->iPointSize
= 100;
1008 lpxx
->lfHeight
= - MulDiv( lpcf
->iPointSize
,
1009 GetScreenDPI(), 720);
1010 i
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCURSEL
, 0, 0);
1012 lpxx
->lfCharSet
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, i
, 0);
1014 lpxx
->lfCharSet
= DEFAULT_CHARSET
;
1015 lpxx
->lfStrikeOut
=IsDlgButtonChecked(hDlg
,chx1
);
1016 lpxx
->lfUnderline
=IsDlgButtonChecked(hDlg
,chx2
);
1017 lpxx
->lfWidth
=lpxx
->lfOrientation
=lpxx
->lfEscapement
=0;
1018 lpxx
->lfOutPrecision
=OUT_DEFAULT_PRECIS
;
1019 lpxx
->lfClipPrecision
=CLIP_DEFAULT_PRECIS
;
1020 lpxx
->lfQuality
=DEFAULT_QUALITY
;
1022 wininfo
.cbSize
=sizeof(wininfo
);
1024 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &wininfo
) )
1026 MapWindowPoints( 0, hDlg
, (LPPOINT
) &wininfo
.rcWindow
, 2);
1027 InvalidateRect( hDlg
, &wininfo
.rcWindow
, TRUE
);
1033 i
=SendDlgItemMessageW(hDlg
, cmb4
, CB_GETCURSEL
, 0, 0);
1038 lpcf
->rgbColors
= SendDlgItemMessageW(hDlg
, cmb4
, CB_GETITEMDATA
, i
, 0);
1039 wininfo
.cbSize
=sizeof(wininfo
);
1041 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &wininfo
) )
1043 MapWindowPoints( 0, hDlg
, (LPPOINT
) &wininfo
.rcWindow
, 2);
1044 InvalidateRect( hDlg
, &wininfo
.rcWindow
, TRUE
);
1050 i
=RegisterWindowMessageW( HELPMSGSTRINGW
);
1051 if (lpcf
->hwndOwner
)
1052 SendMessageW(lpcf
->hwndOwner
, i
, 0, (LPARAM
)GetPropW(hDlg
, strWineFontData
));
1056 if ( (!(lpcf
->Flags
& CF_LIMITSIZE
)) ||
1057 ( (lpcf
->Flags
& CF_LIMITSIZE
) &&
1058 (lpcf
->iPointSize
>= 10 * lpcf
->nSizeMin
) &&
1059 (lpcf
->iPointSize
<= 10 * lpcf
->nSizeMax
)))
1060 EndDialog(hDlg
, TRUE
);
1066 LoadStringW(COMDLG32_hInstance
, IDS_FONT_SIZE
, format
, sizeof(format
)/sizeof(WCHAR
));
1067 args
[0] = lpcf
->nSizeMin
;
1068 args
[1] = lpcf
->nSizeMax
;
1069 FormatMessageW(FORMAT_MESSAGE_FROM_STRING
|FORMAT_MESSAGE_ARGUMENT_ARRAY
,
1070 format
, 0, 0, buffer
, sizeof(buffer
)/sizeof(*buffer
),
1071 (__ms_va_list
*)args
);
1072 MessageBoxW(hDlg
, buffer
, NULL
, MB_OK
);
1076 EndDialog(hDlg
, FALSE
);
1082 static LRESULT
CFn_WMDestroy(HWND hwnd
, LPCHOOSEFONTW lpcfw
)
1084 LPCHOOSEFONTA lpcfa
;
1086 LPLOGFONTA lpLogFonta
;
1089 if (!lpcfw
) return FALSE
;
1091 lpcfa
= GetPropW(hwnd
, strWineFontData_a
);
1092 lpLogFonta
= lpcfa
->lpLogFont
;
1093 lpszStyle
= lpcfa
->lpszStyle
;
1094 memcpy(lpcfa
, lpcfw
, sizeof(CHOOSEFONTA
));
1095 lpcfa
->lpLogFont
= lpLogFonta
;
1096 lpcfa
->lpszStyle
= lpszStyle
;
1097 memcpy(lpcfa
->lpLogFont
, lpcfw
->lpLogFont
, sizeof(LOGFONTA
));
1098 WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpLogFont
->lfFaceName
,
1099 LF_FACESIZE
, lpcfa
->lpLogFont
->lfFaceName
, LF_FACESIZE
, 0, 0);
1101 if((lpcfw
->Flags
& CF_USESTYLE
) && lpcfw
->lpszStyle
) {
1102 len
= WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpszStyle
, -1, NULL
, 0, 0, 0);
1103 WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpszStyle
, -1, lpcfa
->lpszStyle
, len
, 0, 0);
1104 HeapFree(GetProcessHeap(), 0, lpcfw
->lpszStyle
);
1107 HeapFree(GetProcessHeap(), 0, lpcfw
->lpLogFont
);
1108 HeapFree(GetProcessHeap(), 0, lpcfw
);
1109 SetPropW(hwnd
, strWineFontData
, 0);
1114 static LRESULT
CFn_WMPaint(HWND hDlg
, WPARAM wParam
, LPARAM lParam
, const CHOOSEFONTW
*lpcf
)
1118 if (!lpcf
) return FALSE
;
1120 info
.cbSize
=sizeof(info
);
1121 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &info
) )
1126 LOGFONTW lf
= *(lpcf
->lpLogFont
);
1128 MapWindowPoints( 0, hDlg
, (LPPOINT
) &info
.rcWindow
, 2);
1129 hdc
= BeginPaint( hDlg
, &ps
);
1131 TRACE("erase %d, rect=(%d,%d)-(%d,%d)\n", ps
.fErase
,
1132 ps
.rcPaint
.left
, ps
.rcPaint
.top
,
1133 ps
.rcPaint
.right
, ps
.rcPaint
.bottom
);
1136 DrawEdge( hdc
, &info
.rcWindow
, EDGE_SUNKEN
, BF_RECT
|BF_ADJUST
);
1138 /* Draw the sample text itself */
1139 hOrigFont
= SelectObject( hdc
, CreateFontIndirectW( &lf
) );
1140 SetTextColor( hdc
, lpcf
->rgbColors
);
1143 sample_lang_text
[CHARSET_ORDER
[lpcf
->lpLogFont
->lfCharSet
]],
1144 -1, &info
.rcWindow
, DT_CENTER
|DT_VCENTER
|DT_SINGLELINE
);
1146 DeleteObject(SelectObject( hdc
, hOrigFont
));
1147 EndPaint( hDlg
, &ps
);
1152 /***********************************************************************
1153 * FormatCharDlgProcA [internal]
1155 static INT_PTR CALLBACK
FormatCharDlgProcA(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1157 LPCHOOSEFONTW lpcfw
;
1158 LPCHOOSEFONTA lpcfa
;
1159 INT_PTR res
= FALSE
;
1162 if (uMsg
!=WM_INITDIALOG
) {
1163 lpcfw
= GetPropW(hDlg
, strWineFontData
);
1164 if (lpcfw
&& CFn_HookCallChk32(lpcfw
))
1165 res
=CallWindowProcA((WNDPROC
)lpcfw
->lpfnHook
, hDlg
, uMsg
, wParam
, lParam
);
1169 lpcfa
=(LPCHOOSEFONTA
)lParam
;
1170 SetPropW(hDlg
, strWineFontData_a
, (HANDLE
)lParam
);
1172 lpcfw
= HeapAlloc(GetProcessHeap(), 0, sizeof(CHOOSEFONTW
));
1173 memcpy(lpcfw
, lpcfa
, sizeof(CHOOSEFONTA
));
1174 lpcfw
->lpLogFont
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOGFONTW
));
1175 memcpy(lpcfw
->lpLogFont
, lpcfa
->lpLogFont
, sizeof(LOGFONTA
));
1176 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpLogFont
->lfFaceName
,
1177 LF_FACESIZE
, lpcfw
->lpLogFont
->lfFaceName
, LF_FACESIZE
);
1179 if((lpcfa
->Flags
& CF_USESTYLE
) && lpcfa
->lpszStyle
) {
1180 len
= MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpszStyle
, -1, NULL
, 0);
1181 lpcfw
->lpszStyle
= HeapAlloc(GetProcessHeap(), 0, len
*sizeof(WCHAR
));
1182 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpszStyle
, -1, lpcfw
->lpszStyle
, len
);
1185 if (!CFn_WMInitDialog(hDlg
, lParam
, lpcfw
))
1187 TRACE("CFn_WMInitDialog returned FALSE\n");
1190 if (CFn_HookCallChk32(lpcfw
))
1191 return CallWindowProcA((WNDPROC
)lpcfa
->lpfnHook
,hDlg
,WM_INITDIALOG
,wParam
,lParam
);
1195 case WM_MEASUREITEM
:
1196 return CFn_WMMeasureItem(hDlg
,lParam
);
1198 return CFn_WMDrawItem(lParam
);
1200 return CFn_WMCommand(hDlg
, wParam
, lParam
, lpcfw
);
1202 return CFn_WMDestroy(hDlg
, lpcfw
);
1203 case WM_CHOOSEFONT_GETLOGFONT
:
1205 LOGFONTA
*logfont
= (LOGFONTA
*)lParam
;
1206 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam
);
1207 memcpy( logfont
, lpcfw
->lpLogFont
, FIELD_OFFSET( LOGFONTA
, lfFaceName
));
1208 WideCharToMultiByte( CP_ACP
, 0, lpcfw
->lpLogFont
->lfFaceName
, LF_FACESIZE
,
1209 logfont
->lfFaceName
, LF_FACESIZE
, NULL
, NULL
);
1213 return CFn_WMPaint(hDlg
, wParam
, lParam
, lpcfw
);
1218 /***********************************************************************
1219 * FormatCharDlgProcW [internal]
1221 static INT_PTR CALLBACK
FormatCharDlgProcW(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1224 INT_PTR res
= FALSE
;
1226 if (uMsg
!=WM_INITDIALOG
)
1228 lpcf
= GetPropW(hDlg
, strWineFontData
);
1229 if (lpcf
&& CFn_HookCallChk32(lpcf
))
1230 res
=CallWindowProcW((WNDPROC
)lpcf
->lpfnHook
, hDlg
, uMsg
, wParam
, lParam
);
1236 lpcf
=(LPCHOOSEFONTW
)lParam
;
1237 if (!CFn_WMInitDialog(hDlg
, lParam
, lpcf
))
1239 TRACE("CFn_WMInitDialog returned FALSE\n");
1242 if (CFn_HookCallChk32(lpcf
))
1243 return CallWindowProcW((WNDPROC
)lpcf
->lpfnHook
,hDlg
,WM_INITDIALOG
,wParam
,lParam
);
1247 case WM_MEASUREITEM
:
1248 return CFn_WMMeasureItem(hDlg
, lParam
);
1250 return CFn_WMDrawItem(lParam
);
1252 return CFn_WMCommand(hDlg
, wParam
, lParam
, lpcf
);
1255 case WM_CHOOSEFONT_GETLOGFONT
:
1256 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam
);
1257 memcpy( (LOGFONTW
*)lParam
, lpcf
->lpLogFont
, sizeof(LOGFONTW
) );
1260 return CFn_WMPaint(hDlg
, wParam
, lParam
, lpcf
);