惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Latest news
Latest news
Cisco Talos Blog
Cisco Talos Blog
Simon Willison's Weblog
Simon Willison's Weblog
N
News and Events Feed by Topic
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Security Affairs
PCI Perspectives
PCI Perspectives
I
Intezer
V2EX - 技术
V2EX - 技术
S
Securelist
O
OpenAI News
S
Secure Thoughts
aimingoo的专栏
aimingoo的专栏
V
Visual Studio Blog
P
Proofpoint News Feed
月光博客
月光博客
博客园 - 叶小钗
Hacker News: Ask HN
Hacker News: Ask HN
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google DeepMind News
Google DeepMind News
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hackread – Cybersecurity News, Data Breaches, AI and More
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Schneier on Security
Schneier on Security
N
News | PayPal Newsroom
S
Schneier on Security
T
Threatpost
G
Google Developers Blog
P
Palo Alto Networks Blog
P
Privacy & Cybersecurity Law Blog
Microsoft Azure Blog
Microsoft Azure Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cyber Attacks, Cyber Crime and Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
博客园 - 三生石上(FineUI控件)
Help Net Security
Help Net Security
Google Online Security Blog
Google Online Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
D
DataBreaches.Net
Cyberwarzone
Cyberwarzone
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Webroot Blog
Webroot Blog
K
Kaspersky official blog
Security Latest
Security Latest
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - AllenDang

创业心得 - 从确定投资意向到开始发工资还有多远? 什么样的人适合创业公司? NoSql数据库使用半年后在设计上面的一些心得 Go语言实战 - 使用SendCloud群发邮件 用Go语言做产品半年的一些感觉 我是怎么拿到投资的 Go语言实战 - 我需要站内搜索 Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护 Go语言实战 - revel框架教程之缓存和Job Go语言实战 - 网站性能优化第一弹“七牛云存储” 坚持是什么? - 作为创业者在与投资人见面之后想到的 Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo Go语言实战 - revel框架教程之权限控制 Go语言实战 - revel框架教程之用户注册 Go语言实战 - 创业进行时之创业伊始 我为什么喜欢Go语言 用Go写Windows桌面应用 - 使用窗体设计器 使用CGO封装Windows API 用Go写Windows桌面应用 - 使用资源文件
用Go写Windows桌面应用 - 使用Form
AllenDang · 2012-02-15 · via 博客园 - AllenDang

几个月以前看到了Go的消息,读完入门PPT之后,便有种感觉,这就是我想象中的语言。语法简单,写起来手感极好,设计则处处透着简洁。

随后便开始用它代替python写一些常用小工具,堪称得心应手。几个月以后,日益离不开了,再用别的语言时总觉得缺了点什么。

我很喜欢写桌面应用,之前一直用C++,但实在不喜欢它那复杂的设计,而且也没有找到合心意的UI库。此时心里冒出了一个念头,用Go写一套UI库。很大胆,很冒险,甚至很二。很多人都提醒到,UI库这种庞大的东西靠一个人是不可能完成的。我也经常在挣扎,但还是没忍住这股冲动,我动手了!

从零开始封装win32 api,工作量挺大的,但好在已经有很多前辈已经在C++里面做过同样的事情了,所以倒也还顺利。

好了,话不多说,就先看看代码吧!是骡子是马拉出来溜溜。

第一步,先安装gform,也就是我封装的UI库。确认用的是最新的Weekly版本的Go,然后打开命令行运行下面两行。

go get github.com/AllenDang/gform

go install github.com/AllenDang/gform

搞定,因为go命令会自动检测库依赖,所以也会顺带把w32,我封装的win32 api库,安装好。

好了,现在可以创建一个空窗体。

package main

import (
    "github.com/AllenDang/gform"
)

func main() {
    gform.Init()

    mainform := gform.NewForm(nil)
    mainform.SetSize(300, 200)
    mainform.Center()
    mainform.Show()

    gform.RunMainLoop()
}

用下面命令行编译

go tool 8g app.go

go tool 8l –s –Hwindowsgui –o app.exe app.8

运行app.exe,窗体出来了,应用程序体积706kb,没有任何依赖的dll,用upx压缩后219kb,很好,我满意了。

现在来添加一个按钮吧,点击它之后能弹出一个“Hello world”的消息框。

先添加对"w32”这个包的应用

import (
    "github.com/AllenDang/gform"
    "github.com/AllenDang/w32"
)

然后添加按钮

btnOk := gform.NewPushButton(mainform)
btnOk.SetCaption("点我")
btnOk.SetPos(100, 10)
btnOk.OnLBUp().Attach(btnOK_OnLBUp)

添加事件处理函数

func btnOK_OnLBUp(arg *gform.EventArg) {
    gform.MsgBox(arg.Sender(), "消息", "Hello world", w32.MB_OK|w32.MB_ICONINFORMATION)
}

搞定!修改后的完整代码如下

package main

import (
    "github.com/AllenDang/gform"
    "github.com/AllenDang/w32"
)

func btnOK_OnLBUp(arg *gform.EventArg) {
    gform.MsgBox(arg.Sender(), "消息", "Hello world", w32.MB_OK|w32.MB_ICONINFORMATION)
}

func main() {
    gform.Init()

    mainform := gform.NewForm(nil)
    mainform.SetSize(300, 200)
    mainform.Center()

    btnOk := gform.NewPushButton(mainform)
    btnOk.SetCaption("点我")
    btnOk.SetPos(100, 10)
    btnOk.OnLBUp().Attach(btnOK_OnLBUp)

    mainform.Show()

    gform.RunMainLoop()
}

运行,怎么样?

image

够简单吗?恩,我承认,不简单,纯编码的方式创建UI很折磨人,特别是控件定位。别着急,gform还支持另外一种方式创建UI,使用资源文件,其实熟悉win32 gui体系的朋友应该很熟悉这种方式。

另外,大家也可能注意到按钮的样式不正常,并没有应用windows系统的控件样式,这在下一篇里面会提到解决方法。