New Lexer:
/* Title: Font
Font functions.
*/
/*
Function: Font
Creates the font and optinally, sets it for the control.
Parameters:
hCtrl - Handle of the control. If omitted, function will create font and return its handle.
Font - AHK font defintion ("s10 italic, Courier New"). If you already have created font, pass its handle here.
bRedraw - If this parameter is TRUE, the control redraws itself. By default 1.
Returns:
Font handle.
*/
Font(HCtrl="", Font="", BRedraw=1) {
static WM_SETFONT := 0x30
if Font is not integer
{
StringSplit, Font, Font, `,,%A_Space%%A_Tab%
fontStyle := Font1, fontFace := Font2
;parse font
italic := InStr(Font1, "italic") ? 1 : 0
underline := InStr(Font1, "underline") ? 1 : 0
strikeout := InStr(Font1, "strikeout") ? 1 : 0
weight := InStr(Font1, "bold") ? 700 : 400
;height
RegExMatch(Font1, "(?<=[S|s])(\d{1,2})(?=[ ,]*)", height)
ifEqual, height,, SetEnv, height, 10
RegRead, LogPixels, HKEY_LOCAL_MACHINE, SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI, LogPixels
height := -DllCall("MulDiv", "int", Height, "int", LogPixels, "int", 72)
IfEqual, Font2,,SetEnv Font2, MS Sans Serif
;create font
hFont := DllCall("CreateFont", "int", height, "int", 0, "int", 0, "int", 0
,"int", weight, "Uint", italic, "Uint", underline
,"uint", strikeOut, "Uint", nCharSet, "Uint", 0, "Uint", 0, "Uint", 0, "Uint", 0, "str", Font2, "Uint")
} else hFont := Font
ifNotEqual, HCtrl,,SendMessage, WM_SETFONT, hFont, BRedraw,,ahk_id %HCtrl%
return hFont
}
/*
Function: DrawText
Draws text using specified font on device context or calculates width and height of the text.
Parameters:
Text - Text to be drawn or measured.
DC - Device context to use. If omitted, function will use Desktop's DC.
Font - If string, font description in AHK syntax. If number, font handle. If omitted, uses the system font to calculate text metrics.
Flags - Drawing/Calculating flags. Space separated combination of flag names. For the description of the flags see <http://msdn.microsoft.com/en-us/library/ms901121.aspx>.
Rect - Bounding rectangle. Space separated list of left,top,right,bottom coordinates.
Width could also be used with CALCRECT WORDBREAK style to calculate word-wrapped height of the text given its width.
Flags:
CALCRECT, BOTTOM, CALCRECT, CENTER, VCENTER, TABSTOP, SINGLELINE, RIGHT, NOPREFIX, NOCLIP, INTERNAL, EXPANDTABS, AHKSIZE.
Returns:
Decimal number. Width "." Height of text. If AHKSIZE flag is set, the size will be returned as w%w% h%h%
*/
Font_DrawText(Text, DC="", Font="", Flags="", Rect="") {
static DT_AHKSIZE=0, DT_CALCRECT=0x400, DT_WORDBREAK=0x10, DT_BOTTOM=0x8, DT_CALCRECT=0x400, DT_CENTER=0x1, DT_VCENTER=0x4, DT_TABSTOP=0x80, DT_SINGLELINE=0x20, DT_RIGHT=0x2, DT_NOPREFIX=0x800, DT_NOCLIP=0x100, DT_INTERNAL=0x1000, DT_EXPANDTABS=0x40
hFlag := (Rect = "") ? DT_NOCLIP : 0
StringSplit, Rect, Rect, %A_Space%
loop, parse, Flags, %A_Space%
ifEqual, A_LoopField,,continue
else hFlag |= DT_%A_LoopField%
if Font is integer
hFont := Font, bUserHandle := 1
else if (Font != "")
hFont := Font( "", Font)
else hFlag |= DT_INTERNAL
IfEqual, hDC,,SetEnv, hDC, % DllCall("GetDC", "Uint", 0, "Uint")
ifNotEqual, hFont,, SetEnv, hOldFont, % DllCall("SelectObject", "Uint", hDC, "Uint", hFont)
VarSetCapacity(RECT, 16)
if (Rect0 != 0)
loop, 4
NumPut(Rect%A_Index%, RECT, (A_Index-1)*4)
h := DllCall("DrawTextA", "Uint", hDC, "Str", Text, "int", StrLen(Text), "uint", &RECT, "uint", hFlag)
;clean
ifNotEqual, hOldFont,,DllCall("SelectObject", "Uint", hDC, "Uint", hOldFont)
ifNotEqual, bUserHandle, 1, DllCall("DeleteObject", "Uint", hFont)
ifNotEqual, DC,,DllCall("ReleaseDC", "Uint", 0, "Uint", hDC)
return InStr(Flags, "AHKSIZE") ? "w" NumGet(RECT, 8) " h" h : NumGet(RECT, 8) "." h
}
/* Group: About
o Version 1.0 by majkinetor.
o Licensed under BSD <http://creativecommons.org/licenses/BSD/>.
*/