Fixes for FormatCharDlgProc16:

- properly store the ChooseFont pointer, use a window property as the
  A and W functions do;
- handle other messages then WM_INITDIALOG and WM_MEASUREITEM as well.
oldstable
Rein Klazes 2005-11-22 16:18:55 +00:00 committed by Alexandre Julliard
parent ed0eba24f9
commit 51f40d95dc
1 changed files with 17 additions and 9 deletions

View File

@ -41,6 +41,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
#include "cdlg.h" #include "cdlg.h"
#include "cdlg16.h" #include "cdlg16.h"
static const WCHAR strWineFontData16[] =
{'_','_','W','I','N','E','_','F','O','N','T','D','L','G','D','A','T','A','1','6',0};
static void FONT_LogFont16To32W( const LPLOGFONT16 font16, LPLOGFONTW font32 ) static void FONT_LogFont16To32W( const LPLOGFONT16 font16, LPLOGFONTW font32 )
{ {
font32->lfHeight = font16->lfHeight; font32->lfHeight = font16->lfHeight;
@ -120,11 +123,13 @@ INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics,
{ {
HWND hwnd=HWND_32(LOWORD(lParam)); HWND hwnd=HWND_32(LOWORD(lParam));
HWND hDlg=GetParent(hwnd); HWND hDlg=GetParent(hwnd);
LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongPtrW(hDlg, DWLP_USER); LPCHOOSEFONT16 lpcf;
LOGFONT16 *lplf = MapSL( logfont ); LOGFONT16 *lplf = MapSL( logfont );
TEXTMETRIC16 *lpmtrx16 = MapSL(metrics); TEXTMETRIC16 *lpmtrx16 = MapSL(metrics);
ENUMLOGFONTEXW elf32w; ENUMLOGFONTEXW elf32w;
NEWTEXTMETRICEXW nmtrx32w; NEWTEXTMETRICEXW nmtrx32w;
lpcf = (LPCHOOSEFONT16)GetPropW(hDlg, strWineFontData16);
FONT_LogFont16To32W(lplf, &(elf32w.elfLogFont)); FONT_LogFont16To32W(lplf, &(elf32w.elfLogFont));
FONT_Metrics16To32W(lpmtrx16, &nmtrx32w); FONT_Metrics16To32W(lpmtrx16, &nmtrx32w);
return AddFontFamily(&elf32w, &nmtrx32w, nFontType, return AddFontFamily(&elf32w, &nmtrx32w, nFontType,
@ -140,11 +145,13 @@ INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics,
HWND hcmb2=HWND_32(LOWORD(lParam)); HWND hcmb2=HWND_32(LOWORD(lParam));
HWND hcmb3=HWND_32(HIWORD(lParam)); HWND hcmb3=HWND_32(HIWORD(lParam));
HWND hDlg=GetParent(hcmb3); HWND hDlg=GetParent(hcmb3);
LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLongPtrW(hDlg, DWLP_USER); LPCHOOSEFONT16 lpcf;
LOGFONT16 *lplf = MapSL(logfont); LOGFONT16 *lplf = MapSL(logfont);
TEXTMETRIC16 *lpmtrx16 = MapSL(metrics); TEXTMETRIC16 *lpmtrx16 = MapSL(metrics);
ENUMLOGFONTEXW elf32w; ENUMLOGFONTEXW elf32w;
NEWTEXTMETRICEXW nmtrx32w; NEWTEXTMETRICEXW nmtrx32w;
lpcf = (LPCHOOSEFONT16)GetPropW(hDlg, strWineFontData16);
FONT_LogFont16To32W(lplf, &(elf32w.elfLogFont)); FONT_LogFont16To32W(lplf, &(elf32w.elfLogFont));
FONT_Metrics16To32W(lpmtrx16, &nmtrx32w); FONT_Metrics16To32W(lpmtrx16, &nmtrx32w);
return AddFontStyle(&elf32w, &nmtrx32w, nFontType, return AddFontStyle(&elf32w, &nmtrx32w, nFontType,
@ -298,13 +305,13 @@ BOOL16 CALLBACK FormatCharDlgProc16(HWND16 hDlg16, UINT16 message,
BOOL16 res=0; BOOL16 res=0;
if (message!=WM_INITDIALOG) if (message!=WM_INITDIALOG)
{ {
lpcf=(LPCHOOSEFONT16)GetWindowLongPtrW(hDlg, DWLP_USER); lpcf = (LPCHOOSEFONT16)GetPropW(hDlg, strWineFontData16);
if (!lpcf && message != WM_MEASUREITEM) if (!lpcf)
return FALSE; return FALSE;
if (CFn_HookCallChk(lpcf)) if (CFn_HookCallChk(lpcf))
res=CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,message,wParam,lParam); res=CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,message,wParam,lParam);
if (res) if (res)
return res; return res;
} }
else else
{ {
@ -314,6 +321,7 @@ BOOL16 CALLBACK FormatCharDlgProc16(HWND16 hDlg16, UINT16 message,
TRACE("CFn_WMInitDialog returned FALSE\n"); TRACE("CFn_WMInitDialog returned FALSE\n");
return FALSE; return FALSE;
} }
SetPropW(hDlg, strWineFontData16, (HANDLE)lParam);
if (CFn_HookCallChk(lpcf)) if (CFn_HookCallChk(lpcf))
return CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,WM_INITDIALOG,wParam,lParam); return CallWindowProc16((WNDPROC16)lpcf->lpfnHook,hDlg16,WM_INITDIALOG,wParam,lParam);
} }