65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
|
// 8 february 2014
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
type WNDCLASS struct {
|
||
|
Style uint32
|
||
|
LpfnWndProc WNDPROC
|
||
|
CbClsExtra int // TODO exact Go type for C int? MSDN says C int
|
||
|
CbWndExtra int // TODO exact Go type for C int? MSDN says C int
|
||
|
HInstance HANDLE // actually HINSTANCE
|
||
|
HIcon HANDLE // actually HICON
|
||
|
HCursor HANDLE // actually HCURSOR
|
||
|
HbrBackground HBRUSH
|
||
|
LpszMenuName *string // TODO this should probably just be a regular string with "" indicating no name but MSDN doesn't say if that's legal or not
|
||
|
LpszClassName string
|
||
|
}
|
||
|
|
||
|
type _WNDCLASSW struct {
|
||
|
style uint32
|
||
|
lpfnWndProc uintptr
|
||
|
cbClsExtra int
|
||
|
cbWndExtra int
|
||
|
hInstance HANDLE
|
||
|
hIcon HANDLE
|
||
|
hCursor HANDLE
|
||
|
hbrBackground HBRUSH
|
||
|
lpszMenuName *uint16
|
||
|
lpszClassName *uint16
|
||
|
}
|
||
|
|
||
|
func (w *WNDCLASS) toNative() *_WNDCLASSW {
|
||
|
menuName := (*uint16)(nil)
|
||
|
if w.LpszMenuName != nil {
|
||
|
menuName = syscall.StringToUTF16Ptr(*w.LpszMenuName)
|
||
|
}
|
||
|
return &_WNDCLASSW{
|
||
|
style: w.Style,
|
||
|
lpfnWndProc: syscall.NewCallback(w.LpfnWndProc),
|
||
|
cbClsExtra: w.CbClsExtra,
|
||
|
cbWndExtra: w.CbWndExtra,
|
||
|
hInstance: w.HInstance,
|
||
|
hIcon: w.HIcon,
|
||
|
hCursor: w.HCursor,
|
||
|
hbrBackground: w.HbrBackground,
|
||
|
lpszMenuName: menuName,
|
||
|
lpszClassName: syscall.StringToUTF16Ptr(w.LpszClassName),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
registerClass = user32.NewProc("RegisterClassW")
|
||
|
)
|
||
|
|
||
|
func RegisterClass(lpWndClass *WNDCLASS) (class ATOM, err error) {
|
||
|
r1, _, err := registerClass.Call(uintptr(unsafe.Pointer(lpWndClass.toNative())))
|
||
|
if r1 == 0 { // failure
|
||
|
return 0, err
|
||
|
}
|
||
|
return ATOM(r1), nil
|
||
|
}
|