Golang Windows GUI Bindings Like Delphi VCL
Windows的GUI界面Go语言封装,目标是实现一个类似Delphi VCL版本效果的界面库
type GForm1 struct {
controls.GForm
Button1 *controls.GButton
Edit1 *controls.GEdit
}
func NewForm1(app *controls.WApplication)*GForm1{
frm := new(GForm1)
frm.SubInit()
frm.Button1 = controls.NewButton(frm)
frm.Button1.SetWidth(80)
frm.Button1.SetHeight(30)
frm.Button1.SetLeft(frm.Width() - 90)
frm.Button1.SetTop(frm.Height() - 80)
frm.Button1.SetCaption("确定关闭")
frm.Edit1 = controls.NewEdit(frm)
frm.OnClose = func(sender interface{},closeAction *int8) {
*closeAction = controls.CAFree
}
frm.Button1.OnClick = func(sender interface{}) {
WinApi.MessageBox(frm.GetWindowHandle(),"sadf","Asdf",64)
frm.SetModalResult(controls.MrOK)
}
return frm
}
func main() {
app := new(controls.WApplication)
app.ShowMainForm = true
m := app.CreateForm()
m.SetLeft(200)
m.SetTop(50)
m.SetCaption("测试窗体")
e := controls.NewEdit(m)
e.SetName("Edit1")
e.SetLeft(10)
e.SetWidth(100)
e.SetHeight(20)
e.SetCaption("测试")
b := controls.NewButton(m)
b.SetDefault(true)
b.SetLeft(120)
b.SetCaption("创建窗体")
b.OnClick = func(sender interface{}) {
tmpm := NewForm1(app)
tmpm.SetCaption(e.GetText())
if tmpm.ShowModal() == controls.MrOK{
WinApi.MessageBox(tmpm.GetWindowHandle(),"程序确定退出","消息",64)
}
}
b1 := controls.NewButton(m)
b1.SetCaption("关闭")
b1.SetLeft(100)
b1.SetTop(40)
b1.OnClick = func(sender interface{}) {
b.SetVisible(!b.Visible())
b.SetCaption("测试")
}
app.Run()
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
</assembly>
Then either compile the manifest using the rsrc tool, like this:
go get github.com/akavel/rsrc
rsrc -manifest test.manifest -o rsrc.syso
or rename the test.manifest
file to test.exe.manifest
and distribute it with the application instead.
使用Go Build 建立文件,会将这个manifest资源包含进去,以使用系统皮肤
b1.Font.BeginUpdate()
b1.Font.SetSize(10)
b1.Font.Underline = 1
b1.Font.EndUpdate()
菜单使用方法
//菜单
pop := NVisbleControls.NewPopupMenu(m)
tmpitem := pop.Items().AddItem("测试1")
citem := tmpitem.AddItem("子测试1")
citem.OnClick = func(sender interface{}) {
WinApi.MessageBox(m.GetWindowHandle(),"菜单测试"+sender.(*NVisbleControls.GMenuItem).Caption(),"消息",64)
}
citem = pop.Items().AddItem("测试2")
citem.OnClick = func(sender interface{}) {
WinApi.MessageBox(m.GetWindowHandle(),"菜单测试"+sender.(*NVisbleControls.GMenuItem).Caption(),"消息",64)
}
m.PopupMenu = pop
目前整体组件框架已经具备雏形,要增加其他组件库按照扩展的Button和Edit以及Label增加则可,下一步做完托盘就暂时放一段落
//菜单
pop := NVisbleControls.NewPopupMenu(m)
tmpitem := pop.Items().AddItem("测试1")
citem := tmpitem.AddItem("子测试1")
citem.OnClick = func(sender interface{}) {
WinApi.MessageBox(m.GetWindowHandle(),"菜单测试"+sender.(*NVisbleControls.GMenuItem).Caption(),"消息",64)
}
citem = pop.Items().AddItem("测试2")
citem.OnClick = func(sender interface{}) {
WinApi.MessageBox(m.GetWindowHandle(),"菜单测试"+sender.(*NVisbleControls.GMenuItem).Caption(),"消息",64)
}
//托盘图标,结合弹出菜单
icon := NVisbleControls.NewTrayIcon(m)
icon.SetIcon(app.AppIcon()) //设置托盘图标
//icon.SetIcon(WinApi.LoadIcon(controls.Hinstance,uintptr(5)))
icon.SetVisible(true)
icon.PopupMenu = pop //设置托盘的右键弹出菜单
icon.OnDblClick = func(sender interface{}) {
if !m.Visible(){
m.Show()
}else{
m.SetVisible(false)
}
}
reg := NVisbleControls.NewRegistry(0)
reg.SetRootKey(WinApi.HKEY_LOCAL_MACHINE)
if reg.OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",false){
if reg.ValueExists("SynTPEnh"){
WinApi.MessageBox(m.GetWindowHandle(),"SynTPEnh自动启动: "+reg.ReadString("SynTPEnh"),"消息",64)
}
WinApi.MessageBox(m.GetWindowHandle(),"打开注册表测试"+sender.(*NVisbleControls.GMenuItem).Caption(),"消息",6)
}
reg.Free()