文档章节

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

留天下
 留天下
发布于 2017/05/13 15:13
字数 1218
阅读 25
收藏 0
点赞 0
评论 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

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

OpenGL学习系列第二篇

在这个教程里,我们一起来玩第一个OpenGL程序.它将显示一个空的OpenGL窗口,可以在窗口和全屏模式下切换,按ESC退出.它是我们以后应用程序的框架. 在CodeBlock里创建一个新的GLUT Win32程序(不...

东辉在线 ⋅ 2015/04/17 ⋅ 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

Windows消息机制VC

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

长平狐 ⋅ 2013/01/06 ⋅ 0

VBS学习--创建桌面快捷方式

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

长征2号 ⋅ 2017/08/19 ⋅ 0

为了分析WebRTC, 重学Windows开发

N多年没有写过 Window 程序了。为了研究 WebRTC 源码,这两天重新学习一下。还记得上大学的时候看过 《Windows95 程式设计》台湾版,对那本书印象极为深刻。一是当时国内确实没有一本写的那么...

音视频直播技术专家 ⋅ 2017/10/26 ⋅ 0

Windows Azure入门教学系列 (一): 创建第一个WebRole程序

公告 :本博客为微软云计算中文博客 的镜像博客。 部分文章因为博客兼容性问题 ,会影响阅读体验 。如遇此情况,请访问 原博客 。 这是一系列 Windows Azure入门教学文章的第一篇。 在第一篇...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍&第一个DirectX 11 Demo的创建

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7688515 作者:毛星云 邮箱: happylifemxy@163.com 这节笔记主要讨论DirectX 11现有...

长平狐 ⋅ 2012/11/12 ⋅ 0

创建接收消息的windows窗口

我觉得应该花点时间熟悉一下windows编程了,不然项目的代码没法看啊。今天在家,实现了一个简单的接收消息的windows窗口,可以接收其他进程发送过来的消息。 《windows程序设计》开头就讲了一...

7分04秒 ⋅ 2014/08/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部