func (cb *ComboBox) AddString(str string) (idx int, err error) {
	ret := cb.SendMessage(win.CB_ADDSTRING, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str))))
	if int(ret) < 0 {
		err = errors.New("add string to combobox error")
	} else {
		idx = int(ret)
	}
	return
}
AddString adds a string to the list box of a combo box. If the combo box does not have the CBS_SORT style,
the string is added to the end of the list. Otherwise, the string is inserted into the list, and the list is sorted.
The return value idx is the zero-based index to the string in the list box of the combo box.
package wingui
import (
	"errors"
	"github.com/lxn/win"
	"log"
	"syscall"
	"unsafe"
)
type ComboBox struct {
	WindowBase
	OnSelChange func()
}
func (cb *ComboBox) WndProc(msg uint32, wParam, lParam uintptr) uintptr {
	switch msg {
	case win.WM_COMMAND:
		cmdCode := win.HIWORD(uint32(wParam))
		switch cmdCode {
		case win.CBN_SELCHANGE:
			if cb.OnSelChange != nil {
				cb.OnSelChange()
			}
			return 1
		}
	}
	return cb.AsWindowBase().WndProc(msg, wParam, lParam)
}
func (cb *ComboBox) GetCurSel() int {
	return int(int32(cb.SendMessage(win.CB_GETCURSEL, 0, 0)))
}
func (cb *ComboBox) SetCurSel(value int) error {
	index := int(int32(cb.SendMessage(win.CB_SETCURSEL, uintptr(value), 0)))
	if index != value {
		return errors.New("invalid index")
	}
	return nil
}
func (cb *ComboBox) GetCount() int {
	return int(int32(cb.SendMessage(win.CB_GETCOUNT, 0, 0)))
}
func (cb *ComboBox) SetItemData(index int, data uintptr) error {
	ret := cb.SendMessage(win.CB_SETITEMDATA, uintptr(index), data)
	if ret == win.CB_ERR {
		return errors.New("set item data error")
	}
	return nil
}
func (cb *ComboBox) GetItemData(index int) (data uintptr, err error) {
	ret := cb.SendMessage(win.CB_GETITEMDATA, uintptr(index), 0)
	if ret == win.CB_ERR {
		err = errors.New("GetItemData error")
	} else {
		data = ret
	}
	return
}
func (cb *ComboBox) ResetContent() int {
	return int(int32(cb.SendMessage(win.CB_RESETCONTENT, 0, 0)))
}