summaryrefslogtreecommitdiff
path: root/controls_windows.go
blob: 06d7317a978105d76dcffb24546f620aa40c1534 (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
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
// 9 february 2014
package main

import (
//	"syscall"
//	"unsafe"
)

// Button styles.
const (
	// from winuser.h
	_BS_PUSHBUTTON = 0x00000000
	_BS_DEFPUSHBUTTON = 0x00000001
	_BS_CHECKBOX = 0x00000002
	_BS_AUTOCHECKBOX = 0x00000003
	_BS_RADIOBUTTON = 0x00000004
	_BS_3STATE = 0x00000005
	_BS_AUTO3STATE = 0x00000006
	_BS_GROUPBOX = 0x00000007
	_BS_USERBUTTON = 0x00000008
	_BS_AUTORADIOBUTTON = 0x00000009
	_BS_PUSHBOX = 0x0000000A
	_BS_OWNERDRAW = 0x0000000B
	_BS_TYPEMASK = 0x0000000F
	_BS_LEFTTEXT = 0x00000020
	_BS_TEXT = 0x00000000
	_BS_ICON = 0x00000040
	_BS_BITMAP = 0x00000080
	_BS_LEFT = 0x00000100
	_BS_RIGHT = 0x00000200
	_BS_CENTER = 0x00000300
	_BS_TOP = 0x00000400
	_BS_BOTTOM = 0x00000800
	_BS_VCENTER = 0x00000C00
	_BS_PUSHLIKE = 0x00001000
	_BS_MULTILINE = 0x00002000
	_BS_NOTIFY = 0x00004000
	_BS_FLAT = 0x00008000
	_BS_RIGHTBUTTON = _BS_LEFTTEXT
	// from commctrl.h
//	_BS_SPLITBUTTON = 0x0000000C		// Windows Vista and newer and(/or?) comctl6 only
//	_BS_DEFSPLITBUTTON = 0x0000000D	// Windows Vista and newer and(/or?) comctl6 only
//	_BS_COMMANDLINK = 0x0000000E		// Windows Vista and newer and(/or?) comctl6 only
//	_BS_DEFCOMMANDLINK = 0x0000000F	// Windows Vista and newer and(/or?) comctl6 only
)

// Button WM_COMMAND notifications.
const (
	// from winuser.h
	_BN_CLICKED = 0
	_BN_PAINT = 1
	_BN_HILITE = 2
	_BN_UNHILITE = 3
	_BN_DISABLE = 4
	_BN_DOUBLECLICKED = 5
	_BN_PUSHED = _BN_HILITE
	_BN_UNPUSHED = _BN_UNHILITE
	_BN_DBLCLK = _BN_DOUBLECLICKED
	_BN_SETFOCUS = 6
	_BN_KILLFOCUS = 7
)

// Button check states.
const (
	// from winuser.h
	_BST_UNCHECKED = 0x0000
	_BST_CHECKED = 0x0001
	_BST_INDETERMINATE = 0x0002
)
/*
var (
	checkDlgButton = user32.NewProc("CheckDlgButton")
	checkRadioButton = user32.NewProc("CheckRadioButton")
	isDlgButtonChecked = user32.NewProc("IsDlgButtonChecked")
)

func CheckDlgButton(hDlg HWND, nIDButton int, uCheck uint32) (err error) {
	r1, _, err := checkDlgButton.Call(
		uintptr(hDlg),
		uintptr(nIDButton),
		uintptr(uCheck))
	if r1 == 0 {		// failure
		return err
	}
	return nil
}

func CheckRadioButton(hDlg HWND, nIDFirstButton int, nIDLastButton int, nIDCheckButton int) (err error) {
	r1, _, err := checkRadioButton.Call(
		uintptr(hDlg),
		uintptr(nIDFirstButton),
		uintptr(nIDLastButton),
		uintptr(nIDCheckButton))
	if r1 == 0 {		// failure
		return err
	}
	return nil
}

// TODO handle errors
func IsDlgButtonChecked(hDlg HWND, nIDButton int) (state uint32, err error) {
	r1, _, _ := isDlgButtonChecked.Call(
		uintptr(hDlg),
		uintptr(nIDButton))
	return uint32(r1), nil
}

// Combobox styles.
const (
	// from winuser.h
	CBS_SIMPLE = 0x0001
	CBS_DROPDOWN = 0x0002
	CBS_DROPDOWNLIST = 0x0003
	CBS_OWNERDRAWFIXED = 0x0010
	CBS_OWNERDRAWVARIABLE = 0x0020
	CBS_AUTOHSCROLL = 0x0040
	CBS_OEMCONVERT = 0x0080
	CBS_SORT = 0x0100
	CBS_HASSTRINGS = 0x0200
	CBS_NOINTEGRALHEIGHT = 0x0400
	CBS_DISABLENOSCROLL = 0x0800
	CBS_UPPERCASE = 0x2000
	CBS_LOWERCASE = 0x4000
)

// Combobox messages.
// TODO filter out messages not provided in windows 2000
const (
	// from winuser.h
	CB_GETEDITSEL = 0x0140
	CB_LIMITTEXT = 0x0141
	CB_SETEDITSEL = 0x0142
	CB_ADDSTRING = 0x0143
	CB_DELETESTRING = 0x0144
	CB_DIR = 0x0145
	CB_GETCOUNT = 0x0146
	CB_GETCURSEL = 0x0147
	CB_GETLBTEXT = 0x0148
	CB_GETLBTEXTLEN = 0x0149
	CB_INSERTSTRING = 0x014A
	CB_RESETCONTENT = 0x014B
	CB_FINDSTRING = 0x014C
	CB_SELECTSTRING = 0x014D
	CB_SETCURSEL = 0x014E
	CB_SHOWDROPDOWN = 0x014F
	CB_GETITEMDATA = 0x0150
	CB_SETITEMDATA = 0x0151
	CB_GETDROPPEDCONTROLRECT = 0x0152
	CB_SETITEMHEIGHT = 0x0153
	CB_GETITEMHEIGHT = 0x0154
	CB_SETEXTENDEDUI = 0x0155
	CB_GETEXTENDEDUI = 0x0156
	CB_GETDROPPEDSTATE = 0x0157
	CB_FINDSTRINGEXACT = 0x0158
	CB_SETLOCALE = 0x0159
	CB_GETLOCALE = 0x015A
	CB_GETTOPINDEX = 0x015B
	CB_SETTOPINDEX = 0x015C
	CB_GETHORIZONTALEXTENT = 0x015D
	CB_SETHORIZONTALEXTENT = 0x015E
	CB_GETDROPPEDWIDTH = 0x015F
	CB_SETDROPPEDWIDTH = 0x0160
	CB_INITSTORAGE = 0x0161
	CB_MULTIPLEADDSTRING = 0x0163
	CB_GETCOMBOBOXINFO = 0x0164
)

// Combobox WM_COMMAND notificaitons.
// TODO filter out notifications not provided in windows 2000
const (
	// from winuser.h
	CBN_ERRSPACE = (-1)		// TODO this will blow up the Go compiler if it's used
	CBN_SELCHANGE = 1
	CBN_DBLCLK = 2
	CBN_SETFOCUS = 3
	CBN_KILLFOCUS = 4
	CBN_EDITCHANGE = 5
	CBN_EDITUPDATE = 6
	CBN_DROPDOWN = 7
	CBN_CLOSEUP = 8
	CBN_SELENDOK = 9
	CBN_SELENDCANCEL = 10
)

// Edit control styles.
const (
	// from winuser.h
	ES_LEFT = 0x0000
	ES_CENTER = 0x0001
	ES_RIGHT = 0x0002
	ES_MULTILINE = 0x0004
	ES_UPPERCASE = 0x0008
	ES_LOWERCASE = 0x0010
	ES_PASSWORD = 0x0020
	ES_AUTOVSCROLL = 0x0040
	ES_AUTOHSCROLL = 0x0080
	ES_NOHIDESEL = 0x0100
	ES_OEMCONVERT = 0x0400
	ES_READONLY = 0x0800
	ES_WANTRETURN = 0x1000
	ES_NUMBER = 0x2000
)

// Edit control messages.
// TODO filter out messages not provided in windows 2000
const (
	// from winuser.h
	EM_GETSEL = 0x00B0
	EM_SETSEL = 0x00B1
	EM_GETRECT = 0x00B2
	EM_SETRECT = 0x00B3
	EM_SETRECTNP = 0x00B4
	EM_SCROLL = 0x00B5
	EM_LINESCROLL = 0x00B6
	EM_SCROLLCARET = 0x00B7
	EM_GETMODIFY = 0x00B8
	EM_SETMODIFY = 0x00B9
	EM_GETLINECOUNT = 0x00BA
	EM_LINEINDEX = 0x00BB
	EM_SETHANDLE = 0x00BC
	EM_GETHANDLE = 0x00BD
	EM_GETTHUMB = 0x00BE
	EM_LINELENGTH = 0x00C1
	EM_REPLACESEL = 0x00C2
	EM_GETLINE = 0x00C4
	EM_LIMITTEXT = 0x00C5
	EM_CANUNDO = 0x00C6
	EM_UNDO = 0x00C7
	EM_FMTLINES = 0x00C8
	EM_LINEFROMCHAR = 0x00C9
	EM_SETTABSTOPS = 0x00CB
	EM_SETPASSWORDCHAR = 0x00CC
	EM_EMPTYUNDOBUFFER = 0x00CD
	EM_GETFIRSTVISIBLELINE = 0x00CE
	EM_SETREADONLY = 0x00CF
	EM_SETWORDBREAKPROC = 0x00D0
	EM_GETWORDBREAKPROC = 0x00D1
	EM_GETPASSWORDCHAR = 0x00D2
	EM_SETMARGINS = 0x00D3
	EM_GETMARGINS = 0x00D4
	EM_SETLIMITTEXT = EM_LIMITTEXT		// [;win40 Name change]
	EM_GETLIMITTEXT = 0x00D5
	EM_POSFROMCHAR = 0x00D6
	EM_CHARFROMPOS = 0x00D7
	EM_SETIMESTATUS = 0x00D8
	EM_GETIMESTATUS = 0x00D9
)

// Edit control WM_COMMAND notifications.
// TODO filter out notifications not provided in windows 2000
const (
	// from winuser.h
	EN_SETFOCUS = 0x0100
	EN_KILLFOCUS = 0x0200
	EN_CHANGE = 0x0300
	EN_UPDATE = 0x0400
	EN_ERRSPACE = 0x0500
	EN_MAXTEXT = 0x0501
	EN_HSCROLL = 0x0601
	EN_VSCROLL = 0x0602
	EN_ALIGN_LTR_EC = 0x0700
	EN_ALIGN_RTL_EC = 0x0701
	EC_LEFTMARGIN = 0x0001
	EC_RIGHTMARGIN = 0x0002
	EC_USEFONTINFO = 0xFFFF
	EMSIS_COMPOSITIONSTRING = 0x0001
	EIMES_GETCOMPSTRATONCE = 0x0001
	EIMES_CANCELCOMPSTRINFOCUS = 0x0002
	EIMES_COMPLETECOMPSTRKILLFOCUS = 0x0004
)

// Listbox styles.
const (
	// from winuser.h
	LBS_NOTIFY = 0x0001
	LBS_SORT = 0x0002
	LBS_NOREDRAW = 0x0004
	LBS_MULTIPLESEL = 0x0008
	LBS_OWNERDRAWFIXED = 0x0010
	LBS_OWNERDRAWVARIABLE = 0x0020
	LBS_HASSTRINGS = 0x0040
	LBS_USETABSTOPS = 0x0080
	LBS_NOINTEGRALHEIGHT = 0x0100
	LBS_MULTICOLUMN = 0x0200
	LBS_WANTKEYBOARDINPUT = 0x0400
	LBS_EXTENDEDSEL = 0x0800
	LBS_DISABLENOSCROLL = 0x1000
	LBS_NODATA = 0x2000
	LBS_NOSEL = 0x4000
	LBS_COMBOBOX = 0x8000
	LBS_STANDARD = (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)
)

// Listbox messages.
// TODO filter out messages not provided in windows 2000
const (
	// from winuser.h
	LB_ADDSTRING = 0x0180
	LB_INSERTSTRING = 0x0181
	LB_DELETESTRING = 0x0182
	LB_SELITEMRANGEEX = 0x0183
	LB_RESETCONTENT = 0x0184
	LB_SETSEL = 0x0185
	LB_SETCURSEL = 0x0186
	LB_GETSEL = 0x0187
	LB_GETCURSEL = 0x0188
	LB_GETTEXT = 0x0189
	LB_GETTEXTLEN = 0x018A
	LB_GETCOUNT = 0x018B
	LB_SELECTSTRING = 0x018C
	LB_DIR = 0x018D
	LB_GETTOPINDEX = 0x018E
	LB_FINDSTRING = 0x018F
	LB_GETSELCOUNT = 0x0190
	LB_GETSELITEMS = 0x0191
	LB_SETTABSTOPS = 0x0192
	LB_GETHORIZONTALEXTENT = 0x0193
	LB_SETHORIZONTALEXTENT = 0x0194
	LB_SETCOLUMNWIDTH = 0x0195
	LB_ADDFILE = 0x0196
	LB_SETTOPINDEX = 0x0197
	LB_GETITEMRECT = 0x0198
	LB_GETITEMDATA = 0x0199
	LB_SETITEMDATA = 0x019A
	LB_SELITEMRANGE = 0x019B
	LB_SETANCHORINDEX = 0x019C
	LB_GETANCHORINDEX = 0x019D
	LB_SETCARETINDEX = 0x019E
	LB_GETCARETINDEX = 0x019F
	LB_SETITEMHEIGHT = 0x01A0
	LB_GETITEMHEIGHT = 0x01A1
	LB_FINDSTRINGEXACT = 0x01A2
	LB_SETLOCALE = 0x01A5
	LB_GETLOCALE = 0x01A6
	LB_SETCOUNT = 0x01A7
	LB_INITSTORAGE = 0x01A8
	LB_ITEMFROMPOINT = 0x01A9
	LB_MULTIPLEADDSTRING = 0x01B1
	LB_GETLISTBOXINFO = 0x01B2
)

// Listbox WM_COMMAND notifications and message returns.
// TODO filter out notifications not provided in windows 2000
const (
	// from winuser.h
	LB_OKAY = 0
	LB_ERR = (-1)				// TODO this will blow up the Go compiler if it's used
	LBN_ERRSPACE = (-2)		// TODO this will blow up the Go compiler if it's used
	LBN_SELCHANGE = 1
	LBN_DBLCLK = 2
	LBN_SELCANCEL = 3
	LBN_SETFOCUS = 4
	LBN_KILLFOCUS = 5
)

// Static control styles.
const (
	// from winuser.h
	SS_LEFT = 0x00000000
	SS_CENTER = 0x00000001
	SS_RIGHT = 0x00000002
	SS_ICON = 0x00000003
	SS_BLACKRECT = 0x00000004
	SS_GRAYRECT = 0x00000005
	SS_WHITERECT = 0x00000006
	SS_BLACKFRAME = 0x00000007
	SS_GRAYFRAME = 0x00000008
	SS_WHITEFRAME = 0x00000009
	SS_USERITEM = 0x0000000A
	SS_SIMPLE = 0x0000000B
	SS_LEFTNOWORDWRAP = 0x0000000C
	SS_OWNERDRAW = 0x0000000D
	SS_BITMAP = 0x0000000E
	SS_ENHMETAFILE = 0x0000000F
	SS_ETCHEDHORZ = 0x00000010
	SS_ETCHEDVERT = 0x00000011
	SS_ETCHEDFRAME = 0x00000012
	SS_TYPEMASK = 0x0000001F
	SS_REALSIZECONTROL = 0x00000040
	SS_NOPREFIX = 0x00000080
	SS_NOTIFY = 0x00000100
	SS_CENTERIMAGE = 0x00000200
	SS_RIGHTJUST = 0x00000400
	SS_REALSIZEIMAGE = 0x00000800
	SS_SUNKEN = 0x00001000
	SS_EDITCONTROL = 0x00002000
	SS_ENDELLIPSIS = 0x00004000
	SS_PATHELLIPSIS = 0x00008000
	SS_WORDELLIPSIS = 0x0000C000
	SS_ELLIPSISMASK = 0x0000C000
)

// Static control messages and WM_COMMAND notifications.
const (
	// from winuser.h
	STM_SETICON = 0x0170
	STM_GETICON = 0x0171
	STM_SETIMAGE = 0x0172
	STM_GETIMAGE = 0x0173
	STN_CLICKED = 0
	STN_DBLCLK = 1
	STN_ENABLE = 2
	STN_DISABLE = 3
)
*/