windows-nt/Source/XPSP1/NT/sdktools/winobj/fontsel.c
2020-09-26 16:20:57 +08:00

256 lines
7.1 KiB
C

#include "windows.h"
#include <port1632.h>
#include "fontsel.h"
#define TA_LOWERCASE 0x01 // taken from winfile.h!
#define TA_BOLD 0x02
#define TA_ITALIC 0x04
extern HANDLE hAppInstance;
extern BOOL wTextAttribs;
extern HWND hwndFrame;
extern WORD wHelpMessage;
typedef struct {
HWND hwndLB;
HDC hdc;
} ENUM_FONT_DATA, *LPENUM_FONT_DATA;
INT APIENTRY FontSizeEnumProc(const LOGFONT *lplf, const TEXTMETRIC *lptm, DWORD nFontType, LPARAM lpData);
INT APIENTRY FontFaceEnumProc(const LOGFONT *lplf, const TEXTMETRIC *lptm, DWORD nFontType, LPARAM lpData);
INT_PTR APIENTRY FontDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam);
INT APIENTRY GetHeightFromPointsString(LPSTR sz);
VOID APIENTRY WFHelp(HWND hwnd);
BOOL
APIENTRY
MyChooseFont(
LPMYCHOOSEFONT lpcf
)
{
INT_PTR ret;
ret = DialogBoxParam(hAppInstance, MAKEINTRESOURCE(FONTDLG), lpcf->hwndOwner, FontDlgProc, (LPARAM)lpcf);
return ret == IDOK;
}
INT
APIENTRY
FontFaceEnumProc(
const LOGFONT *lplf,
const TEXTMETRIC *lptm,
DWORD nFontType,
LPARAM lParam
)
{
LPENUM_FONT_DATA lpData = (LPENUM_FONT_DATA) lParam;
if (lplf->lfCharSet == ANSI_CHARSET) {
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)lplf->lfFaceName);
}
return TRUE;
}
LPSTR
NEAR
PASCAL
GetPointString(
LPSTR buf,
HDC hdc,
INT height
)
{
wsprintf(buf, "%d", MulDiv((height < 0) ? -height : height, 72, GetDeviceCaps(hdc, LOGPIXELSY)));
return buf;
}
INT
APIENTRY
FontSizeEnumProc(
const LOGFONT *lplf,
const TEXTMETRIC *lptm,
DWORD nFontType,
LPARAM lParam
)
{
INT height;
CHAR buf[20];
LPENUM_FONT_DATA lpData = (LPENUM_FONT_DATA) lParam;
if (!(nFontType & RASTER_FONTTYPE)) {
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"6");
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"8");
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"10");
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"12");
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"14");
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"18");
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)(LPSTR)"24");
} else {
height = lptm->tmHeight - lptm->tmInternalLeading;
GetPointString(buf, lpData->hdc, height);
SendMessage(lpData->hwndLB, CB_ADDSTRING, 0, (LPARAM)(LPSTR)buf);
}
return TRUE;
}
VOID
NEAR
PASCAL
EnumFontSizes(
HWND hDlg,
HDC hdc,
LPSTR szFace,
INT height
)
{
ENUM_FONT_DATA data;
CHAR szTemp[10];
SendDlgItemMessage(hDlg, IDD_PTSIZE, CB_RESETCONTENT, 0, 0L);
data.hwndLB = GetDlgItem(hDlg, IDD_PTSIZE);
data.hdc = hdc;
EnumFonts(hdc, szFace, FontSizeEnumProc, (LPARAM)&data);
GetPointString(szTemp, hdc, height);
if ((INT)SendDlgItemMessage(hDlg, IDD_PTSIZE, CB_SELECTSTRING, -1, (LPARAM)szTemp) < 0)
SendDlgItemMessage(hDlg, IDD_PTSIZE, CB_SETCURSEL, 0, 0L);
}
// needs to be exported of course
INT_PTR
APIENTRY
FontDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
LOGFONT lf;
ENUM_FONT_DATA data;
HDC hdc;
CHAR szTemp[80];
INT sel;
static LPMYCHOOSEFONT lpcf;
switch (wMsg) {
case WM_INITDIALOG:
lpcf = (LPMYCHOOSEFONT)lParam;
hdc = GetDC(NULL); // screen fonts
data.hwndLB = GetDlgItem(hDlg, IDD_FACE);
data.hdc = hdc;
EnumFonts(hdc, NULL, FontFaceEnumProc, (LPARAM)&data);
sel = (INT)SendDlgItemMessage(hDlg, IDD_FACE, CB_SELECTSTRING, -1, (LPARAM)(lpcf->lpLogFont)->lfFaceName);
if (sel < 0) {
SendDlgItemMessage(hDlg, IDD_FACE, CB_SETCURSEL, 0, 0L);
sel = 0;
}
GetDlgItemText(hDlg, IDD_FACE, szTemp, sizeof(szTemp));
EnumFontSizes(hDlg, hdc, szTemp, lpcf->lpLogFont->lfHeight);
ReleaseDC(NULL, hdc);
CheckDlgButton(hDlg, IDD_ITALIC, lpcf->lpLogFont->lfItalic);
CheckDlgButton(hDlg, IDD_BOLD, (WORD)(lpcf->lpLogFont->lfWeight > 500));
CheckDlgButton(hDlg, IDD_LOWERCASE, (WORD)(wTextAttribs & TA_LOWERCASE));
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_HELP:
goto DoHelp;
case IDD_FACE:
switch (GET_WM_COMMAND_CMD(wParam, lParam)) {
case CBN_SELCHANGE:
GetDlgItemText(hDlg, IDD_FACE, szTemp, sizeof(szTemp));
hdc = GetDC(NULL); // screen fonts
EnumFontSizes(hDlg, hdc, szTemp, lpcf->lpLogFont->lfHeight);
ReleaseDC(NULL, hdc);
break;
}
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case IDOK:
if (IsDlgButtonChecked(hDlg, IDD_LOWERCASE))
wTextAttribs |= TA_LOWERCASE;
else
wTextAttribs &= ~TA_LOWERCASE;
if (IsDlgButtonChecked(hDlg, IDD_ITALIC))
wTextAttribs |= TA_ITALIC;
else
wTextAttribs &= ~TA_ITALIC;
if (IsDlgButtonChecked(hDlg, IDD_BOLD))
wTextAttribs |= TA_BOLD;
else
wTextAttribs &= ~TA_BOLD;
GetDlgItemText(hDlg, IDD_FACE, (LPSTR)lf.lfFaceName, sizeof(lf.lfFaceName));
GetDlgItemText(hDlg, IDD_PTSIZE, szTemp, sizeof(szTemp));
lf.lfHeight = (SHORT)GetHeightFromPointsString(szTemp);
lf.lfWeight = (SHORT)(IsDlgButtonChecked(hDlg, IDD_BOLD) ? 800 : 400);
lf.lfItalic = (BYTE)IsDlgButtonChecked(hDlg, IDD_ITALIC);
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfUnderline = 0;
lf.lfStrikeOut = 0;
lf.lfCharSet = ANSI_CHARSET;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfPitchAndFamily = DEFAULT_PITCH;
*(lpcf->lpLogFont) = lf;
EndDialog(hDlg, TRUE);
break;
default:
return FALSE;
}
break;
default:
if (wMsg == wHelpMessage) {
DoHelp:
WFHelp(hDlg);
return TRUE;
} else
return FALSE;
}
return TRUE;
}