func (b *Button) SetState(highlight bool) {
	wParam := 0
	if highlight {
		wParam = 1
	}
	b.SendMessage(win.BM_SETSTATE, uintptr(wParam), 0)
}
SetState sets the highlight state of a button.
The highlight state indicates whether the button is highlighted as if the user had pushed it.

Highlighting affects only the appearance of a button.
It has no effect on the check state of a radio button or check box.

A button is automatically highlighted when the user positions the cursor over it
and presses and holds the left mouse button. The highlighting is removed when the user releases the mouse button.
package wingui
import (
	"github.com/lxn/win"
	"github.com/whtiehack/wingui/winapi"
	"log"
	"syscall"
	"unsafe"
)
type Button struct {
	WindowBase
	OnClicked       func()
	OnDoubleClicked func()
}
func (b *Button) WndProc(msg uint32, wParam, lParam uintptr) uintptr {
	switch msg {
	case win.WM_COMMAND:
		switch win.HIWORD(uint32(wParam)) {
		case win.BN_CLICKED:
			if b.OnClicked != nil && lParam == uintptr(b.hwnd) {
				b.OnClicked()
			}
		case win.BN_DBLCLK:
			if b.OnDoubleClicked != nil && lParam == uintptr(b.hwnd) {
				b.OnDoubleClicked()
			}
		}
	}
	return b.AsWindowBase().WndProc(msg, wParam, lParam)
}
func (b *Button) GetNote() (str string) {
	textLength := b.SendMessage(win.BCM_GETNOTELENGTH, 0, 0)
	buf := make([]uint16, textLength+1)
	ret := b.SendMessage(win.BCM_GETNOTE, textLength+1, uintptr(unsafe.Pointer(&buf[0])))
	if int(ret) == 0 {
		log.Println("GetNote error:", b, "len:", textLength)
	} else {
		str = syscall.UTF16ToString(buf)
	}
	return
}
func (b *Button) SetNote(note string) {
	b.SendMessage(win.BCM_SETNOTE, 0, uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(note))))
}
func (b *Button) SetDropDownState(state bool) {
	wParam := 0
	if state {
		wParam = 1
	}
	b.SendMessage(win.BCM_SETDROPDOWNSTATE, uintptr(wParam), 0)
}
func (b *Button) SetShield(state bool) {
	wParam := 0
	if state {
		wParam = 1
	}
	b.SendMessage(win.BCM_SETSHIELD, uintptr(wParam), 0)
}
func (b *Button) Click() {
	b.SendMessage(win.BM_CLICK, 0, 0)
}
func (b *Button) GetCheck() int {
	return int(b.SendMessage(win.BM_GETCHECK, 0, 0))
}
func (b *Button) GetState() int {
	return int(b.SendMessage(win.BM_GETSTATE, 0, 0))
}
func (b *Button) SetCheck(state int) {
	b.SendMessage(win.BM_SETCHECK, uintptr(state), 0)
}
func (b *Button) SetDontClick(state bool) {
	wParam := 0
	if state {
		wParam = 1
	}
	b.SendMessage(winapi.BM_SETDONTCLICK, uintptr(wParam), 0)
}
func (b *Button) SetImage(t int, handle uintptr) uintptr {
	return b.SendMessage(win.BM_SETIMAGE, uintptr(t), handle)
}
func (b *Button) GetImage(t int) uintptr {
	return b.SendMessage(win.BM_GETIMAGE, uintptr(t), 0)
}