文档章节

从零开始创建一个windows窗口程序

留天下
 留天下
发布于 2017/05/13 15:13
字数 1218
阅读 38
收藏 0

第一步包含头文件 #include<Windows.h>

第二步: 编写windows窗口程序主函数: int APIENTRY wWinMain(In HINSTANCE hInstance, In_opt HINSTANCE hPreInstance, In LPWSTR lCmdLine, In int nCmdShow)函数参数必须包含以上内容如同c/c++中的main()函数一样是应用程序的入口函数由系统传入参数,函数名也可返回类型也可写为 int APIENTRY WinMain,int WINAPI WinMain,int CALLBACK WinMain。

第三步: 创建并初始化一个窗口类 WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEXW); //WNDCLASSEX 的大小。可以sizeof(WNDCLASSEX)来获得准确的值。 wcex.cbClsExtra = 0; //指定紧跟在窗口类结构后的附加字节数。 wcex.cbWndExtra = 0; //指定紧跟在窗口实例的附加字节数。如果一个应用程序在资源中用CLASS伪指令注册一个对话框类时,则必须把这个成员设成DLGWINDOWEXTRA。 wcex.hbrBackground = CreateSolidBrush(RGB(255, 123, 0)); //窗口客户区背景画刷 wcex.hCursor = nullptr; //窗口光标句柄 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); //程序icon句柄 wcex.hIconSm = nullptr; //和窗口类关联的小图标。如果该值为NULL。则把hIcon中的图标转换成大小合适的小图标 wcex.hInstance = hInstance; //本模块的实例句柄。 wcex.lpfnWndProc = MyWindProc; //窗口回调函数处理窗口的消息,本质为一个函数指针 wcex.lpszClassName = L"MyWindows"; //窗口类名指定某一风格的窗口类型 wcex.lpszMenuName = nullptr; //指向菜单的指针。 wcex.style = CS_VREDRAW | CS_HREDRAW; //从这个窗口类派生的窗口具有的风格。您可以用“|”操作符来把几个风格或到一起

第四步: 注册我们初始化好的窗口类 RegisterClassExW(&wcex); //windowsAPI注册窗口类

第五步: 编写一个窗口回调函数 LRESULT CALLBACK MyWindProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 返回值和参数类型都是固定写法,前面提到窗口类有一个字段是指向一个函数指针的回调函数(wcex.lpfnWndProc = MyWindProc)。

第六步: 创建一个窗口并显示和更新 HWND hWnd = CreateWindow(L"MyWindows" //该参数必须指定为已注册的一类窗口, L"Windows", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);详细说明可到微软官网查看文档或百度 ShowWindow(hWnd, nCmdShow); //显示窗口 UpdateWindow(hWnd); //更新窗口

第七步: 获取并分发窗口消息 MSG msg; while (GetMessage(&msg,nullptr,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 这里采用循环来获取和分发消息 GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)函数原型 函数说明: 参数: lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。 hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。 wMsgFilterMin:指定被检索的最小消息值的整数。 wMsgFilterMax:指定被检索的最大消息值的整数。 返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。

BOOL TranslateMessage( CONST MSG*lpMsg );函数原型 功能:该函数将虚拟键消息转换为字符消息 参数 IpMsg:指向含有消息的MSG结构的指针,该结构里含有用函数GetMessage或PeekMessage从调用线程的消息队列里取得的消息信息。

LONG DispatchMessage(CONST MSG*lpmsg);函数原型 功能:该函数分发一个消息给窗口程序。 参数: lpmsg:指向含有消息的MSG结构的指针。 返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。

example: #include"resource.h" #include<Windows.h>

#define ID_BUTTON1 2001 #define ID_Edit 2002 HINSTANCE g_hInstance; HWND hButton1; HWND hEdit;

LRESULT CALLBACK MyWindProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { srand(GetTickCount()); switch (message) { case WM_CREATE: { hButton1 = CreateWindow(L"button", L"点我",WS_CHILD|WS_VISIBLE,300, 40,100, 40, hWnd, (HMENU)ID_BUTTON1,g_hInstance, nullptr); hEdit = CreateWindow(L"edit", L"", WS_CHILD | WS_VISIBLE, 250, 100, 300, 40, hWnd, (HMENU)ID_Edit, g_hInstance, nullptr); } break; case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: { PAINTSTRUCT ps; HDC hDc=BeginPaint(hWnd, &ps); HPEN hPen = CreatePen(1, 5, RGB(255, 0, 0)); RECT rect; rect.left = 20; rect.right = 200; rect.top = 20; rect.bottom = 400; SelectObject(hDc, hPen); HBRUSH hBrush = CreateSolidBrush(RGB(255,123, 100)); SelectObject(hDc, hBrush); Rectangle(hDc, rect.left, rect.top, rect.right, rect.bottom); DeleteObject(hPen); DeleteObject(hBrush); EndPaint(hWnd, &ps); } break; case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_BUTTON1: { HDC hDc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(rand() % 255 + 1, rand() % 255 + 1, rand() % 255 + 1)); SelectObject(hDc, hBrush); Ellipse(hDc, 300, 300, 400, 400); DeleteObject(hBrush); ReleaseDC(hWnd, hDc); } break; default: break; } } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }

int APIENTRY wWinMain(In HINSTANCE hInstance, In_opt HINSTANCE hPreInstance, In LPWSTR lCmdLine, In int nCmdShow) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEXW); wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hbrBackground = CreateSolidBrush(RGB(255, 123, 0)); wcex.hCursor = nullptr; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); wcex.hIconSm = nullptr; wcex.hInstance = hInstance; wcex.lpfnWndProc = MyWindProc; wcex.lpszClassName = L"MyWindows"; wcex.lpszMenuName = nullptr; wcex.style = CS_VREDRAW | CS_HREDRAW; RegisterClassExW(&wcex); g_hInstance = hInstance;

HWND hWnd = CreateWindow(L"MyWindows", L"Windows", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (hWnd == nullptr)
{
	return -1;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
	TranslateMessage(&msg);
	DispatchMessage(&msg);
}

return (int)msg.wParam;

}

© 著作权归作者所有

留天下
粉丝 2
博文 3
码字总数 1453
作品 0
抚州
程序员
私信 提问
从零开始手敲次世代游戏引擎(三十一)

本篇我们回归主线。首先是将我们前面两个Mac特别篇所写的代码统合进来。在这个过程当中发现几个问题: 【1】 OpenGL环境仍然是2.1的。 查阅资料发现,这是因为Apple考虑到兼容性,缺省状态下...

陈文礼
2017/11/16
0
0
5 分钟从零构建第一个 Apache Flink 应用

在本文中,我们将从零开始,教您如何构建第一个Apache Flink (以下简称Flink)应用程序。 1、开发环境准备 Flink 可以运行在 Linux, Max OS X, 或者是 Windows 上。为了开发 Flink 应用程序...

大数据之路
2013/06/25
13.2K
3
5分钟从零构建第一个 Apache Flink 应用

作者:伍翀 在本文中,我们将从零开始,教您如何构建第一个Apache Flink (以下简称Flink)应用程序。 开发环境准备 Flink 可以运行在 Linux, Max OS X, 或者是 Windows 上。为了开发 Flink ...

Ververica
05/07
0
0
CVE-2018-8120在Windows 7 x64环境下的漏洞利用分析

  背景   2018年5月15日,ESET披露了其捕获的PDF文档样本中的两枚0-day漏洞。其中CVE-2018-4990为Adobe PDF阅读器的代码执行漏洞,而CVE-2018-8120则是Windows操作系统Win32k的内核提权漏...

FreeBuf
2018/06/07
0
0
CVE-2018-8120 漏洞分析

原文地址:https://mozhe.cn/news/detail/290 详细分析漏洞描述 Microsoft Windows 7 SP1、Windows Server 2008 SP2和Windows Server 2008 R2 SP1都是美国微软(Microsoft)公司的产品。Mic...

乖巧小墨宝
2018/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部