文档章节

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

留天下
 留天下
发布于 2017/05/13 15:13
字数 1218
阅读 26
收藏 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
CVE-2018-8120 漏洞分析

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

乖巧小墨宝
05/23
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
06/07
0
0
Windows消息机制VC

在Windows中,用户或系统中所发生的任何活动被当作事件来处理,例如,用户按下了鼠标按钮,就产生一鼠标事件。对于所发生的每一个事件,Windows将其转换成消息的形式放在一个称为消息队列的内...

长平狐
2013/01/06
729
0
VBS学习--创建桌面快捷方式

Icons这一可选段定义所有创建在开始菜单和或其它位置 (比如桌面) 的快捷方式。一个例子如下: [setup] ;全局设置,本段必须 AppName=Test AppVerName=TEST DefaultDirName="E:TEST" AppVers...

长征2号
2017/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
1
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
6
0
在Ubuntu安装和配置Sphinx

Ubuntu系统默认是配置有sphinx的,先检查一下,别多此一举。。。。。 在开始本指南之前,您需要: 一个Ubuntu 16.04服务器。 sudo的一个非root用户,您可以通过以下设置本教程 。 安装在服务...

阿锋zxf
今天
1
0
Qt编写输入法V2018超级终结版

对于qt嵌入式linux开发人员来说,输入法一直是个鸡肋问题,要么不支持实体键盘同步,要么不能汉字输入,要么不支持网页输入等,这几年通过陆续接触大量的各种输入法应用场景客户,得到真实需...

飞扬青云
今天
2
0
TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部