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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
// 7 february 2014
package main
import (
"fmt"
"os"
"runtime"
)
func fatalf(format string, args ...interface{}) {
s := fmt.Sprintf(format, args...)
_, err := MessageBox(NULL,
"An internal error has occured:\n" + s,
os.Args[0],
MB_OK | MB_ICONERROR)
if err == nil {
os.Exit(1)
}
panic(fmt.Sprintf("error trying to warn user of internal error: %v\ninternal error:\n%s", err, s))
}
func wndProc(hwnd HWND, msg uint32, wparam WPARAM, lparam LPARAM) LRESULT {
switch msg {
case WM_CLOSE:
err := DestroyWindow(hwnd)
if err != nil {
fatalf("error destroying window: %v", err)
}
return 0
case WM_DESTROY:
err := PostQuitMessage(0)
if err != nil {
fatalf("error posting quit message: %v", err)
}
return 0
default:
return DefWindowProc(hwnd, msg, wparam, lparam)
}
fatalf("major bug: forgot a return on wndProc for message %d", msg)
panic("unreachable")
}
const className = "mainwin"
func main() {
runtime.LockOSThread()
hInstance, err := getWinMainhInstance()
if err != nil {
fatalf("error getting WinMain hInstance: %v", err)
}
nCmdShow, err := getWinMainnCmdShow()
if err != nil {
fatalf("error getting WinMain nCmdShow: %v", err)
}
icon, err := LoadIcon_ResourceID(NULL, IDI_APPLICATION)
if err != nil {
fatalf("error getting window icon: %v", err)
}
cursor, err := LoadCursor_ResourceID(NULL, IDC_ARROW)
if err != nil {
fatalf("error getting window cursor: %v", err)
}
wc := &WNDCLASS{
LpszClassName: className,
LpfnWndProc: wndProc,
HInstance: hInstance,
HIcon: icon,
HCursor: cursor,
HbrBackground: HBRUSH(COLOR_WINDOW + 1),
}
_, err = RegisterClass(wc)
if err != nil {
fatalf("error registering window class: %v", err)
}
hwnd, err := CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,
className, "Main Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 320, 240,
NULL, NULL, hInstance, NULL)
if err != nil {
fatalf("error creating window: %v", err)
}
_, err = ShowWindow(hwnd, nCmdShow)
if err != nil {
fatalf("error showing window: %v", err)
}
err = UpdateWindow(hwnd)
if err != nil {
fatalf("error updating window: %v", err)
}
for {
msg, done, err := GetMessage(NULL, 0, 0)
if err != nil {
fatalf("error getting message: %v", err)
}
if done {
break
}
_, err = TranslateMessage(msg)
if err != nil {
fatalf("error translating message: %v", err)
}
_, err = DispatchMessage(msg)
if err != nil {
fatalf("error dispatching message: %v", err)
}
}
}
|