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

推荐订阅源

PCI Perspectives
PCI Perspectives
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Palo Alto Networks Blog
S
Schneier on Security
Scott Helme
Scott Helme
T
Threat Research - Cisco Blogs
K
Kaspersky official blog
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
G
GRAHAM CLULEY
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
I
Intezer
D
Docker
月光博客
月光博客
L
Lohrmann on Cybersecurity
Latest news
Latest news
B
Blog
罗磊的独立博客
M
MIT News - Artificial intelligence
S
Securelist
Know Your Adversary
Know Your Adversary
Help Net Security
Help Net Security
Recorded Future
Recorded Future
S
SegmentFault 最新的问题
N
Netflix TechBlog - Medium
T
Threatpost
H
Hacker News: Front Page
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
人人都是产品经理
人人都是产品经理
F
Fortinet All Blogs
博客园 - Franky
P
Proofpoint News Feed
大猫的无限游戏
大猫的无限游戏
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tor Project blog
Google Online Security Blog
Google Online Security Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Engineering at Meta
Engineering at Meta
Webroot Blog
Webroot Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Microsoft Security Blog
Microsoft Security Blog

博客园 - 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系统的控件样式,这在下一篇里面会提到解决方法。