andlabs-ui/init_windows.go

86 lines
2.1 KiB
Go
Raw Normal View History

// 8 february 2014
package ui
import (
"fmt"
"unsafe"
)
var (
2014-06-10 12:10:59 -05:00
hInstance _HANDLE
nCmdShow int
)
// TODO is this documented?
func getWinMainhInstance() (err error) {
r1, _, err := kernel32.NewProc("GetModuleHandleW").Call(uintptr(_NULL))
2014-06-10 12:10:59 -05:00
if r1 == 0 { // failure
return err
}
hInstance = _HANDLE(r1)
return nil
}
// this is what MinGW-w64 does (for instance, http://sourceforge.net/p/mingw-w64/code/6604/tree/trunk/mingw-w64-crt/crt/crtexe.c#l320); Burgundy in irc.freenode.net/#winapi said that the Visual C++ runtime does this too
2014-02-15 13:11:54 -06:00
func getWinMainnCmdShow() {
var info struct {
2014-06-10 12:10:59 -05:00
cb uint32
lpReserved *uint16
lpDesktop *uint16
lpTitle *uint16
dwX uint32
dwY uint32
dwXSize uint32
dwYSzie uint32
dwXCountChars uint32
dwYCountChars uint32
dwFillAttribute uint32
dwFlags uint32
wShowWindow uint16
cbReserved2 uint16
lpReserved2 *byte
hStdInput _HANDLE
hStdOutput _HANDLE
hStdError _HANDLE
}
// does not fail according to MSDN
kernel32.NewProc("GetStartupInfoW").Call(uintptr(unsafe.Pointer(&info)))
2014-06-10 12:10:59 -05:00
if info.dwFlags&_STARTF_USESHOWWINDOW != 0 {
nCmdShow = int(info.wShowWindow)
2014-02-15 13:11:54 -06:00
} else {
nCmdShow = _SW_SHOWDEFAULT
}
}
func doWindowsInit() (err error) {
err = getWinMainhInstance()
if err != nil {
return fmt.Errorf("error getting WinMain hInstance: %v", err)
}
2014-02-15 13:11:54 -06:00
getWinMainnCmdShow()
err = initWndClassInfo()
if err != nil {
return fmt.Errorf("error initializing standard window class auxiliary info: %v", err)
}
err = registerStdWndClass()
if err != nil {
return fmt.Errorf("error registering standard window class (for Window): %v", err)
}
err = registerAreaWndClass()
if err != nil {
return fmt.Errorf("error registering Area window class: %v", err)
}
err = getStandardWindowFonts()
if err != nil {
return fmt.Errorf("error getting standard window fonts: %v", err)
}
err = initCommonControls()
if err != nil {
return fmt.Errorf("error initializing Common Controls (comctl32.dll): %v", err)
}
// others go here
2014-06-10 12:10:59 -05:00
return nil // all ready to go
}