From 4d674ebd3d0e857fcaade5ff480ed6edd7eb7dd8 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Mon, 10 Feb 2014 16:00:11 -0500 Subject: [PATCH] Added listboxes and added a list box to the example window. --- common.go | 3 +- listboxes.go | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 33 +++++++++++++++++-- 3 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 listboxes.go diff --git a/common.go b/common.go index a51583d..51ebf6f 100644 --- a/common.go +++ b/common.go @@ -6,7 +6,8 @@ import ( "unsafe" ) -// TODO filter out commctrl.h stuff because the combobox stuff has values that differ between windows versions and bleh +// TODO filter out commctrl.h stuff because the combobox and listbox stuff has values that differ between windows versions and bleh +// either that or switch to ComboBoxEx and ListView because they might not have that problem??? var ( user32 = syscall.NewLazyDLL("user32.dll") diff --git a/listboxes.go b/listboxes.go new file mode 100644 index 0000000..294cd96 --- /dev/null +++ b/listboxes.go @@ -0,0 +1,91 @@ +// 10 february 2014 +package main + +import ( +// "syscall" +// "unsafe" +) + +// 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 +) diff --git a/main.go b/main.go index a5b68af..1e27088 100644 --- a/main.go +++ b/main.go @@ -24,9 +24,10 @@ const ( IDC_VARCOMBO IDC_FIXCOMBO IDC_EDIT + IDC_LIST ) -var varCombo, fixCombo, edit HWND +var varCombo, fixCombo, edit, list HWND func wndProc(hwnd HWND, msg uint32, wParam WPARAM, lParam LPARAM) LRESULT { switch msg { @@ -60,13 +61,20 @@ func wndProc(hwnd HWND, msg uint32, wParam WPARAM, lParam LPARAM) LRESULT { fatalf("error getting edit field text: %v", err) } + listIndex, err := SendMessage(list, LB_GETCURSEL, 0, 0) + if err != nil { + fatalf("error getting fixed list box current selection: %v", err) + } + // TODO get text from index + MessageBox(hwnd, fmt.Sprintf("button state: %s\n" + "variable combo box text: %s\n" + "fixed combo box text with WM_GETTEXT: %s\n" + "fixed combo box current index: %d\n" + - "edit field text: %s\n", - buttonclick, varText, fixTextWM, fixTextIndex, editText), + "edit field text: %s\n" + + "list box current index: %d\n", + buttonclick, varText, fixTextWM, fixTextIndex, editText, listIndex), "note", MB_OK) } @@ -194,6 +202,25 @@ func main() { fatalf("error creating edit field: %v", err) } + list, err = CreateWindowEx( + 0, + "LISTBOX", "", + LBS_STANDARD | controlStyle, + 20, 80, 100, 100, + hwnd, HMENU(IDC_FIXCOMBO), hInstance, NULL) + if err != nil { + fatalf("error creating list box: %v", err) + } + lItems := []string{"i", "j", "k", "l"} + for _, v := range lItems { + _, err := SendMessage(list, LB_ADDSTRING, 0, + LPARAMFromString(v)) + if err != nil { + fatalf("error adding %q to list box: %v", v, err) + } + // TODO check actual return value as THAT indicates an error + } + _, err = ShowWindow(hwnd, nCmdShow) if err != nil { fatalf("error showing window: %v", err)