我的Go语言学习之旅七:创建一个GUI窗口
2024-09-30 23:19:30
在上次中,刚刚学过了 弹窗效果。这里再接着学习一下怎样创建一个窗口。
还是老路子,先上代码:
package main import (
"github.com/lxn/go-winapi"
"syscall"
"strconv"
"unsafe"
) var (
orainWndProc winapi.HWND
) const(
winWidth int32 = 500
winHeight int32 = 300
) func _TEXT(_str string) *uint16{
return syscall.StringToUTF16Ptr(_str)
} func _toString(_n int32) string{
return strconv.Itoa(int(_n))
} func WndProc(hwnd winapi.HWND,msg uint32,wparam uintptr,lparam uintptr) uintptr{
return winapi.CallWindowProc(uintptr(orainWndProc),hwnd,msg,wparam,lparam)
} func main(){
var message winapi.MSG
var hwnd winapi.HWND
var wproc uintptr
hwnd = winapi.CreateWindowEx(
winapi.WS_EX_CLIENTEDGE,
_TEXT("EDIT"),
_TEXT("Hello World"),
winapi.WS_OVERLAPPEDWINDOW,
(winapi.GetSystemMetrics(winapi.SM_CXSCREEN)-winWidth)>>1,
(winapi.GetSystemMetrics(winapi.SM_CYSCREEN)-winHeight)>>1,
winWidth,
winHeight,
0,
0,
winapi.GetModuleHandle(nil),
unsafe.Pointer(nil))
wproc = syscall.NewCallback(WndProc)
orainWndProc = winapi.HWND(winapi.SetWindowLong(hwnd,winapi.GWL_WNDPROC, int32(wproc)))
winapi.ShowWindow(hwnd,winapi.SW_SHOW)
for{
if winapi.GetMessage(&message,0,0,0) == 0{break}
winapi.TranslateMessage(&message)
winapi.DispatchMessage(&message)
}
}
看起来非常复杂,细心的话会发现事实上这些都是引用了WINDOW提供的API,咱们能够阅读WIN提供的各API生成我们所须要的界面窗口。
值得一提的是,这里你会看到 _TEXT("EDIT") 这说明创建的是一个编辑框,假设想要创建一个button则改为 _TEXT("BUTTON") 就可以。
最新文章
- SNMP与MIB
- 什么是smarty?
- apache服务器安装
- BZOJ3468 : 滑雪
- android 中 webview 怎么用 localStorage?
- C#设计模式——组合模式(Composite Pattern)
- 华为OJ—火车进站(栈,字典排序)
- 前端的一些常用DOM和事件归纳
- 源泉书签,助您管理海量收藏。www.yuanquanshuqian.com,今日更新:多标签功能已实现
- 与QString(";我是中文";)完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。
- java(17) - 增强for循环、装箱拆箱、可变参数
- Mysql查看连接端口及版本
- ORACLE行转列(行转1列,行转多列)
- 优步uber司机怎么注册不了?注册优步司机问题要点
- 看雪.TSRC 2017CTF秋季赛第三题
- MIP开发教程(二) 使用MIP-CLI工具调试MIP网页
- ThinkPHP 2053错误
- A - A Secret -扩展KMP
- [USACO12MAR] 花盆Flowerpot
- vue-amap | 基于 Vue 2.x 与高德的地图组件