duilib 预开篇

曾几何时,当我看到好看的windows 软件界面时,也想亲手写出这么绚丽好看的界面。
于是我就到处寻找windows UI编程教程。在一番查找和比较下,最终选择了duilib.
主要考虑到了duilib 是开源的,可以通过源码深入了解其界面绘制原理,其次duilib编译后不大。

通过学习和使用duilib这么久后,决定记录下,同时也分享下个人的理解。
首先从大体上对duilib界面库的理解就是,使用winodws 应用编程"三板斧"构造最基本的应用程序,再者就是对于常见的消息的自处理,
以及在 WM_Paint消息的精确绘制。其实所有的windows应用程序UI库大体上都是这个套路,因为微软本身也是用的这个套路,MFC用的就是这个套路。

要使用duilib 个人觉得最好还是先对 windows 应用程序"三板斧" 操作有一个认识。所谓的”三板斧“ 其实就是一个固定的操作套路。
个人总结套路如下:
1 注册窗口类。
2 定义窗口过程函数。
3 创建窗口和消息循环。
下面分布简述以上3 个步骤。
1 注册窗口类:
在windows下要创建一个窗口,必须告诉系统你要用什么来创造窗口,窗口具有哪些属性,这个东西被称作为窗口类。
窗口类的实质其实是一个名为WNDCLASS的结构体,开发者只需填充此结构体,然后调用RegisterClass函数向系统注册。
大致操作如下

WNDCLASS wc = { 0 };
wc.style = CS_VREDRAW | CS_HREDRAW; //窗口类样式
wc.cbClsExtra = 0; //窗口类附加数据,4字节大小,根据开发者需要自己填写,不想填就可以设为0。通过GetClassLong 读取
wc.cbWndExtra = 0; //窗口附加数据,4字节大小,根据开发者需要自己填写,不想填就可以设为0。通过GetWindowLong 读取
wc.hIcon = NULL; //窗口图标的句柄
wc.lpfnWndProc = MyWindowProc; //窗口过程函数,即处理函数。DefWindowProc 是缺省处理函数
wc.hInstance = hInstance; //实例句柄 ,标识当前运行中的程序。其实就是 当前程序映射在内存中的起始虚拟地址
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); //光标句柄,用来显示在窗口中时,光标的样子
wc.hbrBackground = NULL; //背景画刷,即窗口背景绘制时用的画刷
wc.lpszMenuName = NULL; //窗口菜单名,用来创建菜单的。
wc.lpszClassName = L"test"; //窗口类名,可以认为用这个名字来表示此时填充的结构体。

2 定义窗口过程函数:
其实严格的来说应该先声明然后定义窗口过程函数,因为在注册窗口类时wc.lpfnWndProc 字段就用到了。
窗口过程函数的定义其实很简单。先看看官方的窗口过程函数,如下
LRESULT LRESULT DefWindowProc(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
只需将"DefWindowProc" 改个名字就是我们自己定义的窗口过程函数了。例如:
LRESULT LRESULT MyWindowProc(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
)
{
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
如上所示,在没有自己想要处理的操作时,只需要调用默认的DefWindowProc 处理消息就可以了。
3 创建窗口和消息循环:
以上步骤1和2其实都是为了这一步做铺垫的,步骤3完成后我们就将看到一个窗口出现在桌面上了。
调用 CreateWindow或者CreateWindowEx 函数就将创建一个窗口,例如:
::CreateWindowEx(dwExStyle, L"test", pstrName, dwStyle, x, y, cx, cy, hwndParent, hMenu, CPaintManagerUI::GetInstance(), this);(参数含义百度一下就知道了)
这里的第二个参数要说先,这里的第二个参数就是刚才步骤1的注册的窗口类的类名。此时系统会用咱们自己注册的窗口类创建窗口。
光创建了窗口,没有消息创建循环,也是看不到的窗口的。
创建消息循环很简单,例如:
MSG msg = { 0 };
while (::GetMessage(&msg, NULL, 0, 0)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
这里提一下消息循环的作用,消息循环是将当前线程中的窗口产生的消息从队列中提出来,当遇到WM_QUIT消息GetMessage返回false,退出消息循环。
这里有一点需要注意,是当前线程中的窗口的消息。重点:当前线程。也就是说其他线程创建的窗口产生的消息,当前线程是收不到的。
windows 内部的消息队列应该是和线程绑定的(这里和qt的信号槽区分接受者所在的线程是一个意思),个人感觉可能就是线程创建时开辟的。

完成以上3部将创建一个最基础的windows应用程序(窗口程序)。
这一篇并未涉及到duilib,而是作为一个duilib 的预开篇。了解此篇,将为理解duilib扫除部分障碍。
更多精彩请关注公众号,我们将持续更新。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值