This program is a translation of PICKFONT.C -- Create Logical Font © Charles Petzold, 1998, described and analysed in Chapter 17 of the book Programming Windows, 5th Edition.
With the PICKFONT program you can define many of the fields of a LOGFONT structure. The program creates a logical font and displays the characteristics of the real font after the logical font has been selected in a device context. This is a handy program for understanding how logical fonts are mapped to real fonts.
' ========================================================================================
' PICKFONT.BAS
' This program is a translation/Adaptation of PICKFONT.C -- Create Logical Font
' © Charles Petzold, 1998, described and analysed in Chapter 17 of the book Programming
' Windows, 5th Edition.
' With the PICKFONT program you can define many of the fields of a LOGFONT structure. The
' program creates a logical font and displays the characteristics of the real font after
' the logical font has been selected in a device context. This is a handy program for
' understanding how logical fonts are mapped to real fonts.
' ========================================================================================
#COMPILE EXE
#DIM ALL
#INCLUDE ONCE "windows.inc"
#INCLUDE ONCE "comdlg32.inc"
#RESOURCE RES, "pickfont.res"
%IDC_LF_HEIGHT = 1000
%IDC_LF_WIDTH = 1001
%IDC_LF_ESCAPE = 1002
%IDC_LF_ORIENT = 1003
%IDC_LF_WEIGHT = 1004
%IDC_MM_TEXT = 1005
%IDC_MM_LOMETRIC = 1006
%IDC_MM_HIMETRIC = 1007
%IDC_MM_LOENGLISH = 1008
%IDC_MM_HIENGLISH = 1009
%IDC_MM_TWIPS = 1010
%IDC_MM_LOGTWIPS = 1011
%IDC_LF_ITALIC = 1012
%IDC_LF_UNDER = 1013
%IDC_LF_STRIKE = 1014
%IDC_MATCH_ASPECT = 1015
%IDC_ADV_GRAPHICS = 1016
%IDC_LF_CHARSET = 1017
%IDC_CHARSET_HELP = 1018
%IDC_DEFAULT_QUALITY = 1019
%IDC_DRAFT_QUALITY = 1020
%IDC_PROOF_QUALITY = 1021
%IDC_LF_FACENAME = 1022
%IDC_OUT_DEFAULT = 1023
%IDC_OUT_STRING = 1024
%IDC_OUT_CHARACTER = 1025
%IDC_OUT_STROKE = 1026
%IDC_OUT_TT = 1027
%IDC_OUT_DEVICE = 1028
%IDC_OUT_RASTER = 1029
%IDC_OUT_TT_ONLY = 1030
%IDC_OUT_OUTLINE = 1031
%IDC_DEFAULT_PITCH = 1032
%IDC_FIXED_PITCH = 1033
%IDC_VARIABLE_PITCH = 1034
%IDC_FF_DONTCARE = 1035
%IDC_FF_ROMAN = 1036
%IDC_FF_SWISS = 1037
%IDC_FF_MODERN = 1038
%IDC_FF_SCRIPT = 1039
%IDC_FF_DECORATIVE = 1040
%IDC_TM_HEIGHT = 1041
%IDC_TM_ASCENT = 1042
%IDC_TM_DESCENT = 1043
%IDC_TM_INTLEAD = 1044
%IDC_TM_EXTLEAD = 1045
%IDC_TM_AVECHAR = 1046
%IDC_TM_MAXCHAR = 1047
%IDC_TM_WEIGHT = 1048
%IDC_TM_OVERHANG = 1049
%IDC_TM_DIGASPX = 1050
%IDC_TM_DIGASPY = 1051
%IDC_TM_FIRSTCHAR = 1052
%IDC_TM_LASTCHAR = 1053
%IDC_TM_DEFCHAR = 1054
%IDC_TM_BREAKCHAR = 1055
%IDC_TM_ITALIC = 1056
%IDC_TM_UNDER = 1057
%IDC_TM_STRUCK = 1058
%IDC_TM_VARIABLE = 1059
%IDC_TM_VECTOR = 1060
%IDC_TM_TRUETYPE = 1061
%IDC_TM_DEVICE = 1062
%IDC_TM_FAMILY = 1063
%IDC_TM_CHARSET = 1064
%IDC_TM_FACENAME = 1065
%IDM_DEVICE_SCREEN = 40001
%IDM_DEVICE_PRINTER = 40002
TYPE DLGPARAMS
iDevice AS LONG
iMapMode AS LONG
fMatchAspect AS LONG
fAdvGraphics AS LONG
lf AS LOGFONT
tm AS TEXTMETRIC
szFaceName AS ASCIIZ * %LF_FULLFACESIZE
END TYPE
' Global variables
GLOBAL hDlg AS DWORD
GLOBAL szAppName AS ASCIIZ * 256
DECLARE SUB SetLogFontFromFields (BYVAL hdlg AS DWORD, BYVAL pdp AS DLGPARAMS PTR)
DECLARE SUB SetFieldsFromTextMetric (BYVAL hdlg AS DWORD, BYVAL pdp AS DLGPARAMS PTR)
DECLARE SUB MySetMapMode (BYVAL hdc AS DWORD, BYVAL iMapMode AS LONG)
' ========================================================================================
' Main
' ========================================================================================
FUNCTION WinMain (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, _
BYVAL pszCmdLine AS WSTRINGZ PTR, BYVAL iCmdShow AS LONG) AS LONG
LOCAL hwnd AS DWORD
LOCAL wcex AS WNDCLASSEX
LOCAL szCaption AS ASCIIZ * 256
szAppName = "PickFont"
wcex.cbSize = SIZEOF(wcex)
wcex.style = %CS_HREDRAW OR %CS_VREDRAW
wcex.lpfnWndProc = CODEPTR(WndProc)
wcex.cbClsExtra = 0
wcex.cbWndExtra = 0
wcex.hInstance = hInstance
wcex.hIcon = LoadIcon(%NULL, BYVAL %IDI_APPLICATION)
wcex.hCursor = LoadCursor(%NULL, BYVAL %IDC_ARROW)
wcex.hbrBackground = GetStockObject(%WHITE_BRUSH)
wcex.lpszMenuName = VARPTR(szAppName)
wcex.lpszClassName = VARPTR(szAppName)
IF ISFALSE RegisterClassEx(wcex) THEN
FUNCTION = %TRUE
EXIT FUNCTION
END IF
szCaption = "PickFont: Create Logical Font"
hwnd = CreateWindowEx(%WS_EX_CONTROLPARENT, _ ' extended style
szAppName, _ ' window class name
szCaption, _ ' window caption
%WS_OVERLAPPEDWINDOW, _ ' window style
%CW_USEDEFAULT, _ ' initial x position
%CW_USEDEFAULT, _ ' initial y position
%CW_USEDEFAULT, _ ' initial x size
%CW_USEDEFAULT, _ ' initial y size
%NULL, _ ' parent window handle
%NULL, _ ' window menu handle
hInstance, _ ' program instance handle
BYVAL %NULL) ' creation parameters
ShowWindow hwnd, iCmdShow
UpdateWindow hwnd
LOCAL uMsg AS tagMsg
WHILE GetMessage(uMsg, %NULL, 0, 0)
TranslateMessage uMsg
DispatchMessage uMsg
WEND
FUNCTION = uMsg.wParam
END FUNCTION
' ========================================================================================
' ========================================================================================
' Main dialog callback.
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS DWORD, BYVAL uMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
STATIC dp AS DLGPARAMS
STATIC szText AS ASCIIZ * 256
LOCAL hdc AS DWORD
LOCAL ps AS PAINTSTRUCT
LOCAL rc AS RECT
LOCAL lpc AS CREATESTRUCT PTR
LOCAL hInstance AS DWORD
SELECT CASE uMsg
CASE %WM_CREATE
szText = CHR$(&H41, &H42, &H43, &H44, &H45) & " " & _
CHR$(&H61, &H62, &H63, &H64, &H65) & " " & _
CHR$(&HC0, &HC1, &HC2, &HC3, &HC4, &HC5) & " " & _
CHR$(&HE0, &HE1, &HE2, &HE3, &HE4, &HE5)
dp.iDevice = %IDM_DEVICE_SCREEN
lpc = lParam
hInstance = @lpc.hInstance
hdlg = CreateDialogParam(hInstance, szAppName, hwnd, CODEPTR(DlgProc), VARPTR(dp))
EXIT FUNCTION
CASE %WM_SETFOCUS
SetFocus hdlg
FUNCTION = 0
EXIT FUNCTION
CASE %WM_COMMAND
SELECT CASE LO(WORD, wParam)
CASE %IDM_DEVICE_SCREEN, %IDM_DEVICE_PRINTER
CheckMenuItem GetMenu(hwnd), dp.iDevice, %MF_UNCHECKED
dp.iDevice = LO(WORD, wParam)
CheckMenuItem GetMenu (hwnd), dp.iDevice, %MF_CHECKED
SendMessage hwnd, %WM_COMMAND, %IDOK, 0
EXIT FUNCTION
END SELECT
CASE %WM_PAINT
hdc = BeginPaint(hwnd, ps)
' Set graphics mode so escapement works in Windows NT
SetGraphicsMode hdc, IIF&(dp.fAdvGraphics <> 0, %GM_ADVANCED, %GM_COMPATIBLE)
' Set the mapping mode and the mapper flag
MySetMapMode hdc, dp.iMapMode
SetMapperFlags hdc, dp.fMatchAspect
' Find the point to begin drawing text
GetClientRect hdlg, rc
rc.nBottom = rc.nBottom + 1
DPtoLP hdc, BYVAL VARPTR(rc), 2
' Create and select the font; display the text
SelectObject hdc, CreateFontIndirect(dp.lf)
TextOut hdc, rc.nLeft, rc.nBottom, szText, LEN(szText)
DeleteObject SelectObject(hdc, GetStockObject(%SYSTEM_FONT))
EndPaint hwnd, ps
EXIT FUNCTION
CASE %WM_DESTROY
PostQuitMessage 0
EXIT FUNCTION
END SELECT
FUNCTION = DefWindowProc(hwnd, uMsg, wParam, lParam)
END FUNCTION
' ========================================================================================
FUNCTION DlgProc (BYVAL hdlg AS DWORD, BYVAL uMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG
STATIC pdp AS DLGPARAMS PTR
LOCAL hdcDevice AS DWORD
LOCAL hFont AS DWORD
LOCAL pd AS PRINTDLGAPI
SELECT CASE uMsg
CASE %WM_INITDIALOG
' Save pointer to dialog-parameters structure in WndProc
pdp = lParam
SendDlgItemMessage hdlg, %IDC_LF_FACENAME, %EM_LIMITTEXT, %LF_FACESIZE - 1, 0
CheckRadioButton hdlg, %IDC_OUT_DEFAULT, %IDC_OUT_OUTLINE, %IDC_OUT_DEFAULT
CheckRadioButton hdlg, %IDC_DEFAULT_QUALITY, %IDC_PROOF_QUALITY, %IDC_DEFAULT_QUALITY
CheckRadioButton hdlg, %IDC_DEFAULT_PITCH, %IDC_VARIABLE_PITCH, %IDC_DEFAULT_PITCH
CheckRadioButton hdlg, %IDC_FF_DONTCARE, %IDC_FF_DECORATIVE, %IDC_FF_DONTCARE
CheckRadioButton hdlg, %IDC_MM_TEXT, %IDC_MM_LOGTWIPS, %IDC_MM_TEXT
SendMessage hdlg, %WM_COMMAND, %IDOK, 0
' fall through
CASE %WM_SETFOCUS
SetFocus GetDlgItem(hdlg, %IDC_LF_HEIGHT)
FUNCTION = %FALSE
EXIT FUNCTION
CASE %WM_COMMAND
SELECT CASE LO(WORD, wParam)
CASE %IDC_CHARSET_HELP
MessageBox hdlg, _
"0 = Ansi" & $LF & _
"1 = Default" & $LF & _
"2 = Symbol" & $LF & _
"128 = Shift JIS (Japanese)" & $LF & _
"129 = Hangul (Korean)" & $LF & _
"130 = Johab (Korean)" & $LF & _
"134 = GB 2312 (Simplified Chinese)" & $LF & _
"136 = Chinese Big 5 (Traditional Chinese)" & $LF & _
"177 = Hebrew" & $LF & _
"178 = Arabic" & $LF & _
"161 = Greek" & $LF & _
"162 = Turkish" & $LF & _
"163 = Vietnamese" & $LF & _
"204 = Russian" & $LF & _
"222 = Thai" & $LF & _
"238 = East European" & $LF & _
"255 = OEM", _
szAppName, %MB_OK OR %MB_ICONINFORMATION
FUNCTION = %TRUE
EXIT FUNCTION
' These radio buttons set the lfOutPrecision field
CASE %IDC_OUT_DEFAULT
@pdp.lf.lfOutPrecision = %OUT_DEFAULT_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_OUT_STRING
@pdp.lf.lfOutPrecision = %OUT_STRING_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_OUT_CHARACTER
@pdp.lf.lfOutPrecision = %OUT_CHARACTER_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_OUT_STROKE
@pdp.lf.lfOutPrecision = %OUT_STROKE_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_OUT_TT
@pdp.lf.lfOutPrecision = %OUT_TT_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
case %IDC_OUT_DEVICE:
@pdp.lf.lfOutPrecision = %OUT_DEVICE_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_OUT_RASTER
@pdp.lf.lfOutPrecision = %OUT_RASTER_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_OUT_TT_ONLY
@pdp.lf.lfOutPrecision = %OUT_TT_ONLY_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_OUT_OUTLINE
@pdp.lf.lfOutPrecision = %OUT_OUTLINE_PRECIS
FUNCTION = %TRUE
EXIT FUNCTION
'/ These three radio buttons set the lfQuality field
CASE %IDC_DEFAULT_QUALITY
@pdp.lf.lfQuality = %DEFAULT_QUALITY
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_DRAFT_QUALITY
@pdp.lf.lfQuality = %DRAFT_QUALITY
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_PROOF_QUALITY
@pdp.lf.lfQuality = %PROOF_QUALITY
FUNCTION = %TRUE
EXIT FUNCTION
' These three radio buttons set the lower nibble
' of the lfPitchAndFamily field
CASE %IDC_DEFAULT_PITCH
@pdp.lf.lfPitchAndFamily = _
(&HF0 AND @pdp.lf.lfPitchAndFamily) OR %DEFAULT_PITCH
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_FIXED_PITCH
@pdp.lf.lfPitchAndFamily = _
(&HF0 AND @pdp.lf.lfPitchAndFamily) OR %FIXED_PITCH
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_VARIABLE_PITCH
@pdp.lf.lfPitchAndFamily = _
(&HF0 AND @pdp.lf.lfPitchAndFamily) OR %VARIABLE_PITCH
FUNCTION = %TRUE
EXIT FUNCTION
' These six radio buttons set the upper nibble
' of the lfPitchAndFamily field
CASE %IDC_FF_DONTCARE
@pdp.lf.lfPitchAndFamily = _
(&H0F AND @pdp.lf.lfPitchAndFamily) OR %FF_DONTCARE
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_FF_ROMAN
@pdp.lf.lfPitchAndFamily = _
(&H0F AND @pdp.lf.lfPitchAndFamily) OR %FF_ROMAN
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_FF_SWISS
@pdp.lf.lfPitchAndFamily = _
(&H0F AND @pdp.lf.lfPitchAndFamily) OR %FF_SWISS
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_FF_MODERN
@pdp.lf.lfPitchAndFamily = _
(&H0F AND @pdp.lf.lfPitchAndFamily) OR %FF_MODERN
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_FF_SCRIPT
@pdp.lf.lfPitchAndFamily = _
(&H0F AND @pdp.lf.lfPitchAndFamily) OR %FF_SCRIPT
FUNCTION = %TRUE
EXIT FUNCTION
CASE %IDC_FF_DECORATIVE
@pdp.lf.lfPitchAndFamily = _
(&H0F AND @pdp.lf.lfPitchAndFamily) OR %FF_DECORATIVE
FUNCTION = %TRUE
EXIT FUNCTION
' Mapping mode:
CASE %IDC_MM_TEXT, %IDC_MM_LOMETRIC, %IDC_MM_HIMETRIC, _
%IDC_MM_LOENGLISH, %IDC_MM_HIENGLISH, %IDC_MM_TWIPS, %IDC_MM_LOGTWIPS
@pdp.iMapMode = LO(WORD, wParam)
FUNCTION = %TRUE
EXIT FUNCTION
' OK button pressed
' -----------------
CASE %IDOK
' Get LOGFONT structure
SetLogFontFromFields hdlg, pdp
' Set Match-Aspect and Advanced Graphics flags
@pdp.fMatchAspect = IsDlgButtonChecked(hdlg, %IDC_MATCH_ASPECT)
@pdp.fAdvGraphics = IsDlgButtonChecked(hdlg, %IDC_ADV_GRAPHICS)
' Get Information Context
IF @pdp.iDevice = %IDM_DEVICE_SCREEN THEN
hdcDevice = CreateIC("DISPLAY", BYVAL %NULL, BYVAL %NULL, BYVAL %NULL)
ELSE
pd.lStructSize = SIZEOF(pd)
pd.hwndOwner = hdlg
pd.Flags = %PD_RETURNDEFAULT OR %PD_RETURNIC
pd.hDevNames = %NULL
pd.hDevMode = %NULL
PrintDlg pd
hdcDevice = pd.hDC
END IF
' Set the mapping mode and the mapper flag
MySetMapMode hdcDevice, @pdp.iMapMode
SetMapperFlags hdcDevice, @pdp.fMatchAspect
' Create font and select it into IC
hFont = CreateFontIndirect(@pdp.lf)
SelectObject hdcDevice, hFont
' Get the text metrics and face name
GetTextMetrics hdcDevice, @pdp.tm
GetTextFace hdcDevice, %LF_FULLFACESIZE, @pdp.szFaceName
DeleteDC hdcDevice
DeleteObject hFont
' Update dialog fields and invalidate main window
SetFieldsFromTextMetric hdlg, pdp
InvalidateRect GetParent(hdlg), BYVAL %NULL, %TRUE
FUNCTION = %TRUE
EXIT FUNCTION
END SELECT
END SELECT
END FUNCTION
' ========================================================================================
' ========================================================================================
SUB SetLogFontFromFields (BYVAL hdlg AS DWORD, BYVAL pdp AS DLGPARAMS PTR)
@pdp.lf.lfHeight = GetDlgItemInt(hdlg, %IDC_LF_HEIGHT, %NULL, %TRUE)
@pdp.lf.lfWidth = GetDlgItemInt(hdlg, %IDC_LF_WIDTH, %NULL, %TRUE)
@pdp.lf.lfEscapement = GetDlgItemInt(hdlg, %IDC_LF_ESCAPE, %NULL, %TRUE)
@pdp.lf.lfOrientation = GetDlgItemInt(hdlg, %IDC_LF_ORIENT, %NULL, %TRUE)
@pdp.lf.lfWeight = GetDlgItemInt(hdlg, %IDC_LF_WEIGHT, %NULL, %TRUE)
@pdp.lf.lfCharSet = GetDlgItemInt(hdlg, %IDC_LF_CHARSET, %NULL, %FALSE)
@pdp.lf.lfItalic = IsDlgButtonChecked(hdlg, %IDC_LF_ITALIC) = %BST_CHECKED
@pdp.lf.lfUnderline = IsDlgButtonChecked(hdlg, %IDC_LF_UNDER) = %BST_CHECKED
@pdp.lf.lfStrikeOut = IsDlgButtonChecked(hdlg, %IDC_LF_STRIKE) = %BST_CHECKED
GetDlgItemText hdlg, %IDC_LF_FACENAME, @pdp.lf.lfFaceName, %LF_FACESIZE
END SUB
' ========================================================================================
' ========================================================================================
SUB SetFieldsFromTextMetric (BYVAL hdlg AS DWORD, BYVAL pdp AS DLGPARAMS PTR)
LOCAL szBuffer AS ASCIIZ * 10
LOCAL szYes AS ASCIIZ * 4
LOCAL szNo AS ASCIIZ * 3
DIM szFamily (6) AS ASCIIZ * 11
LOCAL BCHARFORM AS ASCIIZ * 7
LOCAL iPitchAndFamily AS LONG
BCHARFORM = "0x%02X"
szYes = "Yes"
szNo = "No"
szFamily(0) = "Don't Know"
szFamily(1) = "Roman"
szFamily(2) = "Swiss"
szFamily(3) = "Modern"
szFamily(4) = "Script"
szFamily(5) = "Decorative"
SzFamily(6) = "Undefined"
SetDlgItemInt hdlg, %IDC_TM_HEIGHT, @pdp.tm.tmHeight, %TRUE
SetDlgItemInt hdlg, %IDC_TM_ASCENT, @pdp.tm.tmAscent, %TRUE
SetDlgItemInt hdlg, %IDC_TM_DESCENT, @pdp.tm.tmDescent, %TRUE
SetDlgItemInt hdlg, %IDC_TM_INTLEAD, @pdp.tm.tmInternalLeading, %TRUE
SetDlgItemInt hdlg, %IDC_TM_EXTLEAD, @pdp.tm.tmExternalLeading, %TRUE
SetDlgItemInt hdlg, %IDC_TM_AVECHAR, @pdp.tm.tmAveCharWidth, %TRUE
SetDlgItemInt hdlg, %IDC_TM_MAXCHAR, @pdp.tm.tmMaxCharWidth, %TRUE
SetDlgItemInt hdlg, %IDC_TM_WEIGHT, @pdp.tm.tmWeight, %TRUE
SetDlgItemInt hdlg, %IDC_TM_OVERHANG, @pdp.tm.tmOverhang, %TRUE
SetDlgItemInt hdlg, %IDC_TM_DIGASPX, @pdp.tm.tmDigitizedAspectX, %TRUE
SetDlgItemInt hdlg, %IDC_TM_DIGASPY, @pdp.tm.tmDigitizedAspectY, %TRUE
wsprintf szBuffer, BCHARFORM, @pdp.tm.tmFirstChar
SetDlgItemText hdlg, %IDC_TM_FIRSTCHAR, szBuffer
wsprintf szBuffer, BCHARFORM, @pdp.tm.tmLastChar
SetDlgItemText hdlg, %IDC_TM_LASTCHAR, szBuffer
wsprintf szBuffer, BCHARFORM, @pdp.tm.tmDefaultChar
SetDlgItemText hdlg, %IDC_TM_DEFCHAR, szBuffer
wsprintf szBuffer, BCHARFORM, @pdp.tm.tmBreakChar
SetDlgItemText hdlg, %IDC_TM_BREAKCHAR, szBuffer
SetDlgItemText hdlg, %IDC_TM_ITALIC, IIF$(@pdp.tm.tmItalic = %TRUE, szYes, szNo)
SetDlgItemText hdlg, %IDC_TM_UNDER, IIF$(@pdp.tm.tmUnderlined = %TRUE, szYes, szNo)
SetDlgItemText hdlg, %IDC_TM_STRUCK, IIF$(@pdp.tm.tmStruckOut = %TRUE, szYes, szNo)
SetDlgItemText hdlg, %IDC_TM_VARIABLE, _
IIF$(%TMPF_FIXED_PITCH AND @pdp.tm.tmPitchAndFamily, szYes, szNo)
SetDlgItemText hdlg, %IDC_TM_VECTOR, _
IIF$(%TMPF_VECTOR AND @pdp.tm.tmPitchAndFamily, szYes, szNo)
SetDlgItemText hdlg, %IDC_TM_TRUETYPE, _
IIF$(%TMPF_TRUETYPE AND @pdp.tm.tmPitchAndFamily, szYes, szNo)
SetDlgItemText hdlg, %IDC_TM_DEVICE, _
IIF$(%TMPF_DEVICE AND @pdp.tm.tmPitchAndFamily, szYes, szNo)
iPitchAndFamily = @pdp.tm.tmPitchAndFamily
SHIFT RIGHT iPitchAndFamily, 4
SetDlgItemText hdlg, %IDC_TM_FAMILY, szFamily(MIN&(6, iPitchAndFamily))
SetDlgItemInt hdlg, %IDC_TM_CHARSET, @pdp.tm.tmCharSet, %FALSE
SetDlgItemText hdlg, %IDC_TM_FACENAME, @pdp.szFaceName
END SUB
' ========================================================================================
' ========================================================================================
SUB MySetMapMode (BYVAL hdc AS DWORD, BYVAL iMapMode AS LONG)
SELECT CASE iMapMode
CASE %IDC_MM_TEXT: SetMapMode hdc, %MM_TEXT
CASE %IDC_MM_LOMETRIC: SetMapMode hdc, %MM_LOMETRIC
CASE %IDC_MM_HIMETRIC: SetMapMode hdc, %MM_HIMETRIC
CASE %IDC_MM_LOENGLISH: SetMapMode hdc, %MM_LOENGLISH
CASE %IDC_MM_HIENGLISH: SetMapMode hdc, %MM_HIENGLISH
CASE %IDC_MM_TWIPS: SetMapMode hdc, %MM_TWIPS
CASE %IDC_MM_LOGTWIPS:
SetMapMode hdc, %MM_ANISOTROPIC
SetWindowExtEx hdc, 1440, 1440, BYVAL %NULL
SetViewportExtEx hdc, GetDeviceCaps(hdc, %LOGPIXELSX), _
GetDeviceCaps(hdc, %LOGPIXELSY), BYVAL %NULL
END SELECT
END SUB
' ========================================================================================
PICKFONT.RC
#define WS_CHILD 0x40000000L
#define WS_VISIBLE 0x10000000L
#define WS_BORDER 0x00800000L
#define WS_GROUP 0x00020000L
#define WS_TABSTOP 0x00010000L
#define IDC_STATIC (-1)
#define ES_AUTOHSCROLL 0x0080L
#define BS_AUTORADIOBUTTON 0x00000009L
#define BS_AUTOCHECKBOX 0x00000003L
#define IDOK 1
#define IDC_LF_HEIGHT 1000
#define IDC_LF_WIDTH 1001
#define IDC_LF_ESCAPE 1002
#define IDC_LF_ORIENT 1003
#define IDC_LF_WEIGHT 1004
#define IDC_MM_TEXT 1005
#define IDC_MM_LOMETRIC 1006
#define IDC_MM_HIMETRIC 1007
#define IDC_MM_LOENGLISH 1008
#define IDC_MM_HIENGLISH 1009
#define IDC_MM_TWIPS 1010
#define IDC_MM_LOGTWIPS 1011
#define IDC_LF_ITALIC 1012
#define IDC_LF_UNDER 1013
#define IDC_LF_STRIKE 1014
#define IDC_MATCH_ASPECT 1015
#define IDC_ADV_GRAPHICS 1016
#define IDC_LF_CHARSET 1017
#define IDC_CHARSET_HELP 1018
#define IDC_DEFAULT_QUALITY 1019
#define IDC_DRAFT_QUALITY 1020
#define IDC_PROOF_QUALITY 1021
#define IDC_LF_FACENAME 1022
#define IDC_OUT_DEFAULT 1023
#define IDC_OUT_STRING 1024
#define IDC_OUT_CHARACTER 1025
#define IDC_OUT_STROKE 1026
#define IDC_OUT_TT 1027
#define IDC_OUT_DEVICE 1028
#define IDC_OUT_RASTER 1029
#define IDC_OUT_TT_ONLY 1030
#define IDC_OUT_OUTLINE 1031
#define IDC_DEFAULT_PITCH 1032
#define IDC_FIXED_PITCH 1033
#define IDC_VARIABLE_PITCH 1034
#define IDC_FF_DONTCARE 1035
#define IDC_FF_ROMAN 1036
#define IDC_FF_SWISS 1037
#define IDC_FF_MODERN 1038
#define IDC_FF_SCRIPT 1039
#define IDC_FF_DECORATIVE 1040
#define IDC_TM_HEIGHT 1041
#define IDC_TM_ASCENT 1042
#define IDC_TM_DESCENT 1043
#define IDC_TM_INTLEAD 1044
#define IDC_TM_EXTLEAD 1045
#define IDC_TM_AVECHAR 1046
#define IDC_TM_MAXCHAR 1047
#define IDC_TM_WEIGHT 1048
#define IDC_TM_OVERHANG 1049
#define IDC_TM_DIGASPX 1050
#define IDC_TM_DIGASPY 1051
#define IDC_TM_FIRSTCHAR 1052
#define IDC_TM_LASTCHAR 1053
#define IDC_TM_DEFCHAR 1054
#define IDC_TM_BREAKCHAR 1055
#define IDC_TM_ITALIC 1056
#define IDC_TM_UNDER 1057
#define IDC_TM_STRUCK 1058
#define IDC_TM_VARIABLE 1059
#define IDC_TM_VECTOR 1060
#define IDC_TM_TRUETYPE 1061
#define IDC_TM_DEVICE 1062
#define IDC_TM_FAMILY 1063
#define IDC_TM_CHARSET 1064
#define IDC_TM_FACENAME 1065
#define IDM_DEVICE_SCREEN 40001
#define IDM_DEVICE_PRINTER 40002
/////////////////////////////////////////////////////////////////////////////
// Dialog
PICKFONT DIALOG DISCARDABLE 0, 0, 348, 308
STYLE WS_CHILD | WS_VISIBLE | WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "&Height:",IDC_STATIC,8,10,44,8
EDITTEXT IDC_LF_HEIGHT,64,8,24,12,ES_AUTOHSCROLL
LTEXT "&Width",IDC_STATIC,8,26,44,8
EDITTEXT IDC_LF_WIDTH,64,24,24,12,ES_AUTOHSCROLL
LTEXT "Escapement:",IDC_STATIC,8,42,44,8
EDITTEXT IDC_LF_ESCAPE,64,40,24,12,ES_AUTOHSCROLL
LTEXT "Orientation:",IDC_STATIC,8,58,44,8
EDITTEXT IDC_LF_ORIENT,64,56,24,12,ES_AUTOHSCROLL
LTEXT "Weight:",IDC_STATIC,8,74,44,8
EDITTEXT IDC_LF_WEIGHT,64,74,24,12,ES_AUTOHSCROLL
GROUPBOX "Mapping Mode",IDC_STATIC,97,3,96,90,WS_GROUP
CONTROL "Text",IDC_MM_TEXT,"Button",BS_AUTORADIOBUTTON,104,13,56,
8
CONTROL "Low Metric",IDC_MM_LOMETRIC,"Button",BS_AUTORADIOBUTTON,
104,24,56,8
CONTROL "High Metric",IDC_MM_HIMETRIC,"Button",
BS_AUTORADIOBUTTON,104,35,56,8
CONTROL "Low English",IDC_MM_LOENGLISH,"Button",
BS_AUTORADIOBUTTON,104,46,56,8
CONTROL "High English",IDC_MM_HIENGLISH,"Button",
BS_AUTORADIOBUTTON,104,57,56,8
CONTROL "Twips",IDC_MM_TWIPS,"Button",BS_AUTORADIOBUTTON,104,68,
56,8
CONTROL "Logical Twips",IDC_MM_LOGTWIPS,"Button",
BS_AUTORADIOBUTTON,104,79,64,8
CONTROL "Italic",IDC_LF_ITALIC,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,8,90,48,12
CONTROL "Underline",IDC_LF_UNDER,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,8,104,48,12
CONTROL "Strike Out",IDC_LF_STRIKE,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,8,118,48,12
CONTROL "Match Aspect",IDC_MATCH_ASPECT,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,60,104,62,8
CONTROL "Adv Grfx Mode",IDC_ADV_GRAPHICS,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,60,118,62,8
LTEXT "Character Set:",IDC_STATIC,8,137,46,8
EDITTEXT IDC_LF_CHARSET,58,135,24,12,ES_AUTOHSCROLL
PUSHBUTTON "?",IDC_CHARSET_HELP,90,135,14,14
GROUPBOX "Quality",IDC_STATIC,132,98,62,48,WS_GROUP
CONTROL "Default",IDC_DEFAULT_QUALITY,"Button",
BS_AUTORADIOBUTTON,136,110,40,8
CONTROL "Draft",IDC_DRAFT_QUALITY,"Button",BS_AUTORADIOBUTTON,
136,122,40,8
CONTROL "Proof",IDC_PROOF_QUALITY,"Button",BS_AUTORADIOBUTTON,
136,134,40,8
LTEXT "Face Name:",IDC_STATIC,8,154,44,8
EDITTEXT IDC_LF_FACENAME,58,152,136,12,ES_AUTOHSCROLL
GROUPBOX "Output Precision",IDC_STATIC,8,166,118,133,WS_GROUP
CONTROL "OUT_DEFAULT_PRECIS",IDC_OUT_DEFAULT,"Button",
BS_AUTORADIOBUTTON,12,178,112,8
CONTROL "OUT_STRING_PRECIS",IDC_OUT_STRING,"Button",
BS_AUTORADIOBUTTON,12,191,112,8
CONTROL "OUT_CHARACTER_PRECIS",IDC_OUT_CHARACTER,"Button",
BS_AUTORADIOBUTTON,12,204,112,8
CONTROL "OUT_STROKE_PRECIS",IDC_OUT_STROKE,"Button",
BS_AUTORADIOBUTTON,12,217,112,8
CONTROL "OUT_TT_PRECIS",IDC_OUT_TT,"Button",BS_AUTORADIOBUTTON,
12,230,112,8
CONTROL "OUT_DEVICE_PRECIS",IDC_OUT_DEVICE,"Button",
BS_AUTORADIOBUTTON,12,243,112,8
CONTROL "OUT_RASTER_PRECIS",IDC_OUT_RASTER,"Button",
BS_AUTORADIOBUTTON,12,256,112,8
CONTROL "OUT_TT_ONLY_PRECIS",IDC_OUT_TT_ONLY,"Button",
BS_AUTORADIOBUTTON,12,269,112,8
CONTROL "OUT_OUTLINE_PRECIS",IDC_OUT_OUTLINE,"Button",
BS_AUTORADIOBUTTON,12,282,112,8
GROUPBOX "Pitch",IDC_STATIC,132,166,62,50,WS_GROUP
CONTROL "Default",IDC_DEFAULT_PITCH,"Button",BS_AUTORADIOBUTTON,
137,176,52,8
CONTROL "Fixed",IDC_FIXED_PITCH,"Button",BS_AUTORADIOBUTTON,137,
189,52,8
CONTROL "Variable",IDC_VARIABLE_PITCH,"Button",
BS_AUTORADIOBUTTON,137,203,52,8
GROUPBOX "Family",IDC_STATIC,132,218,62,82,WS_GROUP
CONTROL "Don't Care",IDC_FF_DONTCARE,"Button",BS_AUTORADIOBUTTON,
137,229,52,8
CONTROL "Roman",IDC_FF_ROMAN,"Button",BS_AUTORADIOBUTTON,137,241,
52,8
CONTROL "Swiss",IDC_FF_SWISS,"Button",BS_AUTORADIOBUTTON,137,253,
52,8
CONTROL "Modern",IDC_FF_MODERN,"Button",BS_AUTORADIOBUTTON,137,
265,52,8
CONTROL "Script",IDC_FF_SCRIPT,"Button",BS_AUTORADIOBUTTON,137,
277,52,8
CONTROL "Decorative",IDC_FF_DECORATIVE,"Button",
BS_AUTORADIOBUTTON,137,289,52,8
DEFPUSHBUTTON "OK",IDOK,247,286,50,14
GROUPBOX "Text Metrics",IDC_STATIC,201,2,140,272,WS_GROUP
LTEXT "Height:",IDC_STATIC,207,12,64,8
LTEXT "0",IDC_TM_HEIGHT,281,12,44,8
LTEXT "Ascent:",IDC_STATIC,207,22,64,8
LTEXT "0",IDC_TM_ASCENT,281,22,44,8
LTEXT "Descent:",IDC_STATIC,207,32,64,8
LTEXT "0",IDC_TM_DESCENT,281,32,44,8
LTEXT "Internal Leading:",IDC_STATIC,207,42,64,8
LTEXT "0",IDC_TM_INTLEAD,281,42,44,8
LTEXT "External Leading:",IDC_STATIC,207,52,64,8
LTEXT "0",IDC_TM_EXTLEAD,281,52,44,8
LTEXT "Ave Char Width:",IDC_STATIC,207,62,64,8
LTEXT "0",IDC_TM_AVECHAR,281,62,44,8
LTEXT "Max Char Width:",IDC_STATIC,207,72,64,8
LTEXT "0",IDC_TM_MAXCHAR,281,72,44,8
LTEXT "Weight:",IDC_STATIC,207,82,64,8
LTEXT "0",IDC_TM_WEIGHT,281,82,44,8
LTEXT "Overhang:",IDC_STATIC,207,92,64,8
LTEXT "0",IDC_TM_OVERHANG,281,92,44,8
LTEXT "Digitized Aspect X:",IDC_STATIC,207,102,64,8
LTEXT "0",IDC_TM_DIGASPX,281,102,44,8
LTEXT "Digitized Aspect Y:",IDC_STATIC,207,112,64,8
LTEXT "0",IDC_TM_DIGASPY,281,112,44,8
LTEXT "First Char:",IDC_STATIC,207,122,64,8
LTEXT "0",IDC_TM_FIRSTCHAR,281,122,44,8
LTEXT "Last Char:",IDC_STATIC,207,132,64,8
LTEXT "0",IDC_TM_LASTCHAR,281,132,44,8
LTEXT "Default Char:",IDC_STATIC,207,142,64,8
LTEXT "0",IDC_TM_DEFCHAR,281,142,44,8
LTEXT "Break Char:",IDC_STATIC,207,152,64,8
LTEXT "0",IDC_TM_BREAKCHAR,281,152,44,8
LTEXT "Italic?",IDC_STATIC,207,162,64,8
LTEXT "0",IDC_TM_ITALIC,281,162,44,8
LTEXT "Underlined?",IDC_STATIC,207,172,64,8
LTEXT "0",IDC_TM_UNDER,281,172,44,8
LTEXT "Struck Out?",IDC_STATIC,207,182,64,8
LTEXT "0",IDC_TM_STRUCK,281,182,44,8
LTEXT "Variable Pitch?",IDC_STATIC,207,192,64,8
LTEXT "0",IDC_TM_VARIABLE,281,192,44,8
LTEXT "Vector Font?",IDC_STATIC,207,202,64,8
LTEXT "0",IDC_TM_VECTOR,281,202,44,8
LTEXT "TrueType Font?",IDC_STATIC,207,212,64,8
LTEXT "0",IDC_TM_TRUETYPE,281,212,44,8
LTEXT "Device Font?",IDC_STATIC,207,222,64,8
LTEXT "0",IDC_TM_DEVICE,281,222,44,8
LTEXT "Family:",IDC_STATIC,207,232,64,8
LTEXT "0",IDC_TM_FAMILY,281,232,44,8
LTEXT "Character Set:",IDC_STATIC,207,242,64,8
LTEXT "0",IDC_TM_CHARSET,281,242,44,8
LTEXT "0",IDC_TM_FACENAME,207,262,128,8
END
/////////////////////////////////////////////////////////////////////////////
// Menu
PICKFONT MENU DISCARDABLE
BEGIN
POPUP "&Device"
BEGIN
MENUITEM "&Screen", IDM_DEVICE_SCREEN, CHECKED
MENUITEM "&Printer", IDM_DEVICE_PRINTER
END
END