summaryrefslogtreecommitdiff
path: root/wndclass.go
blob: 38ff4ae5666bd5dcec3031ea16df755fa08b59e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// 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
}