|
|
/*++
Copyright (c) 1990-1998, Microsoft Corporation All rights reserved.
Module Name:
font.h
Abstract:
This module contains the header information for the Win32 font dialogs.
Revision History:
--*/
//
// Include Files.
//
#include <help.h>
#ifdef MM_DESIGNVECTOR_DEFINED
// new flag that for NT 5.0/IE 5.0 is used for testing purpose only
#define CF_MM_DESIGNVECTOR 0x02000000L
#if (_WIN32_WINNT < 0x0500)
//
// new NT 5.0 definitions related to MultipleMaster desing vector, from WinGdi.h
//
#define STAMP_DESIGNVECTOR (0x8000000 + 'd' + ('v' << 8))
#define STAMP_AXESLIST (0x8000000 + 'a' + ('l' << 8))
#define MM_MAX_NUMAXES 16
typedef struct tagDESIGNVECTOR { DWORD dvReserved; DWORD dvNumAxes; LONG dvValues[MM_MAX_NUMAXES]; } DESIGNVECTOR, *PDESIGNVECTOR, FAR *LPDESIGNVECTOR;
typedef struct tagENUMLOGFONTEXDVA { ENUMLOGFONTEXA elfEnumLogfontEx; DESIGNVECTOR elfDesignVector; } ENUMLOGFONTEXDVA, *PENUMLOGFONTEXDVA, FAR *LPENUMLOGFONTEXDVA; typedef struct tagENUMLOGFONTEXDVW { ENUMLOGFONTEXW elfEnumLogfontEx; DESIGNVECTOR elfDesignVector; } ENUMLOGFONTEXDVW, *PENUMLOGFONTEXDVW, FAR *LPENUMLOGFONTEXDVW; #ifdef UNICODE
typedef ENUMLOGFONTEXDVW ENUMLOGFONTEXDV; typedef PENUMLOGFONTEXDVW PENUMLOGFONTEXDV; typedef LPENUMLOGFONTEXDVW LPENUMLOGFONTEXDV; #else
typedef ENUMLOGFONTEXDVA ENUMLOGFONTEXDV; typedef PENUMLOGFONTEXDVA PENUMLOGFONTEXDV; typedef LPENUMLOGFONTEXDVA LPENUMLOGFONTEXDV; #endif // UNICODE
#define MM_MAX_AXES_NAMELEN 16
typedef struct tagAXISINFOA { LONG axMinValue; LONG axMaxValue; BYTE axAxisName[MM_MAX_AXES_NAMELEN]; } AXISINFOA, *PAXISINFOA, FAR *LPAXISINFOA; typedef struct tagAXISINFOW { LONG axMinValue; LONG axMaxValue; WCHAR axAxisName[MM_MAX_AXES_NAMELEN]; } AXISINFOW, *PAXISINFOW, FAR *LPAXISINFOW; #ifdef UNICODE
typedef AXISINFOW AXISINFO; typedef PAXISINFOW PAXISINFO; typedef LPAXISINFOW LPAXISINFO; #else
typedef AXISINFOA AXISINFO; typedef PAXISINFOA PAXISINFO; typedef LPAXISINFOA LPAXISINFO; #endif // UNICODE
typedef struct tagAXESLISTA { DWORD axlReserved; DWORD axlNumAxes; AXISINFOA axlAxisInfo[MM_MAX_NUMAXES]; } AXESLISTA, *PAXESLISTA, FAR *LPAXESLISTA; typedef struct tagAXESLISTW { DWORD axlReserved; DWORD axlNumAxes; AXISINFOW axlAxisInfo[MM_MAX_NUMAXES]; } AXESLISTW, *PAXESLISTW, FAR *LPAXESLISTW; #ifdef UNICODE
typedef AXESLISTW AXESLIST; typedef PAXESLISTW PAXESLIST; typedef LPAXESLISTW LPAXESLIST; #else
typedef AXESLISTA AXESLIST; typedef PAXESLISTA PAXESLIST; typedef LPAXESLISTA LPAXESLIST; #endif // UNICODE
typedef struct tagENUMTEXTMETRICA { NEWTEXTMETRICEXA etmNewTextMetricEx; AXESLISTA etmAxesList; } ENUMTEXTMETRICA, *PENUMTEXTMETRICA, FAR *LPENUMTEXTMETRICA; typedef struct tagENUMTEXTMETRICW { NEWTEXTMETRICEXW etmNewTextMetricEx; AXESLISTW etmAxesList; } ENUMTEXTMETRICW, *PENUMTEXTMETRICW, FAR *LPENUMTEXTMETRICW;
#ifdef UNICODE
typedef ENUMTEXTMETRICW ENUMTEXTMETRIC; typedef PENUMTEXTMETRICW PENUMTEXTMETRIC; typedef LPENUMTEXTMETRICW LPENUMTEXTMETRIC; #else
typedef ENUMTEXTMETRICA ENUMTEXTMETRIC; typedef PENUMTEXTMETRICA PENUMTEXTMETRIC; typedef LPENUMTEXTMETRICA LPENUMTEXTMETRIC; #endif // UNICODE
#endif // (_WIN32_WINNT < 0x0500)
#endif // MM_DESIGNVECTOR_DEFINED
//
// Constant Declarations.
//
// Finnish needs 17 chars (18 w/ NULL) -- let's give them 20.
#define CCHCOLORNAMEMAX 20 // max length of color name text
#define CCHCOLORS 16 // max # of pure colors in color combo
#define POINTS_PER_INCH 72
#define FFMASK 0xf0 // pitch and family mask
#define CCHSTDSTRING 12 // max length of sample text string
#define FONTPROP (LPCTSTR) 0xA000L
#define CBN_MYEDITUPDATE (WM_USER + 501)
#define KEY_FONT_SUBS TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes")
#define DEF_POINT_SIZE 10
//If you add a bitmaps to the font bitmap you should modify this constant.
#define NUM_OF_BITMAP 5
#define DX_BITMAP 20
#define DY_BITMAP 12
#define FONT_INVALID_CHARSET 0x100
//
// Typedef Declarations.
//
#ifdef MM_DESIGNVECTOR_DEFINED
// CreateFontIndirectEx
typedef HFONT (WINAPI *PFNCREATEFONTINDIRECTEX)( IN CONST ENUMLOGFONTEXDV *); #endif // MM_DESIGNVECTOR_DEFINED
typedef struct { UINT ApiType; LPCHOOSEFONT pCF; UINT iCharset; RECT rcText; DWORD nLastFontType; DWORD ProcessVersion;
#ifdef MM_DESIGNVECTOR_DEFINED
PFNCREATEFONTINDIRECTEX pfnCreateFontIndirectEx; DESIGNVECTOR DefaultDesignVector; #endif // MM_DESIGNVECTOR_DEFINED
#ifdef UNICODE
LPCHOOSEFONTA pCFA; PUNICODE_STRING pusStyle; PANSI_STRING pasStyle; #endif
} FONTINFO;
typedef FONTINFO *PFONTINFO;
typedef struct { HWND hwndFamily; HWND hwndStyle; HWND hwndSizes; HWND hwndScript; UINT iCharset; // returned for enumerating scripts
UINT cfdCharset; // ChooseFontData charset passed in here
HDC hDC; DWORD dwFlags; DWORD nFontType; BOOL bFillSize; BOOL bPrinterFont; LPCHOOSEFONT lpcf; #ifdef MM_DESIGNVECTOR_DEFINED
HWND hwndParent; // to extend the dialog for MM
PDESIGNVECTOR pDefaultDesignVector; #endif // MM_DESIGNVECTOR_DEFINED
} ENUM_FONT_DATA, *LPENUM_FONT_DATA;
typedef struct _ITEMDATA { PLOGFONT pLogFont; DWORD nFontType; } ITEMDATA, *LPITEMDATA;
//
// Chinese font numbers (zihao).
//
typedef struct { TCHAR name[5]; int size; int sizeFr; } ZIHAO;
#define NUM_ZIHAO 16
#ifdef UNICODE
ZIHAO stZihao[NUM_ZIHAO] = { { L"\x516b\x53f7", 5, 0 }, { L"\x4e03\x53f7", 5, 5 }, { L"\x5c0f\x516d", 6, 5 }, { L"\x516d\x53f7", 7, 5 }, { L"\x5c0f\x4e94", 9, 0 }, { L"\x4e94\x53f7", 10, 5 }, { L"\x5c0f\x56db", 12, 0 }, { L"\x56db\x53f7", 14, 0 }, { L"\x5c0f\x4e09", 15, 0 }, { L"\x4e09\x53f7", 16, 0 }, { L"\x5c0f\x4e8c", 18, 0 }, { L"\x4e8c\x53f7", 22, 0 }, { L"\x5c0f\x4e00", 24, 0 }, { L"\x4e00\x53f7", 26, 0 }, { L"\x5c0f\x521d", 36, 0 }, { L"\x521d\x53f7", 42, 0 } };
#else
ZIHAO stZihao[NUM_ZIHAO] = { { "\xb0\xcb\xba\xc5", 5, 0 }, { "\xc6\xdf\xba\xc5", 5, 5 }, { "\xd0\xa1\xc1\xf9", 6, 5 }, { "\xc1\xf9\xba\xc5", 7, 5 }, { "\xd0\xa1\xce\xe5", 9, 0 }, { "\xce\xe5\xba\xc5", 10, 5 }, { "\xd0\xa1\xcb\xc4", 12, 0 }, { "\xcb\xc4\xba\xc5", 14, 0 }, { "\xd0\xa1\xc8\xfd", 15, 0 }, { "\xc8\xfd\xba\xc5", 16, 0 }, { "\xd0\xa1\xb6\xfe", 18, 0 }, { "\xb6\xfe\xba\xc5", 22, 0 }, { "\xd0\xa1\xd2\xbb", 24, 0 }, { "\xd2\xbb\xba\xc5", 26, 0 }, { "\xd0\xa1\xb3\xf5", 36, 0 }, { "\xb3\xf5\xba\xc5", 42, 0 } };
#endif
//
// Global Variables.
//
UINT msgWOWLFCHANGE; UINT msgWOWCHOOSEFONT_GETLOGFONT;
//
// Color tables for color combo box.
// Order of values must match names in sz.src.
//
DWORD rgbColors[CCHCOLORS] = { RGB( 0, 0, 0), // Black
RGB(128, 0, 0), // Dark red
RGB( 0, 128, 0), // Dark green
RGB(128, 128, 0), // Dark yellow
RGB( 0, 0, 128), // Dark blue
RGB(128, 0, 128), // Dark purple
RGB( 0, 128, 128), // Dark aqua
RGB(128, 128, 128), // Dark grey
RGB(192, 192, 192), // Light grey
RGB(255, 0, 0), // Light red
RGB( 0, 255, 0), // Light green
RGB(255, 255, 0), // Light yellow
RGB( 0, 0, 255), // Light blue
RGB(255, 0, 255), // Light purple
RGB( 0, 255, 255), // Light aqua
RGB(255, 255, 255), // White
};
HBITMAP hbmFont = NULL; HFONT hDlgFont = NULL;
UINT DefaultCharset;
TCHAR szRegular[CCHSTYLE]; TCHAR szBold[CCHSTYLE]; TCHAR szItalic[CCHSTYLE]; TCHAR szBoldItalic[CCHSTYLE];
TCHAR szPtFormat[] = TEXT("%d");
TCHAR c_szRegular[] = TEXT("Regular"); TCHAR c_szBold[] = TEXT("Bold"); TCHAR c_szItalic[] = TEXT("Italic"); TCHAR c_szBoldItalic[] = TEXT("Bold Italic");
LPCFHOOKPROC glpfnFontHook = 0;
BOOL g_bIsSimplifiedChineseUI = FALSE;
//
// Context Help IDs.
//
const static DWORD aFontHelpIDs[] = // Context Help IDs
{ stc1, IDH_FONT_FONT, cmb1, IDH_FONT_FONT, stc2, IDH_FONT_STYLE, cmb2, IDH_FONT_STYLE, stc3, IDH_FONT_SIZE, cmb3, IDH_FONT_SIZE, psh3, IDH_COMM_APPLYNOW, grp1, IDH_FONT_EFFECTS, chx1, IDH_FONT_EFFECTS, chx2, IDH_FONT_EFFECTS, stc4, IDH_FONT_COLOR, cmb4, IDH_FONT_COLOR, grp2, IDH_FONT_SAMPLE, stc5, IDH_FONT_SAMPLE, stc6, NO_HELP, stc7, IDH_FONT_SCRIPT, cmb5, IDH_FONT_SCRIPT,
0, 0 };
//
// Function Prototypes.
//
#ifdef MM_DESIGNVECTOR_DEFINED
/* flag used for ChooseFontExA, ChooseFontExW and ChooseFontX : */ #define CHF_DESIGNVECTOR 0x0001
/* give the MM result into DESIGNVECTOR,
default is to convert the axis into the name for backwards compatibility */
/* ChooseFontExA and ChooseFontExW must be called with lpLogFont of size ENUMLOGFONTEXDV */ BOOL APIENTRY ChooseFontExA(LPCHOOSEFONTA, DWORD fl); BOOL APIENTRY ChooseFontExW(LPCHOOSEFONTW, DWORD fl); #ifdef UNICODE
#define ChooseFontEx ChooseFontExW
#else
#define ChooseFontEx ChooseFontExA
#endif // !UNICODE
#endif // MM_DESIGNVECTOR_DEFINED
BOOL ChooseFontX( #ifdef MM_DESIGNVECTOR_DEFINED
PFONTINFO pFI, DWORD fl); #else
PFONTINFO pFI); #endif // MM_DESIGNVECTOR_DEFINED
VOID SetStyleSelection( HWND hDlg, LPCHOOSEFONT lpcf, BOOL bInit);
#ifdef MM_DESIGNVECTOR_DEFINED
VOID SetMMAxesSelection( HWND hDlg, LPCHOOSEFONT lpcf); #endif // MM_DESIGNVECTOR_DEFINED
VOID HideDlgItem( HWND hDlg, int id);
VOID FixComboHeights( HWND hDlg);
BOOL_PTR CALLBACK FormatCharDlgProc( HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam);
void SelectStyleFromLF( HWND hwnd, LPLOGFONT lplf);
int CBSetTextFromSel( HWND hwnd);
int CBSetSelFromText( HWND hwnd, LPTSTR lpszString);
int CBGetTextAndData( HWND hwnd, LPTSTR lpszString, int iSize, PULONG_PTR lpdw);
int CBFindString( HWND hwnd, LPTSTR lpszString);
BOOL GetPointSizeInRange( HWND hDlg, LPCHOOSEFONT lpcf, LPINT pts, WORD wFlags);
BOOL ResetSampleFromScript( HWND hdlg, HWND hwndScript, PFONTINFO pFI);
BOOL ProcessDlgCtrlCommand(HWND hDlg, PFONTINFO pFI, WORD wId, WORD wCmd, HWND hwnd);
int CmpFontType( DWORD ft1, DWORD ft2);
int FontFamilyEnumProc( LPENUMLOGFONTEX lplf, LPNEWTEXTMETRIC lptm, DWORD nFontType, LPENUM_FONT_DATA lpData);
BOOL GetFontFamily( HWND hDlg, HDC hDC, DWORD dwEnumCode, UINT iCharset);
VOID CBAddSize( HWND hwnd, int pts, LPCHOOSEFONT lpcf);
int InsertStyleSorted( HWND hwnd, LPTSTR lpszStyle, LPLOGFONT lplf);
PLOGFONT CBAddStyle( HWND hwnd, LPTSTR lpszStyle, DWORD nFontType, LPLOGFONT lplf);
int CBAddScript( HWND hwnd, LPTSTR lpszScript, UINT iCharset);
VOID FillInMissingStyles( HWND hwnd);
VOID FillScalableSizes( HWND hwnd, LPCHOOSEFONT lpcf);
int FontStyleEnumProc( LPENUMLOGFONTEX lplf, LPNEWTEXTMETRIC lptm, DWORD nFontType, LPENUM_FONT_DATA lpData);
VOID FreeFonts( HWND hwnd);
VOID FreeAllItemData( HWND hDlg, PFONTINFO pFI);
VOID InitLF( LPLOGFONT lplf);
#ifdef MM_DESIGNVECTOR_DEFINED
int FontMMAxesEnumProc( LPENUMLOGFONTEXDV lplf, LPENUMTEXTMETRIC lpetm, DWORD nFontType, LPENUM_FONT_DATA lpData); #endif // MM_DESIGNVECTOR_DEFINED
int FontScriptEnumProc( LPENUMLOGFONTEX lplf, LPNEWTEXTMETRIC lptm, DWORD nFontType, LPENUM_FONT_DATA lpData);
BOOL GetFontStylesAndSizes( HWND hDlg, PFONTINFO pFI, LPCHOOSEFONT lpcf, BOOL bForceSizeFill);
VOID FillColorCombo( HWND hDlg);
BOOL DrawSizeComboItem( LPDRAWITEMSTRUCT lpdis);
BOOL DrawFamilyComboItem( LPDRAWITEMSTRUCT lpdis);
BOOL DrawColorComboItem( LPDRAWITEMSTRUCT lpdis);
VOID DrawSampleText( HWND hDlg, PFONTINFO pFI, LPCHOOSEFONT lpcf, HDC hDC);
BOOL FillInFont( HWND hDlg, PFONTINFO pFI, LPCHOOSEFONT lpcf, LPLOGFONT lplf, BOOL bSetBits);
#ifdef MM_DESIGNVECTOR_DEFINED
BOOL FillInFontEx( HWND hDlg, PFONTINFO pFI, LPCHOOSEFONT lpcf, LPENUMLOGFONTEXDV lplf, BOOL bSetBits);
BOOL SetLogFontEx( HWND hDlg, LPCHOOSEFONT lpcf, LPENUMLOGFONTEXDV lplf);
#endif // MM_DESIGNVECTOR_DEFINED
BOOL SetLogFont( HWND hDlg, LPCHOOSEFONT lpcf, LPLOGFONT lplf);
VOID TermFont();
int GetPointString( LPTSTR buf, HDC hDC, int height);
DWORD FlipColor( DWORD rgb);
HBITMAP LoadBitmaps( int id);
BOOL LookUpFontSubs(LPCTSTR lpSubFontName, LPTSTR lpRealFontName);
BOOL GetUnicodeSampleText(HDC hdc, LPTSTR lpString, int nMaxCount);
#ifdef UNICODE
void ThunkChooseFontA2W( PFONTINFO pFI);
void ThunkChooseFontW2A( PFONTINFO pFI);
#ifdef MM_DESIGNVECTOR_DEFINED
VOID ThunkEnumLogFontExDvA2W( LPENUMLOGFONTEXDVA lpLFA, LPENUMLOGFONTEXDVW lpLFW);
VOID ThunkEnumLogFontExDvW2A( LPENUMLOGFONTEXDVW lpLFW, LPENUMLOGFONTEXDVA lpLFA); #endif // MM_DESIGNVECTOR_DEFINED
VOID ThunkLogFontA2W( LPLOGFONTA lpLFA, LPLOGFONTW lpLFW);
VOID ThunkLogFontW2A( LPLOGFONTW lpLFW, LPLOGFONTA lpLFA); #endif
|