lpctstr,Golang可以做界面吗?
说起界面,这是一道坎,有人或许会说,GO为什么要写界面UI呢,这本来不是GO擅长的部分,也不是GO该干的事情,这句话我就不爱听了。
举个列子,比如我们用GO语言写个服务器,这个服务器就是用作直播视频聊天的服务器,它的功能包含直播房间在线列表人员,当然GO语言设计的时候,服务器记录了在线列表的 userId、roomId、token、level、ip、chatConent等等。比如我们要监视某个房间的人员列表,看他是否用协议刷了人气,其实就是统计一个IP上有多少帐号,或者监控房间里面是否有机器人在发言,并随时封禁它,或者统计在线直播列表的人数等等,我们用命令行是能够操作上述的东西,但是这么多的动作你能记得住那么多的命令吗?
而且上述那么多的东西显示在黑色框子里面,眼睛看久了不累吗?一旦命令行用错了,承担起后果吗?
在命令行里面去选择一个用户或者房间那是一件多么痛苦的事情啊。
而且这些后台管理员又不是技术人员,很可能会出错。
因此界面是必须有的。
GO语言中选择界面是一件纠结的事情,github上面GO-UI要么项目几年没人更新了,要么简单的功能让人不多看一眼。
比如 谷歌自带gxui已经死掉了,goqt的下载一大堆的东西去配置,go-gtk配置也麻烦,而且功能也是简单。
假如在linux下,我建议还是选择后面的两个,那是没得选择的选择。
在WINODWS 目前推荐https://github.com/lxn/walk 这个东西,目前在GITHUB上最新的版本是需要GO1.8去构建的,否则百分百会出错。
下载下来看下demo
有复制粘帖、数据绑定、图片显示、webkit、绘图、listbox、托盘、tab、滑动条、拖动文件、进度条、按钮、选择框、单选框等等。功能挺全面的,可以去实验下。
先来了解下句柄,什么叫做句柄?句柄可以说是windows上集合所有打开了的界面程序上的控件ID一样,代表了唯一身份,其实底层还是指针,每次打开程序,句柄由系统随机分配命名,不存在两个句柄是一样的。句柄包含了窗口句柄和控件句柄。
walk下载下来的包这么小,而且编译出来的程序也这么小,那就肯定是调用了WINDOWS内置的一些com组件和active控件,这些东西存在于DLL中,一般位于在system32目录下或者程序运行的当前目录下,像QT5这些不是调用window内置的,因此QT编译出来的程序是找不到控件句柄的。比如QQ、YY、迅雷这些软件是找不到控件的句柄的,只能找到窗口句柄,因为这些控件是DX画出来了。
句柄是一个类似整数一样的数值。
在windows设计不同语言的交互的时候,dll文件是一条逃不过去的坑,先来看下C/C++、GO的类型不同的定义
Win32 C/C++ golang 字符对照表
WIN32类型 C/C++ 类型 GO 类型
HANDLE void * uintptr
BYTE unsigned char uint8, byte
SHORT short int16
WORD unsigned short uint16
INT int int32, int
UINT unsigned int uint32
LONG long int32
BOOL int int
DWORD unsigned long uint32
ULONG unsigned long uint32
CHAR char byte
WCHAR wchar_t uint16
LPSTR utf8/char * *byte
LPCSTR const utf8/char * *byte, syscall.StringBytePtr(), xc.UTF8PtrToSting()
LPWSTR wchar_t * *uint16
LPCWSTR const wchar_t * *uint16, syscall.StringToUTF16Ptr()
FLOAT float float32
DOUBLE double float64
LONGLONG __int64 int64
DWORD64 unsigned __int64 uint64
Create?
Create是一个可从CFrameWnd继承而来的成员函数,用于窗口的创建和设置。 Create是MFC中的一个构造函数,用于生成在屏幕上可见的窗口。 示例如下: Create(NULL,_T("Hello MFC")); 该函数将会(在已创建窗体对象的前提下)生成一个在屏幕上可以看到的窗口,窗口的标题文本为Hello MFC。 CFrameWnd::Create的原型如下: BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle = WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd* pParentWnd = NULL, LPCTSTR lpszMenuName = NULL, DWORD dwExStyle = 0 CCreateContext* pContext = NULL) Create接收的8个参数中的6个由默认值定义,如无特殊要求,那么只需要执行最少量的操作,为函数的前两个参数指定值,对剩下的6个参数接受默认值。 第一个参数lpszClassName指定了窗口基于WNDCLASS类的名称,若将其设定为NULL则会创建一个基于由主结构注册的WNDCLASS类的默认框架窗口。 lpszWindowName参数则指定将在窗口的标题栏出现的文本。 调用Create函数可以通过指定别的样式或选择组合样式来更改窗口样式,在CFrameWnd::Create文档中可以找到完整的窗口样式列表。
LPWSTR是什么类型?
1,LPWSTR是wchar_t字符串c,c++表示字符串有很多 在java里你直接用String表示吧2,LPWSTR和LPCSTR是长指针类型,其本质是一个指针,指向一个长字符串3,LPWSTR:一个32位指向Unicode字符串指针,相当于wchar_t *;指针初始化,直接赋值为NULL就可以了,如:LPWSTR lpwstr=NULL;4,L长,P指针,W宽字符,STR字符串。一个指向宽字符串的指针;可以NULL;也可以赋给它一个长字符串;LPWSTR lp = TEXT("asdfasgaf");
举例说明window对象中常用的消息框函数?
通常来说,消息框在 windows 操作系统的 winAPI 里提供有 MessageBox 函数。函数原型:int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);参数: hWnd:弹出该对话框的窗体的句柄,若没有,可以写NULL。不写NULL就是模态的,写NULL就是非模态。
lpText:消息框中显示的内容。如果使用了Unicode库,需要使用TEXT宏对字符串进行转化。 lpCaption:消息框的标题。如果使用了Unicode库,需要使用TEXT宏对字符串进行转化。 uType:使用此参数指定消息框的类型(提示、警告、错误等)、消息框中显示的按钮(确定、取消、忽略、重试等)及其他选项。可取的值有。
font函数原型?
原型是:
HFONT CreateFont(int cHeight, //字体的逻辑高度
int cWidth, //字体的逻辑宽度
int cEscapement, //指定移位向量相对X轴的偏转角度
int cOrientation, //指定字符基线相对X轴的偏转角度
int cWeight, //设置字体粗细程度
DWORD bItalic, //是否启用斜体
DWORD bUnderline, //是否启用下划线
DWORD bStrikeOut, //是否启用删除线
DWORD iCharSet, //指定字符集
DWORD iOutPrecision, //输出精度
DWORD iClipPrecision, //剪裁精度
DWORD iQuality, //输出质量
DWORD iPitchAndFamily, //字体族
LPCSTR pszFaceName //字体名
);