75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
// 10 february 2014
|
|
package main
|
|
|
|
import (
|
|
// "syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
const (
|
|
SPI_GETNONCLIENTMETRICS = 0x0029
|
|
LF_FACESIZE = 32 // from wingdi.h
|
|
)
|
|
|
|
type LOGFONT struct {
|
|
lfHeight int32
|
|
lfWidth int32
|
|
lfEscapement int32
|
|
lfOrientation int32
|
|
lfWeight int32
|
|
lfItalic byte
|
|
lfUnderline byte
|
|
lfStrikeOut byte
|
|
lfCharSet byte
|
|
lfOutPrecision byte
|
|
lfClipPrecision byte
|
|
lfQuality byte
|
|
lfPitchAndFamily byte
|
|
lfFaceName [LF_FACESIZE]uint16
|
|
}
|
|
|
|
type NONCLIENTMETRICS struct {
|
|
cbSize uint32
|
|
iBorderWidth int
|
|
iScrollWidth int
|
|
iScrollHeight int
|
|
iCaptionWidth int
|
|
iCaptionHeight int
|
|
lfCaptionFont LOGFONT
|
|
iSmCaptionWidth int
|
|
iSmCaptionHeight int
|
|
lfSmCaptionFont LOGFONT
|
|
iMenuWidth int
|
|
iMenuHeight int
|
|
lfMenuFont LOGFONT
|
|
lfStatusFont LOGFONT
|
|
lfMessageFont LOGFONT
|
|
}
|
|
|
|
var (
|
|
systemParametersInfo = user32.NewProc("SystemParametersInfoW")
|
|
createFontIndirect = gdi32.NewProc("CreateFontIndirectW")
|
|
)
|
|
|
|
// TODO adorn errors with which step failed?
|
|
// TODO this specific font doesn't seem like the right one but that's all I could find for what people actually use; also I need to return the other ones and check HWND types to make sure I apply the right font to the right thing...
|
|
func getStandardWindowFont() (hfont HANDLE, err error) {
|
|
var ncm NONCLIENTMETRICS
|
|
|
|
ncm.cbSize = uint32(unsafe.Sizeof(ncm))
|
|
r1, _, err := systemParametersInfo.Call(
|
|
uintptr(SPI_GETNONCLIENTMETRICS),
|
|
uintptr(unsafe.Sizeof(ncm)),
|
|
uintptr(unsafe.Pointer(&ncm)),
|
|
0)
|
|
if r1 == 0 { // failure
|
|
return NULL, err
|
|
}
|
|
// TODO does this specify an error?
|
|
r1, _, err = createFontIndirect.Call(uintptr(unsafe.Pointer(&ncm.lfMessageFont)))
|
|
if r1 == 0 { // failure
|
|
return NULL, err
|
|
}
|
|
return HANDLE(r1), nil
|
|
}
|