github.com/secoba/wails/v2@v2.6.4/internal/frontend/desktop/windows/winc/combobox.go (about)

     1  //go:build windows
     2  
     3  /*
     4   * Copyright (C) 2019 The Winc Authors. All Rights Reserved.
     5   */
     6  
     7  package winc
     8  
     9  import (
    10  	"syscall"
    11  	"unsafe"
    12  
    13  	"github.com/secoba/wails/v2/internal/frontend/desktop/windows/winc/w32"
    14  )
    15  
    16  type ComboBox struct {
    17  	ControlBase
    18  	onSelectedChange EventManager
    19  }
    20  
    21  func NewComboBox(parent Controller) *ComboBox {
    22  	cb := new(ComboBox)
    23  
    24  	cb.InitControl("COMBOBOX", parent, 0, w32.WS_CHILD|w32.WS_VISIBLE|w32.WS_TABSTOP|w32.WS_VSCROLL|w32.CBS_DROPDOWNLIST)
    25  	RegMsgHandler(cb)
    26  
    27  	cb.SetFont(DefaultFont)
    28  	cb.SetSize(200, 400)
    29  	return cb
    30  }
    31  
    32  func (cb *ComboBox) DeleteAllItems() bool {
    33  	return w32.SendMessage(cb.hwnd, w32.CB_RESETCONTENT, 0, 0) == w32.TRUE
    34  }
    35  
    36  func (cb *ComboBox) InsertItem(index int, str string) bool {
    37  	lp := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str)))
    38  	return w32.SendMessage(cb.hwnd, w32.CB_INSERTSTRING, uintptr(index), lp) != w32.CB_ERR
    39  }
    40  
    41  func (cb *ComboBox) DeleteItem(index int) bool {
    42  	return w32.SendMessage(cb.hwnd, w32.CB_DELETESTRING, uintptr(index), 0) != w32.CB_ERR
    43  }
    44  
    45  func (cb *ComboBox) SelectedItem() int {
    46  	return int(int32(w32.SendMessage(cb.hwnd, w32.CB_GETCURSEL, 0, 0)))
    47  }
    48  
    49  func (cb *ComboBox) SetSelectedItem(value int) bool {
    50  	return int(int32(w32.SendMessage(cb.hwnd, w32.CB_SETCURSEL, uintptr(value), 0))) == value
    51  }
    52  
    53  func (cb *ComboBox) OnSelectedChange() *EventManager {
    54  	return &cb.onSelectedChange
    55  }
    56  
    57  // Message processer
    58  func (cb *ComboBox) WndProc(msg uint32, wparam, lparam uintptr) uintptr {
    59  	switch msg {
    60  	case w32.WM_COMMAND:
    61  		code := w32.HIWORD(uint32(wparam))
    62  
    63  		switch code {
    64  		case w32.CBN_SELCHANGE:
    65  			cb.onSelectedChange.Fire(NewEvent(cb, nil))
    66  		}
    67  	}
    68  	return w32.DefWindowProc(cb.hwnd, msg, wparam, lparam)
    69  	//return cb.W32Control.WndProc(msg, wparam, lparam)
    70  }