Added GDI+ to the package's Windows version: DLL loaded, initialized, and shut down. It will be used for drawing to Areas because using GDI itself is more complex than it needs to be.

This commit is contained in:
Pietro Gagliardi 2014-03-24 17:01:33 -04:00
parent 5c8587ab00
commit cfcac03df7
3 changed files with 31 additions and 0 deletions

View File

@ -12,6 +12,7 @@ var (
kernel32 = syscall.NewLazyDLL("kernel32.dll")
gdi32 = syscall.NewLazyDLL("gdi32.dll")
comctl32 = syscall.NewLazyDLL("comctl32.dll")
gdiplus = syscall.NewLazyDLL("gdiplus.dll")
)
type _HANDLE uintptr

View File

@ -11,6 +11,7 @@ import (
var (
hInstance _HANDLE
nCmdShow int
gdiplusToken uintptr
)
// TODO is this trick documented in MSDN?
@ -56,6 +57,26 @@ func getWinMainnCmdShow() {
}
}
func initGDIPlus() (err error) {
var gdiplusInit struct {
GdiplusVersion uint32
DebugEventCallback uintptr
SuppressBackgroundThread int32 // originally BOOL
SuppressExternalCodecs int32 // originally BOOL
}
gdiplusInit.GdiplusVersion = 1 // required
// TODO suppress external codecs?
r1, _, err := gdiplus.NewProc("GdiplusStartup").Call(
uintptr(unsafe.Pointer(&gdiplusToken)),
uintptr(unsafe.Pointer(&gdiplusInit)),
uintptr(0)) // we use the GDI+ thread so no need for output info
if r1 != 0 { // failure
return fmt.Errorf("error initializing GDI+ (GDI+ error code %d; windows last error %v)", r1, err)
}
return nil
}
func doWindowsInit() (err error) {
err = getWinMainhInstance()
if err != nil {
@ -74,6 +95,14 @@ func doWindowsInit() (err error) {
if err != nil {
return fmt.Errorf("error initializing Common Controls (comctl32.dll): %v", err)
}
err = initGDIPlus()
if err != nil {
return fmt.Errorf("error initializing GDI+ (gdiplus.dll): %v", err)
}
// TODO others
return nil // all ready to go
}
func doWindowsQuitStuff() {
gdiplus.NewProc("GdiplusShutdown").Call(gdiplusToken) // returns void according to MSDN
}

View File

@ -84,6 +84,7 @@ func ui(main func()) error {
}
}
doWindowsQuitStuff()
return nil
}