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);
    }
}

        完成了消息循环之后,我们最终的代码如下(这里面对窗口注册的程序进行了封装,但是过程是一致的):

#include
HINSTANCE 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;
	wce.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润色让你的文字更专业