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
| CF_NOVERTFONTS
))
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
| CF_NOVERTFONTS
))
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
))
331 i
=SendMessageW(hwnd
, CB_FINDSTRINGEXACT
, 0, (LPARAM
)lplf
->lfFaceName
);
333 i
= SendMessageW(hwnd
, CB_ADDSTRING
, 0, (LPARAM
)lplf
->lfFaceName
);
335 /* store some important font information */
336 w
= (lplf
->lfPitchAndFamily
) << 8 |
337 (HIWORD(lpNTM
->ntmTm
.ntmFlags
) & 0xff);
338 SendMessageW(hwnd
, CB_SETITEMDATA
, i
, MAKELONG(nFontType
,w
));
344 /*************************************************************************
345 * FontFamilyEnumProc32 [internal]
347 static INT WINAPI
FontFamilyEnumProc(const ENUMLOGFONTEXW
*lpElfex
,
348 const TEXTMETRICW
*metrics
, DWORD dwFontType
, LPARAM lParam
)
351 e
=(LPCFn_ENUMSTRUCT
)lParam
;
352 return AddFontFamily( lpElfex
, (const NEWTEXTMETRICEXW
*) metrics
,
353 dwFontType
, e
->lpcf32w
, e
->hWnd1
, e
);
356 /*************************************************************************
357 * SetFontStylesToCombo2 [internal]
359 * Fill font style information into combobox (without using font.c directly)
361 static int SetFontStylesToCombo2(HWND hwnd
, HDC hdc
, const LOGFONTW
*lplf
)
370 static const struct FONTSTYLE fontstyles
[FSTYLES
]={
371 { 0, FW_NORMAL
, IDS_FONT_REGULAR
},
372 { 1, FW_NORMAL
, IDS_FONT_ITALIC
},
373 { 0, FW_BOLD
, IDS_FONT_BOLD
},
374 { 1, FW_BOLD
, IDS_FONT_BOLD_ITALIC
}
383 for (i
=0;i
<FSTYLES
;i
++)
385 lf
.lfItalic
=fontstyles
[i
].italic
;
386 lf
.lfWeight
=fontstyles
[i
].weight
;
387 hf
=CreateFontIndirectW(&lf
);
388 hf
=SelectObject(hdc
,hf
);
389 GetTextMetricsW(hdc
,&tm
);
390 hf
=SelectObject(hdc
,hf
);
392 /* font successful created ? */
393 if (((fontstyles
[i
].weight
== FW_NORMAL
&& tm
.tmWeight
<= FW_MEDIUM
) ||
394 (fontstyles
[i
].weight
== FW_BOLD
&& tm
.tmWeight
> FW_MEDIUM
)) &&
395 ((tm
.tmItalic
!= 0)==fontstyles
[i
].italic
))
398 LoadStringW(COMDLG32_hInstance
, fontstyles
[i
].resId
, name
, 64);
399 j
=SendMessageW(hwnd
,CB_ADDSTRING
,0,(LPARAM
)name
);
400 if (j
==CB_ERR
) return 1;
401 j
=SendMessageW(hwnd
, CB_SETITEMDATA
, j
,
402 MAKELONG(tm
.tmWeight
,fontstyles
[i
].italic
));
403 if (j
==CB_ERR
) return 1;
409 /*************************************************************************
410 * AddFontSizeToCombo3 [internal]
412 static int AddFontSizeToCombo3(HWND hwnd
, UINT h
, const CHOOSEFONTW
*lpcf
)
416 static const WCHAR strFormat
[] = {'%','2','d',0};
418 if ( (!(lpcf
->Flags
& CF_LIMITSIZE
)) ||
419 ((lpcf
->Flags
& CF_LIMITSIZE
) && (h
>= lpcf
->nSizeMin
) && (h
<= lpcf
->nSizeMax
)))
421 wsprintfW(buffer
, strFormat
, h
);
422 j
=SendMessageW(hwnd
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)buffer
);
425 j
=SendMessageW(hwnd
, CB_ADDSTRING
, 0, (LPARAM
)buffer
);
426 if (j
!=CB_ERR
) j
= SendMessageW(hwnd
, CB_SETITEMDATA
, j
, h
);
427 if (j
==CB_ERR
) return 1;
433 /*************************************************************************
434 * SetFontSizesToCombo3 [internal]
436 static int SetFontSizesToCombo3(HWND hwnd
, const CHOOSEFONTW
*lpcf
)
438 static const BYTE sizes
[]={6,7,8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72};
441 for (i
= 0; i
< sizeof(sizes
)/sizeof(sizes
[0]); i
++)
442 if (AddFontSizeToCombo3(hwnd
, sizes
[i
], lpcf
)) return 1;
446 /*************************************************************************
447 * CFn_GetDC [internal]
449 static inline HDC
CFn_GetDC(const CHOOSEFONTW
*lpcf
)
451 HDC ret
= ((lpcf
->Flags
& CF_PRINTERFONTS
) && lpcf
->hDC
) ?
454 if(!ret
) ERR("HDC failure!!!\n");
458 /*************************************************************************
459 * GetScreenDPI [internal]
461 static inline int GetScreenDPI(void)
467 result
= GetDeviceCaps(hdc
, LOGPIXELSY
);
473 /*************************************************************************
474 * CFn_ReleaseDC [internal]
476 static inline void CFn_ReleaseDC(const CHOOSEFONTW
*lpcf
, HDC hdc
)
478 if(!((lpcf
->Flags
& CF_PRINTERFONTS
) && lpcf
->hDC
))
482 /***********************************************************************
483 * AddFontStyle [internal]
485 static INT
AddFontStyle( const ENUMLOGFONTEXW
*lpElfex
, const NEWTEXTMETRICEXW
*lpNTM
,
486 UINT nFontType
, const CHOOSEFONTW
*lpcf
, HWND hcmb2
, HWND hcmb3
, HWND hDlg
)
489 const LOGFONTW
*lplf
= &(lpElfex
->elfLogFont
);
493 TRACE("(nFontType=%d)\n",nFontType
);
494 TRACE(" %s h=%d w=%d e=%d o=%d wg=%d i=%d u=%d s=%d"
495 " ch=%d op=%d cp=%d q=%d pf=%xh\n",
496 debugstr_w(lplf
->lfFaceName
),lplf
->lfHeight
,lplf
->lfWidth
,
497 lplf
->lfEscapement
,lplf
->lfOrientation
,
498 lplf
->lfWeight
,lplf
->lfItalic
,lplf
->lfUnderline
,
499 lplf
->lfStrikeOut
,lplf
->lfCharSet
, lplf
->lfOutPrecision
,
500 lplf
->lfClipPrecision
,lplf
->lfQuality
, lplf
->lfPitchAndFamily
);
501 if (nFontType
& RASTER_FONTTYPE
)
504 points
= MulDiv( lpNTM
->ntmTm
.tmHeight
- lpNTM
->ntmTm
.tmInternalLeading
,
506 i
= AddFontSizeToCombo3(hcmb3
, points
, lpcf
);
508 } else if (SetFontSizesToCombo3(hcmb3
, lpcf
)) return 0;
510 if (!SendMessageW(hcmb2
, CB_GETCOUNT
, 0, 0))
512 if(!(hdc
= CFn_GetDC(lpcf
))) return 0;
513 i
=SetFontStylesToCombo2(hcmb2
,hdc
,lplf
);
514 CFn_ReleaseDC(lpcf
, hdc
);
518 if (!( hcmb5
= GetDlgItem(hDlg
, cmb5
))) return 1;
519 i
= SendMessageW( hcmb5
, CB_FINDSTRINGEXACT
, 0,
520 (LPARAM
)lpElfex
->elfScript
);
522 i
= SendMessageW( hcmb5
, CB_ADDSTRING
, 0,
523 (LPARAM
)lpElfex
->elfScript
);
525 SendMessageW( hcmb5
, CB_SETITEMDATA
, i
, lplf
->lfCharSet
);
530 static INT
CFn_FitFontSize( HWND hDlg
, int points
)
534 /* look for fitting font size in combobox3 */
535 n
=SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCOUNT
, 0, 0);
538 if (points
== (int)SendDlgItemMessageW
539 (hDlg
,cmb3
, CB_GETITEMDATA
,i
,0))
541 SendDlgItemMessageW(hDlg
,cmb3
,CB_SETCURSEL
,i
,0);
542 SendMessageW(hDlg
, WM_COMMAND
,
543 MAKEWPARAM(cmb3
, CBN_SELCHANGE
),
544 (LPARAM
)GetDlgItem(hDlg
,cmb3
));
552 static INT
CFn_FitFontStyle( HWND hDlg
, LONG packedstyle
)
556 /* look for fitting font style in combobox2 */
557 for (i
=0;i
<TEXT_EXTRAS
;i
++)
559 id
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, i
, 0);
560 if (packedstyle
== id
)
562 SendDlgItemMessageW(hDlg
, cmb2
, CB_SETCURSEL
, i
, 0);
563 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb2
, CBN_SELCHANGE
),
564 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
573 static INT
CFn_FitCharSet( HWND hDlg
, int charset
)
576 /* look for fitting char set in combobox5 */
577 n
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCOUNT
, 0, 0);
580 cs
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, i
, 0);
583 SendDlgItemMessageW(hDlg
, cmb5
, CB_SETCURSEL
, i
, 0);
584 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
585 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
589 /* no charset fits: select the first one in the list */
590 SendDlgItemMessageW(hDlg
, cmb5
, CB_SETCURSEL
, 0, 0);
591 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
592 (LPARAM
)GetDlgItem(hDlg
,cmb2
));
596 /***********************************************************************
597 * FontStyleEnumProc32 [internal]
599 static INT WINAPI
FontStyleEnumProc( const ENUMLOGFONTEXW
*lpElfex
,
600 const TEXTMETRICW
*metrics
, DWORD dwFontType
, LPARAM lParam
)
602 LPCFn_ENUMSTRUCT s
=(LPCFn_ENUMSTRUCT
)lParam
;
605 HWND hDlg
=GetParent(hcmb3
);
606 return AddFontStyle( lpElfex
, (const NEWTEXTMETRICEXW
*) metrics
,
607 dwFontType
, s
->lpcf32w
, hcmb2
, hcmb3
, hDlg
);
610 /***********************************************************************
611 * CFn_WMInitDialog [internal]
613 static LRESULT
CFn_WMInitDialog(HWND hDlg
, LPARAM lParam
, LPCHOOSEFONTW lpcf
)
620 HCURSOR hcursor
=SetCursor(LoadCursorW(0,(LPWSTR
)IDC_WAIT
));
621 static const WCHAR strColorName
[] = {'[','c','o','l','o','r',' ','n','a','m','e',']',0};
623 SetPropW(hDlg
, strWineFontData
, lpcf
);
624 lpxx
=lpcf
->lpLogFont
;
625 TRACE("WM_INITDIALOG lParam=%08lX\n", lParam
);
627 if (lpcf
->lStructSize
!= sizeof(CHOOSEFONTW
))
629 ERR("structure size failure !!!\n");
634 himlTT
= ImageList_LoadImageW( COMDLG32_hInstance
, MAKEINTRESOURCEW(38),
635 TTBITMAP_XSIZE
, 0, CLR_DEFAULT
, IMAGE_BITMAP
, 0);
637 /* Set effect flags */
638 if((lpcf
->Flags
& CF_EFFECTS
) && (lpcf
->Flags
& CF_INITTOLOGFONTSTRUCT
))
640 if(lpxx
->lfUnderline
)
641 CheckDlgButton(hDlg
, chx2
, TRUE
);
642 if(lpxx
->lfStrikeOut
)
643 CheckDlgButton(hDlg
, chx1
, TRUE
);
646 if (!(lpcf
->Flags
& CF_SHOWHELP
) || !IsWindow(lpcf
->hwndOwner
))
647 ShowWindow(GetDlgItem(hDlg
,pshHelp
),SW_HIDE
);
648 if (!(lpcf
->Flags
& CF_APPLY
))
649 ShowWindow(GetDlgItem(hDlg
,psh3
),SW_HIDE
);
650 if (lpcf
->Flags
& CF_NOSCRIPTSEL
)
651 EnableWindow(GetDlgItem(hDlg
,cmb5
),FALSE
);
652 if (lpcf
->Flags
& CF_EFFECTS
)
654 for (i
=0;i
<TEXT_COLORS
;i
++)
658 if( LoadStringW(COMDLG32_hInstance
, IDS_COLOR_BLACK
+i
, name
,
659 sizeof(name
)/sizeof(*name
) )==0 )
661 memcpy(name
, strColorName
, sizeof(strColorName
));
663 j
=SendDlgItemMessageW(hDlg
, cmb4
, CB_ADDSTRING
, 0, (LPARAM
)name
);
664 SendDlgItemMessageW(hDlg
, cmb4
, CB_SETITEMDATA
, j
, textcolors
[i
]);
665 /* look for a fitting value in color combobox */
666 if (textcolors
[i
]==lpcf
->rgbColors
)
667 SendDlgItemMessageW(hDlg
,cmb4
, CB_SETCURSEL
,j
,0);
672 ShowWindow(GetDlgItem(hDlg
,cmb4
),SW_HIDE
);
673 ShowWindow(GetDlgItem(hDlg
,chx1
),SW_HIDE
);
674 ShowWindow(GetDlgItem(hDlg
,chx2
),SW_HIDE
);
675 ShowWindow(GetDlgItem(hDlg
,grp1
),SW_HIDE
);
676 ShowWindow(GetDlgItem(hDlg
,stc4
),SW_HIDE
);
678 if(!(hdc
= CFn_GetDC(lpcf
)))
683 s
.hWnd1
=GetDlgItem(hDlg
,cmb1
);
688 elf
.lfCharSet
= DEFAULT_CHARSET
; /* enum all charsets */
689 elf
.lfPitchAndFamily
= 0;
690 elf
.lfFaceName
[0] = '\0'; /* enum all fonts */
691 if (!EnumFontFamiliesExW(hdc
, &elf
, (FONTENUMPROCW
)FontFamilyEnumProc
, (LPARAM
)&s
, 0))
693 TRACE("EnumFontFamiliesEx returns 0\n");
697 if (lpcf
->Flags
& CF_FIXEDPITCHONLY
) {
698 FIXME("No font found with fixed pitch only, dropping flag.\n");
699 lpcf
->Flags
&= ~CF_FIXEDPITCHONLY
;
702 if (lpcf
->Flags
& CF_TTONLY
) {
703 FIXME("No font found with truetype only, dropping flag.\n");
704 lpcf
->Flags
&= ~CF_TTONLY
;
711 if (lpcf
->Flags
& CF_INITTOLOGFONTSTRUCT
)
713 /* look for fitting font name in combobox1 */
714 j
=SendDlgItemMessageW(hDlg
,cmb1
,CB_FINDSTRING
,-1,(LPARAM
)lpxx
->lfFaceName
);
717 INT height
= lpxx
->lfHeight
< 0 ? -lpxx
->lfHeight
:
720 int charset
= lpxx
->lfCharSet
;
721 points
= MulDiv( height
, 72, GetScreenDPI());
722 pstyle
= MAKELONG(lpxx
->lfWeight
> FW_MEDIUM
? FW_BOLD
:
723 FW_NORMAL
,lpxx
->lfItalic
!=0);
724 SendDlgItemMessageW(hDlg
, cmb1
, CB_SETCURSEL
, j
, 0);
725 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb1
, CBN_SELCHANGE
),
726 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
728 /* look for fitting font style in combobox2 */
729 CFn_FitFontStyle(hDlg
, pstyle
);
730 /* look for fitting font size in combobox3 */
731 CFn_FitFontSize(hDlg
, points
);
732 CFn_FitCharSet( hDlg
, charset
);
737 SendDlgItemMessageW(hDlg
,cmb1
,CB_SETCURSEL
,0,0);
738 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb1
, CBN_SELCHANGE
),
739 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
740 SendDlgItemMessageW(hDlg
,cmb2
,CB_SETCURSEL
,0,0);
741 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb2
, CBN_SELCHANGE
),
742 (LPARAM
)GetDlgItem(hDlg
,cmb1
));
743 SendDlgItemMessageW(hDlg
,cmb3
,CB_SETCURSEL
,0,0);
744 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb3
, CBN_SELCHANGE
),
745 (LPARAM
)GetDlgItem(hDlg
,cmb3
));
746 SendDlgItemMessageW(hDlg
,cmb5
,CB_SETCURSEL
,0,0);
747 SendMessageW(hDlg
, WM_COMMAND
, MAKEWPARAM(cmb5
, CBN_SELCHANGE
),
748 (LPARAM
)GetDlgItem(hDlg
,cmb5
));
750 if ((lpcf
->Flags
& CF_USESTYLE
) && lpcf
->lpszStyle
)
752 j
=SendDlgItemMessageW(hDlg
,cmb2
,CB_FINDSTRING
,-1,(LPARAM
)lpcf
->lpszStyle
);
755 j
=SendDlgItemMessageW(hDlg
,cmb2
,CB_SETCURSEL
,j
,0);
756 SendMessageW(hDlg
,WM_COMMAND
,cmb2
,
757 MAKELONG(LOWORD(GetDlgItem(hDlg
,cmb2
)),CBN_SELCHANGE
));
760 CFn_ReleaseDC(lpcf
, hdc
);
766 /***********************************************************************
767 * CFn_WMMeasureItem [internal]
769 static LRESULT
CFn_WMMeasureItem(HWND hDlg
, LPARAM lParam
)
774 LPMEASUREITEMSTRUCT lpmi
=(LPMEASUREITEMSTRUCT
)lParam
;
778 himlTT
= ImageList_LoadImageW( COMDLG32_hInstance
, MAKEINTRESOURCEW(38),
779 TTBITMAP_XSIZE
, 0, CLR_DEFAULT
, IMAGE_BITMAP
, 0);
780 ImageList_GetIconSize( himlTT
, &cx
, &height
);
781 lpmi
->itemHeight
= height
+ 2;
782 /* use MAX of bitmap height and tm.tmHeight .*/
785 hfontprev
= SelectObject( hdc
, GetStockObject( DEFAULT_GUI_FONT
) );
786 GetTextMetricsW(hdc
, &tm
);
787 if( tm
.tmHeight
> lpmi
->itemHeight
) lpmi
->itemHeight
= tm
.tmHeight
;
788 SelectObject(hdc
, hfontprev
);
789 ReleaseDC(hDlg
, hdc
);
794 /***********************************************************************
795 * CFn_WMDrawItem [internal]
797 static LRESULT
CFn_WMDrawItem(LPARAM lParam
)
801 COLORREF cr
, oldText
=0, oldBk
=0;
805 LPDRAWITEMSTRUCT lpdi
= (LPDRAWITEMSTRUCT
)lParam
;
807 if (lpdi
->itemID
== (UINT
)-1) /* got no items */
808 DrawFocusRect(lpdi
->hDC
, &lpdi
->rcItem
);
811 if (lpdi
->CtlType
== ODT_COMBOBOX
)
813 if (lpdi
->itemState
& ODS_SELECTED
)
815 hBrush
=GetSysColorBrush(COLOR_HIGHLIGHT
);
816 oldText
=SetTextColor(lpdi
->hDC
, GetSysColor(COLOR_HIGHLIGHTTEXT
));
817 oldBk
=SetBkColor(lpdi
->hDC
, GetSysColor(COLOR_HIGHLIGHT
));
820 hBrush
= SelectObject(lpdi
->hDC
, GetStockObject(LTGRAY_BRUSH
));
821 SelectObject(lpdi
->hDC
, hBrush
);
823 FillRect(lpdi
->hDC
, &lpdi
->rcItem
, hBrush
);
826 return TRUE
; /* this should never happen */
832 /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
833 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
835 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
+ TTBITMAP_XSIZE
+ 10,
836 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
837 nFontType
= SendMessageW(lpdi
->hwndItem
, CB_GETITEMDATA
, lpdi
->itemID
,0L);
839 if (nFontType
& TRUETYPE_FONTTYPE
) {
840 idx
= 0; /* picture: TT */
841 if( nFontType
& NTM_TT_OPENTYPE
)
842 idx
= 2; /* picture: O */
843 } else if( nFontType
& NTM_PS_OPENTYPE
)
844 idx
= 3; /* picture: O+ps */
845 else if( nFontType
& NTM_TYPE1
)
846 idx
= 4; /* picture: a */
847 else if( nFontType
& DEVICE_FONTTYPE
)
848 idx
= 1; /* picture: printer */
850 ImageList_Draw( himlTT
, idx
, lpdi
->hDC
, lpdi
->rcItem
.left
,
851 lpdi
->rcItem
.top
, ILD_TRANSPARENT
);
855 /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
857 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
859 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
,
860 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
864 /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
865 SendMessageW(lpdi
->hwndItem
, CB_GETLBTEXT
, lpdi
->itemID
,
867 TextOutW(lpdi
->hDC
, lpdi
->rcItem
.left
+ 25+5,
868 lpdi
->rcItem
.top
, buffer
, lstrlenW(buffer
));
869 cr
= SendMessageW(lpdi
->hwndItem
, CB_GETITEMDATA
, lpdi
->itemID
,0L);
870 hBrush
= CreateSolidBrush(cr
);
873 hBrush
= SelectObject (lpdi
->hDC
, hBrush
) ;
874 rect
.right
=rect
.left
+25;
878 Rectangle( lpdi
->hDC
, rect
.left
, rect
.top
,
879 rect
.right
, rect
.bottom
);
880 DeleteObject( SelectObject (lpdi
->hDC
, hBrush
)) ;
887 return TRUE
; /* this should never happen */
889 if (lpdi
->itemState
& ODS_SELECTED
)
891 SetTextColor(lpdi
->hDC
, oldText
);
892 SetBkColor(lpdi
->hDC
, oldBk
);
898 /***********************************************************************
899 * CFn_WMCommand [internal]
901 static LRESULT
CFn_WMCommand(HWND hDlg
, WPARAM wParam
, LPARAM lParam
, LPCHOOSEFONTW lpcf
)
907 if (!lpcf
) return FALSE
;
909 TRACE("WM_COMMAND wParam=%08X lParam=%08lX\n", (LONG
)wParam
, lParam
);
910 switch (LOWORD(wParam
))
913 if (HIWORD(wParam
)==CBN_SELCHANGE
)
915 INT pointsize
; /* save current pointsize */
916 LONG pstyle
; /* save current style */
919 if(!(hdc
= CFn_GetDC(lpcf
)))
924 idx
= SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCURSEL
, 0, 0);
925 pointsize
= (int)SendDlgItemMessageW( hDlg
, cmb3
, CB_GETITEMDATA
,
927 idx
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETCURSEL
, 0, 0);
928 pstyle
= SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, idx
, 0);
929 idx
= SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCURSEL
, 0, 0);
930 charset
= SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, idx
, 0);
932 SendDlgItemMessageW(hDlg
, cmb2
, CB_RESETCONTENT
, 0, 0);
933 SendDlgItemMessageW(hDlg
, cmb3
, CB_RESETCONTENT
, 0, 0);
934 SendDlgItemMessageW(hDlg
, cmb5
, CB_RESETCONTENT
, 0, 0);
935 i
=SendDlgItemMessageW(hDlg
, cmb1
, CB_GETCURSEL
, 0, 0);
938 HCURSOR hcursor
=SetCursor(LoadCursorW(0,(LPWSTR
)IDC_WAIT
));
941 SendDlgItemMessageW(hDlg
, cmb1
, CB_GETLBTEXT
, i
,
942 (LPARAM
)enumlf
.lfFaceName
);
943 TRACE("WM_COMMAND/cmb1 =>%s\n", debugstr_w(enumlf
.lfFaceName
));
944 s
.hWnd1
=GetDlgItem(hDlg
, cmb2
);
945 s
.hWnd2
=GetDlgItem(hDlg
, cmb3
);
947 enumlf
.lfCharSet
= DEFAULT_CHARSET
; /* enum all charsets */
948 enumlf
.lfPitchAndFamily
= 0;
949 EnumFontFamiliesExW(hdc
, &enumlf
,
950 (FONTENUMPROCW
)FontStyleEnumProc
, (LPARAM
)&s
, 0);
951 CFn_FitFontStyle(hDlg
, pstyle
);
952 if( pointsize
!= CB_ERR
) CFn_FitFontSize(hDlg
, pointsize
);
953 if( charset
!= CB_ERR
) CFn_FitCharSet( hDlg
, charset
);
956 CFn_ReleaseDC(lpcf
, hdc
);
964 if (HIWORD(wParam
)==CBN_SELCHANGE
|| HIWORD(wParam
)== BN_CLICKED
)
968 LPLOGFONTW lpxx
=lpcf
->lpLogFont
;
970 TRACE("WM_COMMAND/cmb2,3 =%08lX\n", lParam
);
971 i
=SendDlgItemMessageW(hDlg
,cmb1
,CB_GETCURSEL
,0,0);
973 i
=GetDlgItemTextW( hDlg
, cmb1
, str
, 256 );
976 SendDlgItemMessageW(hDlg
,cmb1
,CB_GETLBTEXT
,i
,
978 l
=SendDlgItemMessageW(hDlg
,cmb1
,CB_GETITEMDATA
,i
,0);
979 lpcf
->nFontType
= LOWORD(l
);
980 /* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
981 /* same value reported to the EnumFonts
982 call back with the extra FONTTYPE_... bits added */
983 lpxx
->lfPitchAndFamily
= HIWORD(l
) >> 8;
985 lstrcpynW(lpxx
->lfFaceName
, str
, sizeof(lpxx
->lfFaceName
)/sizeof(lpxx
->lfFaceName
[0]));
986 i
=SendDlgItemMessageW(hDlg
, cmb2
, CB_GETCURSEL
, 0, 0);
989 l
=SendDlgItemMessageW(hDlg
, cmb2
, CB_GETITEMDATA
, i
, 0);
990 if (0!=(lpxx
->lfItalic
=HIWORD(l
)))
991 lpcf
->nFontType
|= ITALIC_FONTTYPE
;
992 if ((lpxx
->lfWeight
=LOWORD(l
)) > FW_MEDIUM
)
993 lpcf
->nFontType
|= BOLD_FONTTYPE
;
995 i
=SendDlgItemMessageW(hDlg
, cmb3
, CB_GETCURSEL
, 0, 0);
997 lpcf
->iPointSize
= 10 * LOWORD(SendDlgItemMessageW(hDlg
, cmb3
,
998 CB_GETITEMDATA
, i
, 0));
1000 lpcf
->iPointSize
= 100;
1001 lpxx
->lfHeight
= - MulDiv( lpcf
->iPointSize
,
1002 GetScreenDPI(), 720);
1003 i
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETCURSEL
, 0, 0);
1005 lpxx
->lfCharSet
=SendDlgItemMessageW(hDlg
, cmb5
, CB_GETITEMDATA
, i
, 0);
1007 lpxx
->lfCharSet
= DEFAULT_CHARSET
;
1008 lpxx
->lfStrikeOut
=IsDlgButtonChecked(hDlg
,chx1
);
1009 lpxx
->lfUnderline
=IsDlgButtonChecked(hDlg
,chx2
);
1010 lpxx
->lfWidth
=lpxx
->lfOrientation
=lpxx
->lfEscapement
=0;
1011 lpxx
->lfOutPrecision
=OUT_DEFAULT_PRECIS
;
1012 lpxx
->lfClipPrecision
=CLIP_DEFAULT_PRECIS
;
1013 lpxx
->lfQuality
=DEFAULT_QUALITY
;
1015 wininfo
.cbSize
=sizeof(wininfo
);
1017 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &wininfo
) )
1019 MapWindowPoints( 0, hDlg
, (LPPOINT
) &wininfo
.rcWindow
, 2);
1020 InvalidateRect( hDlg
, &wininfo
.rcWindow
, TRUE
);
1026 i
=SendDlgItemMessageW(hDlg
, cmb4
, CB_GETCURSEL
, 0, 0);
1031 lpcf
->rgbColors
= SendDlgItemMessageW(hDlg
, cmb4
, CB_GETITEMDATA
, i
, 0);
1032 wininfo
.cbSize
=sizeof(wininfo
);
1034 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &wininfo
) )
1036 MapWindowPoints( 0, hDlg
, (LPPOINT
) &wininfo
.rcWindow
, 2);
1037 InvalidateRect( hDlg
, &wininfo
.rcWindow
, TRUE
);
1043 i
=RegisterWindowMessageW( HELPMSGSTRINGW
);
1044 if (lpcf
->hwndOwner
)
1045 SendMessageW(lpcf
->hwndOwner
, i
, 0, (LPARAM
)GetPropW(hDlg
, strWineFontData
));
1049 if ( (!(lpcf
->Flags
& CF_LIMITSIZE
)) ||
1050 ( (lpcf
->Flags
& CF_LIMITSIZE
) &&
1051 (lpcf
->iPointSize
>= 10 * lpcf
->nSizeMin
) &&
1052 (lpcf
->iPointSize
<= 10 * lpcf
->nSizeMax
)))
1053 EndDialog(hDlg
, TRUE
);
1058 LoadStringW(COMDLG32_hInstance
, IDS_FONT_SIZE
, format
, sizeof(format
)/sizeof(WCHAR
));
1059 wsprintfW(buffer
, format
, lpcf
->nSizeMin
,lpcf
->nSizeMax
);
1060 MessageBoxW(hDlg
, buffer
, NULL
, MB_OK
);
1064 EndDialog(hDlg
, FALSE
);
1070 static LRESULT
CFn_WMDestroy(HWND hwnd
, LPCHOOSEFONTW lpcfw
)
1072 LPCHOOSEFONTA lpcfa
;
1074 LPLOGFONTA lpLogFonta
;
1077 if (!lpcfw
) return FALSE
;
1079 lpcfa
= GetPropW(hwnd
, strWineFontData_a
);
1080 lpLogFonta
= lpcfa
->lpLogFont
;
1081 lpszStyle
= lpcfa
->lpszStyle
;
1082 memcpy(lpcfa
, lpcfw
, sizeof(CHOOSEFONTA
));
1083 lpcfa
->lpLogFont
= lpLogFonta
;
1084 lpcfa
->lpszStyle
= lpszStyle
;
1085 memcpy(lpcfa
->lpLogFont
, lpcfw
->lpLogFont
, sizeof(LOGFONTA
));
1086 WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpLogFont
->lfFaceName
,
1087 LF_FACESIZE
, lpcfa
->lpLogFont
->lfFaceName
, LF_FACESIZE
, 0, 0);
1089 if((lpcfw
->Flags
& CF_USESTYLE
) && lpcfw
->lpszStyle
) {
1090 len
= WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpszStyle
, -1, NULL
, 0, 0, 0);
1091 WideCharToMultiByte(CP_ACP
, 0, lpcfw
->lpszStyle
, -1, lpcfa
->lpszStyle
, len
, 0, 0);
1092 HeapFree(GetProcessHeap(), 0, lpcfw
->lpszStyle
);
1095 HeapFree(GetProcessHeap(), 0, lpcfw
->lpLogFont
);
1096 HeapFree(GetProcessHeap(), 0, lpcfw
);
1097 SetPropW(hwnd
, strWineFontData
, 0);
1102 static LRESULT
CFn_WMPaint(HWND hDlg
, WPARAM wParam
, LPARAM lParam
, const CHOOSEFONTW
*lpcf
)
1106 if (!lpcf
) return FALSE
;
1108 info
.cbSize
=sizeof(info
);
1109 if( GetWindowInfo( GetDlgItem( hDlg
, stc5
), &info
) )
1115 LOGFONTW lf
= *(lpcf
->lpLogFont
);
1117 MapWindowPoints( 0, hDlg
, (LPPOINT
) &info
.rcWindow
, 2);
1118 hdc
= BeginPaint( hDlg
, &ps
);
1120 TRACE("erase %d, rect=(%d,%d)-(%d,%d)\n", ps
.fErase
,
1121 ps
.rcPaint
.left
, ps
.rcPaint
.top
,
1122 ps
.rcPaint
.right
, ps
.rcPaint
.bottom
);
1125 MoveToEx( hdc
, info
.rcWindow
.left
, info
.rcWindow
.bottom
, NULL
);
1126 hOrigPen
=SelectObject( hdc
, CreatePen( PS_SOLID
, 2,
1127 GetSysColor( COLOR_3DSHADOW
) ));
1128 LineTo( hdc
, info
.rcWindow
.left
, info
.rcWindow
.top
);
1129 LineTo( hdc
, info
.rcWindow
.right
, info
.rcWindow
.top
);
1130 DeleteObject(SelectObject( hdc
, CreatePen( PS_SOLID
, 2,
1131 GetSysColor( COLOR_3DLIGHT
) )));
1132 LineTo( hdc
, info
.rcWindow
.right
, info
.rcWindow
.bottom
);
1133 LineTo( hdc
, info
.rcWindow
.left
, info
.rcWindow
.bottom
);
1134 DeleteObject(SelectObject( hdc
, hOrigPen
));
1136 /* Draw the sample text itself */
1137 info
.rcWindow
.right
--;
1138 info
.rcWindow
.bottom
--;
1139 info
.rcWindow
.top
++;
1140 info
.rcWindow
.left
++;
1141 hOrigFont
= SelectObject( hdc
, CreateFontIndirectW( &lf
) );
1142 SetTextColor( hdc
, lpcf
->rgbColors
);
1145 sample_lang_text
[CHARSET_ORDER
[lpcf
->lpLogFont
->lfCharSet
]],
1146 -1, &info
.rcWindow
, DT_CENTER
|DT_VCENTER
|DT_SINGLELINE
);
1148 DeleteObject(SelectObject( hdc
, hOrigFont
));
1149 EndPaint( hDlg
, &ps
);
1154 /***********************************************************************
1155 * FormatCharDlgProcA [internal]
1157 static INT_PTR CALLBACK
FormatCharDlgProcA(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1159 LPCHOOSEFONTW lpcfw
;
1160 LPCHOOSEFONTA lpcfa
;
1161 INT_PTR res
= FALSE
;
1164 if (uMsg
!=WM_INITDIALOG
) {
1165 lpcfw
= GetPropW(hDlg
, strWineFontData
);
1166 if (lpcfw
&& CFn_HookCallChk32(lpcfw
))
1167 res
=CallWindowProcA((WNDPROC
)lpcfw
->lpfnHook
, hDlg
, uMsg
, wParam
, lParam
);
1171 lpcfa
=(LPCHOOSEFONTA
)lParam
;
1172 SetPropW(hDlg
, strWineFontData_a
, (HANDLE
)lParam
);
1174 lpcfw
= HeapAlloc(GetProcessHeap(), 0, sizeof(CHOOSEFONTW
));
1175 memcpy(lpcfw
, lpcfa
, sizeof(CHOOSEFONTA
));
1176 lpcfw
->lpLogFont
= HeapAlloc(GetProcessHeap(), 0, sizeof(LOGFONTW
));
1177 memcpy(lpcfw
->lpLogFont
, lpcfa
->lpLogFont
, sizeof(LOGFONTA
));
1178 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpLogFont
->lfFaceName
,
1179 LF_FACESIZE
, lpcfw
->lpLogFont
->lfFaceName
, LF_FACESIZE
);
1181 if((lpcfa
->Flags
& CF_USESTYLE
) && lpcfa
->lpszStyle
) {
1182 len
= MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpszStyle
, -1, NULL
, 0);
1183 lpcfw
->lpszStyle
= HeapAlloc(GetProcessHeap(), 0, len
*sizeof(WCHAR
));
1184 MultiByteToWideChar(CP_ACP
, 0, lpcfa
->lpszStyle
, -1, lpcfw
->lpszStyle
, len
);
1187 if (!CFn_WMInitDialog(hDlg
, lParam
, lpcfw
))
1189 TRACE("CFn_WMInitDialog returned FALSE\n");
1192 if (CFn_HookCallChk32(lpcfw
))
1193 return CallWindowProcA((WNDPROC
)lpcfa
->lpfnHook
,hDlg
,WM_INITDIALOG
,wParam
,lParam
);
1197 case WM_MEASUREITEM
:
1198 return CFn_WMMeasureItem(hDlg
,lParam
);
1200 return CFn_WMDrawItem(lParam
);
1202 return CFn_WMCommand(hDlg
, wParam
, lParam
, lpcfw
);
1204 return CFn_WMDestroy(hDlg
, lpcfw
);
1205 case WM_CHOOSEFONT_GETLOGFONT
:
1206 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam
);
1207 FIXME("current logfont back to caller\n");
1210 return CFn_WMPaint(hDlg
, wParam
, lParam
, lpcfw
);
1215 /***********************************************************************
1216 * FormatCharDlgProcW [internal]
1218 static INT_PTR CALLBACK
FormatCharDlgProcW(HWND hDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1221 INT_PTR res
= FALSE
;
1223 if (uMsg
!=WM_INITDIALOG
)
1225 lpcf
= GetPropW(hDlg
, strWineFontData
);
1226 if (lpcf
&& CFn_HookCallChk32(lpcf
))
1227 res
=CallWindowProcW((WNDPROC
)lpcf
->lpfnHook
, hDlg
, uMsg
, wParam
, lParam
);
1233 lpcf
=(LPCHOOSEFONTW
)lParam
;
1234 if (!CFn_WMInitDialog(hDlg
, lParam
, lpcf
))
1236 TRACE("CFn_WMInitDialog returned FALSE\n");
1239 if (CFn_HookCallChk32(lpcf
))
1240 return CallWindowProcW((WNDPROC
)lpcf
->lpfnHook
,hDlg
,WM_INITDIALOG
,wParam
,lParam
);
1244 case WM_MEASUREITEM
:
1245 return CFn_WMMeasureItem(hDlg
, lParam
);
1247 return CFn_WMDrawItem(lParam
);
1249 return CFn_WMCommand(hDlg
, wParam
, lParam
, lpcf
);
1252 case WM_CHOOSEFONT_GETLOGFONT
:
1253 TRACE("WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n", lParam
);
1254 FIXME("current logfont back to caller\n");
1257 return CFn_WMPaint(hDlg
, wParam
, lParam
, lpcf
);