Win32 SDK基础(四)之如何从零开始创建windows窗口的第二步
发布时间 - 2017-06-06 00:00:00 点击率:次3.5 显示窗口。
创建了窗口之后,如果要想运行时能够看见窗口,我们还需要显式的设置显示窗口:
ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd);
ShowWindow和UpdateWindow都是系统的API,前者是设置窗口的显示属性。后者重新更新窗口属性,只有更新之后,属性才会生效。经过了上述步骤,我们的WinMain函数已经变成了如下:
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
//注册窗口类
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof(wce);
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = hInstance;
wce.lpfnWndProc = wndProc;
wce.lpszClassName = “Main”;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if (!nAtom )
{
MessageBox(NULL, "注册失败", "Infor", MB_OK);
return 0;
}
//创建窗口
HWND hWnd = CreateWindowEx(0, “Main”, “Window”, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);
//显示窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}3.6 开启消息循环
所谓的消息循环,其实就是一个死循环,不断的通过GetMessage捕捉着窗口的消息,再通过TranslateMessage将虚拟键消息转换为字符消息,然后通过DispatchMessage将消息分派给我们的窗口程序进行处理(所谓处理就是调用我们定义的窗口处理函数WinProc):
void Message()
{
MSG nMsg = { 0 };
while (GetMessage(&nMsg, NULL, 0, 0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}完成了消息循环之后,我们最终的代码如下(这里面对窗口注册的程序进行了封装,但是过程是一致的):
#includeHINSTANCE g_hInstance = 0; //窗口处理函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0);//可以使GetMessage返回0 break; default: break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } //注册窗口类 BOOL Register(LPSTR lpClassName, WNDPROC wndProc) { WNDCLASSEX wce = { 0 }; wce.cbSize = sizeof(wce); wce.cbClsExtra = 0; w ce.cbWndExtra = 0; wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wce.hCursor = NULL; wce.hIcon = NULL; wce.hIconSm = NULL; wce.hInstance = g_hInstance; wce.lpfnWndProc = wndProc; wce.lpszClassName = lpClassName; wce.lpszMenuName = NULL; wce.style = CS_HREDRAW | CS_VREDRAW; ATOM nAtom = RegisterClassEx(&wce); if (nAtom == 0) return FALSE; return true; } //创建主窗口 HWND CreateMain(LPSTR lpClassName, LPSTR lpWndName) { HWND hWnd = CreateWindowEx(0, lpClassName, lpWndName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL); return hWnd; } //显示窗口 void Display(HWND hWnd) { ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); } //消息循环 void Message() { MSG nMsg = { 0 }; while (GetMessage(&nMsg, NULL, 0, 0)) { TranslateMessage(&nMsg); DispatchMessage(&nMsg); } } int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { // TODO: Place code here. g_hInstance = hInstance; BOOL nRet = Register("Main", WndProc); if (!nRet) { MessageBox(NULL, "注册失败", "Infor", MB_OK); return 0; } HWND hWnd = CreateMain("Main", "window"); Display(hWnd); Message(); return 0; }
就此我们完成了窗口处理的整个过程,运行程序,成功创建并显示的一个Windows窗口:
# windows
# 都是
# 完成了
# 才会
# 给我们
# 要想
# 还需要
# 转换为
# 进行了
# 变成了
# 经过了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何自定义错误页面(404, 500)?(代码示例)
如何快速生成凡客建站的专业级图册?
如何在万网利用已有域名快速建站?
微信小程序 闭包写法详细介绍
Laravel如何升级到最新版本?(升级指南和步骤)
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
python中快速进行多个字符替换的方法小结
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
网站优化排名时,需要考虑哪些问题呢?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel如何生成URL和重定向?(路由助手函数)
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
高防服务器如何保障网站安全无虞?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Laravel如何使用Service Container和依赖注入?(代码示例)
无锡营销型网站制作公司,无锡网选车牌流程?
PHP 500报错的快速解决方法
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel如何实现API速率限制?(Rate Limiting教程)
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何用花生壳三步快速搭建专属网站?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何在阿里云虚拟主机上快速搭建个人网站?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何在IIS管理器中快速创建并配置网站?
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Laravel如何集成Inertia.js与Vue/React?(安装配置)
如何在阿里云服务器自主搭建网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Android中AutoCompleteTextView自动提示
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Linux系统运维自动化项目教程_Ansible批量管理实战
Laravel如何实现用户密码重置功能?(完整流程代码)
公司门户网站制作流程,华为官网怎么做?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
音乐网站服务器如何优化API响应速度?
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
如何用搬瓦工VPS快速搭建个人网站?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel怎么实现模型属性的自动加密
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
简历没回改:利用AI润色让你的文字更专业


ce.cbWndExtra = 0;
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInstance;
wce.lpfnWndProc = wndProc;
wce.lpszClassName = lpClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW | CS_VREDRAW;
ATOM nAtom = RegisterClassEx(&wce);
if (nAtom == 0)
return FALSE;
return true;
}
//创建主窗口
HWND CreateMain(LPSTR lpClassName, LPSTR lpWndName)
{
HWND hWnd = CreateWindowEx(0, lpClassName, lpWndName,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);
return hWnd;
}
//显示窗口
void Display(HWND hWnd)
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
//消息循环
void Message()
{
MSG nMsg = { 0 };
while (GetMessage(&nMsg, NULL, 0, 0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
// TODO: Place code here.
g_hInstance = hInstance;
BOOL nRet = Register("Main", WndProc);
if (!nRet)
{
MessageBox(NULL, "注册失败", "Infor", MB_OK);
return 0;
}
HWND hWnd = CreateMain("Main", "window");
Display(hWnd);
Message();
return 0;
}