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