externalwidgets.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // Copyright 2012 The Walk Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package main
  5. import (
  6. "log"
  7. )
  8. import (
  9. "github.com/lxn/walk"
  10. . "github.com/lxn/walk/declarative"
  11. "github.com/lxn/win"
  12. )
  13. const myWidgetWindowClass = "MyWidget Class"
  14. func init() {
  15. walk.MustRegisterWindowClass(myWidgetWindowClass)
  16. }
  17. func main() {
  18. var mw *walk.MainWindow
  19. if err := (MainWindow{
  20. AssignTo: &mw,
  21. Title: "Walk External Widgets Example",
  22. Size: Size{400, 300},
  23. Layout: HBox{},
  24. }).Create(); err != nil {
  25. log.Fatal(err)
  26. }
  27. for _, name := range []string{"a", "b", "c"} {
  28. if w, err := NewMyWidget(mw); err != nil {
  29. log.Fatal(err)
  30. } else {
  31. w.SetName(name)
  32. }
  33. }
  34. mpb, err := NewMyPushButton(mw)
  35. if err != nil {
  36. log.Fatal(err)
  37. }
  38. mpb.SetText("MyPushButton")
  39. mw.Run()
  40. }
  41. type MyWidget struct {
  42. walk.WidgetBase
  43. }
  44. func NewMyWidget(parent walk.Container) (*MyWidget, error) {
  45. w := new(MyWidget)
  46. if err := walk.InitWidget(
  47. w,
  48. parent,
  49. myWidgetWindowClass,
  50. win.WS_VISIBLE,
  51. 0); err != nil {
  52. return nil, err
  53. }
  54. bg, err := walk.NewSolidColorBrush(walk.RGB(0, 255, 0))
  55. if err != nil {
  56. return nil, err
  57. }
  58. w.SetBackground(bg)
  59. return w, nil
  60. }
  61. func (*MyWidget) MinSizeHint() walk.Size {
  62. return walk.Size{50, 50}
  63. }
  64. func (w *MyWidget) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr {
  65. switch msg {
  66. case win.WM_LBUTTONDOWN:
  67. log.Printf("%s: WM_LBUTTONDOWN", w.Name())
  68. }
  69. return w.WidgetBase.WndProc(hwnd, msg, wParam, lParam)
  70. }
  71. type MyPushButton struct {
  72. *walk.PushButton
  73. }
  74. func NewMyPushButton(parent walk.Container) (*MyPushButton, error) {
  75. pb, err := walk.NewPushButton(parent)
  76. if err != nil {
  77. return nil, err
  78. }
  79. mpb := &MyPushButton{pb}
  80. if err := walk.InitWrapperWindow(mpb); err != nil {
  81. return nil, err
  82. }
  83. return mpb, nil
  84. }
  85. func (mpb *MyPushButton) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr {
  86. switch msg {
  87. case win.WM_LBUTTONDOWN:
  88. log.Printf("%s: WM_LBUTTONDOWN", mpb.Text())
  89. }
  90. return mpb.PushButton.WndProc(hwnd, msg, wParam, lParam)
  91. }