lxn / walk

A Windows GUI toolkit for the Go Programming Language
Other
6.78k stars 885 forks source link

examples->externalwidgets->error #730

Closed SwankyTigerYY closed 3 years ago

SwankyTigerYY commented 3 years ago
// Copyright 2012 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
    "log"
)

import (
    "github.com/lxn/walk"
    . "github.com/lxn/walk/declarative"
    "github.com/lxn/win"
)

const myWidgetWindowClass = "MyWidget Class"

func init() {
    walk.MustRegisterWindowClass(myWidgetWindowClass)
}

func main() {
    var mw *walk.MainWindow

    if err := (MainWindow{
        AssignTo: &mw,
        Title:    "Walk External Widgets Example",
        Size:     Size{400, 300},
        Layout:   HBox{},
    }).Create(); err != nil {
        log.Fatal(err)
    }

    for _, name := range []string{"a", "b", "c"} {
        if w, err := NewMyWidget(mw); err != nil {
            log.Fatal(err)
        } else {
            w.SetName(name)
        }
    }

    mpb, err := NewMyPushButton(mw)
    if err != nil {
        log.Fatal(err)
    }
    mpb.SetText("MyPushButton")

    mw.Run()
}

type MyWidget struct {
    walk.WidgetBase
}

func NewMyWidget(parent walk.Container) (*MyWidget, error) {
    w := new(MyWidget)

    if err := walk.InitWidget(
        w,
        parent,
        myWidgetWindowClass,
        win.WS_VISIBLE,
        0); err != nil {

        return nil, err
    }

    bg, err := walk.NewSolidColorBrush(walk.RGB(0, 255, 0))
    if err != nil {
        return nil, err
    }
    w.SetBackground(bg)

    return w, nil
}

func (*MyWidget) MinSizeHint() walk.Size {
    return walk.Size{50, 50}
}

func (w *MyWidget) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr {
    switch msg {
    case win.WM_LBUTTONDOWN:
        log.Printf("%s: WM_LBUTTONDOWN", w.Name())
    }

    return w.WidgetBase.WndProc(hwnd, msg, wParam, lParam)
}

type MyPushButton struct {
    *walk.PushButton
}

func NewMyPushButton(parent walk.Container) (*MyPushButton, error) {
    pb, err := walk.NewPushButton(parent)
    if err != nil {
        return nil, err
    }

    mpb := &MyPushButton{pb}

    if err := walk.InitWrapperWindow(mpb); err != nil {
        return nil, err
    }

    return mpb, nil
}

func (mpb *MyPushButton) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr {
    switch msg {
    case win.WM_LBUTTONDOWN:
        log.Printf("%s: WM_LBUTTONDOWN", mpb.Text())
    }

    return mpb.PushButton.WndProc(hwnd, msg, wParam, lParam)
}

error

D:\3-go-project\test>go build
# test
.\main.go:59:27: cannot use w (type *MyWidget) as type walk.Widget in argument to walk.InitWidget:
        *MyWidget does not implement walk.Widget (missing CreateLayoutItem method)
SwankyTigerYY commented 3 years ago

It's a version problem