- 浏览: 228448 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
昨天看WinMain函数的修饰符WINAPI,看得眩晕,今天专注于WinMain函数的过程也不轻松。为了弄明白一个窗口从创建到销毁的过程,也是大费周章。不过还好,能够看到自己建造的第一个最原始的窗口,总算有了点满足感。
创建一个窗口涉及了几个概念:HWND、WNDCLASS(WNDCLASSEX)、RegisterClass(RegisterClassEx)和CreateWindow(CreateWindowEx)。HWND就是Window Handle,它的实质就是一个指针,指向被创建的窗口对象;WNDCLASS(WNDCLASSEX)本身是一个结构体,代表着窗口对象,里面包含了与窗口对象紧密相关的属性;RegisterClass(RegisterClassEx)是用以注册窗口对象的函数;CreateWindow(CreateWindowEx)则是用以创建窗口对象,并且返回一个HWND。其中括号的内容是一一对应,就是说如果定义了WNCLASSEX,就必须用RegisterClassEx去注册,用CreateWindowEx去创建WNDCLASSEX定义的窗口对象。
创建一个看得见摸得着的窗口,主要有以下四步:
1、利用WNDCLASS(WNDCLASSEX)定义窗口对象;
2、调用RegisterClass(RegisterClassEx)函数注册窗口对象;
3、调用CreateWindow(CreateWindowEx)方法创建已经定义并且注册的窗口对象;
4、定义负责处理消息队列的Window Procedure。
以下为一个很简单的例子:
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam, LPARAM lparam);
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow)
{
WNDCLASSEX winclass = {0};
HWND hwnd;
MSG msg;
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.hInstance = hinstance;
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszClassName = "WinInit";
RegisterClassEx(&winclass);
hwnd = CreateWindowEx(NULL, "WinInit", "First Window",
WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0,
200, 200, NULL, NULL, hinstance, NULL);
for(;;)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(msg.wParam);
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam, LPARAM lparam)
{
return DefWindowProc(hwnd, msg, wparam, lparam);
}
针对以上的例子,再做一些说明。WNDCLASSEX是一个结构体,具体定义如下:
int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;
HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;
LPCTSTR lpszMenuName;LPCTSTR lpszClassName;HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
从MSDN上的WNDCLASSEX的Reference可以找到每个属性的具体含义,这里就不赘述了。在所有属性中,有三个属性要注意的,一个就是cbSize,一个是lpfnWndProc,另外一个是lpszClassName。cbSize是指WNDCLASSEX结构体本身的大小,这个属性就象提示信息一样,当一个指向该结构体本身的指针被传递至一个函数的时候,函数可以检查这个字段以获得该结构体的大小,我们使用sizeof(WNDCLASSEX)的返回值来设定该属性;lpfnWndProc则是处理该WNDCLASS的window procedure指针,例子中就是回调函数WindowProc的指针了。一般的,window procedure就是一个处理发送至某个窗口的消息的函数;lpszClassName则是一个维系着RegisterClassEx和CreateWindowEx的桥梁。当RegisterClassEx函数去注册一个WNDCLASSEX的时候,会将WNDCLASSEX中的lpszClassName进行注册。而后CreateWindowEx函数创建窗口对象的时候也是通过这个lpszClassName跟已经定义好的WNDCLASSEX相关联。
RegisterClassEx函数相对就比较简单,就只有一个参数:WNDCLASSEX的地址;CreateWindowEx函数的具体定义如下:
int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,
HINSTANCE hInstance,LPVOID lpParam);
在MSDN上的CreateWindowEx的Reference也能找到你想要的所有信息。在这里,要注意的就是lpClasName跟前面的lpszClassName是对应的,也就是例子中的"WinInit"。在回调函数WinProc中,我们调用了DefWindowProc方法。这个方法会调用默认的window procedure去处理发送至窗口的每一条WinProc函数没有处理的消息,在例子中,是将所有的消息处理都交给了DefWindowProc。好了,将这段代码在VC++上编译并且运行就可以看到一个窗口显示在屏幕上了。
由于昨天一位大侠指出我的示例代码中,用了new分配内存,却没有使用delete去释放,着实让我脸红了好久。这次,我特别注意的review了一下自己写的代码,咦,怎么只有窗体创建的代码,却没有销毁窗体并且释放占用的内存的代码呢?难道,当我点击了窗口上小交叉(关闭)按钮,系统会自动完成这样的工作?我想这应该是不可能的。于是,我将这段程序反复运行了几次,关了窗口再运行,然后通过任务管理器去查看,果然发现了几个相同的进程。
经过查阅资料以及自己的试验,找到了问题的原因。原来是因为点击关闭按钮,系统想窗体的线程队列发送了WM_CLOSE消息,而DefWindowProc接收到WM_CLOSE消息之后,确实是调用了DestroyWindow API以销毁窗体并释放窗体所占用的资源,并向窗体的线程队列发送WM_DESTROY消息。由此就可以看出窗体被销毁了,但是系统为窗体创建的线程队列仍然是存在的,WinMain函数的无限循环仍然会继续。而DefWindowProc函数并不会去处理WM_DESTROY消息,因此我们就需要自己去写处理该消息的代码了。只要将回调函数WindowProc中增加处理WM_DESTROY的代码,利用PostQuitMessage函数向消息队列中发送WM_QUIT即可。
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1268重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1144对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 1051在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1336所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1233在写完了此Vector非彼Vector这篇随笔 ... -
我该怎样shuffle呢
2004-08-10 01:47 1205在STL的Algorithm中有着这样的一种算 ... -
WebWork初体验
2004-08-11 17:43 1298在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1142昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 1051昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1535由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1241今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 1040为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1131昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 921使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 1040这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 1007今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 974在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1526昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1585很久没有用 ... -
两天四疑问
2004-09-03 10:56 10019月份的前两天,我仍然做着网站开发的工作。在开 ...
相关推荐
**第一步:填写“申请表”** 为了创建一个窗口,我们需要首先定义一个窗口类。在Win32 SDK中,窗口类的信息通常存储在一个名为`WNDCLASSEX`的结构体中。 1. **定义结构体**:`WNDCLASSEX`是一个包含了12个成员变量...
在这个项目中,我们关注的是一个特别的组件——一个基于Windows SDK的截图静态链接库。 静态链接库(Static Link Library)是编程中的一种资源,它包含了可重用代码,这些代码在编译时会被整合到最终的可执行文件中...
在IT领域,C++ MFC(Microsoft Foundation Classes)是一个基于Windows平台的应用程序开发框架,它为开发者提供了构建桌面应用程序的强大工具。MFC SDK(Software Development Kit)是微软提供的开发库,包含了开发...
5. **Windows编程基础**:对于初学者,电子书中会介绍如何设置开发环境,创建第一个Windows程序,以及基本的编程概念,如事件处理和线程管理。 6. **调试和测试工具**:Windows SDK还包括一系列的调试和测试工具,...
总之,这个基于Qt和海康SDK的监控demo是一个全面的实践项目,涵盖了从基础的GUI设计到复杂的音视频处理和设备控制等多个方面的技能,对于提升C++和音视频开发能力非常有帮助。对于想要开发类似应用的人来说,这是一...
"这是我的第一个窗口", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, 0, 400, 400, NULL, NULL, hinstance, NULL); if (!hWnd) return 0; ShowWindow(hWnd, ncmdshow); // 显示窗口 return 0; ...
3. **窗口类和窗口实例**: 创建Windows应用程序的第一步是定义窗口类,包括窗口样式、回调函数等。然后创建窗口实例,这个过程涉及CreateWindowEx函数。 4. **消息循环和消息处理**: 消息循环是Windows程序的基石,...
在这个案例中,俄罗斯方块SDK提供了一套用于开发基于C语言的俄罗斯方块游戏的工具和资源,使得开发者可以更方便地实现游戏逻辑,而无需从头构建底层架构。 纯C语言的实现意味着该SDK具有高度的跨平台潜力,因为...
SDK画图程序是一种基于C语言开发的图形用户界面应用程序,它允许开发者利用软件开发工具包(SDK)来创建和编辑图形。在这个特定的程序中,SDK主要被用来提供底层的图形绘制功能,使得程序员可以控制像素级别的细节,...
然后选择S32DS开发工具,接着在页面中选择第一个平台分区,并在下拉菜单中选择V3.4版本进行下载。文档还提供了下载编译器激活码的链接以及百度网盘的下载链接和提取码。在安装过程中,用户需要根据指引下载并安装IDE...
总结,开发一个基于Windows SDK的MP3播放器涵盖了音频编码解码、音量控制、播放进度管理、用户界面设计等多个方面,需要深入理解和应用Windows API及相关多媒体技术。在实际开发过程中,不断学习和优化,确保代码的...
构建一个基于Windows SDK API的IDE,首先需要考虑的基本组件包括: 1. **编辑器**:这是IDE的核心部分,负责代码的输入和编辑。可以使用RichEdit控件或者自定义文本编辑器实现,同时需要支持语法高亮、自动完成等...
1. **API接口**:旺旺SDK提供了一系列的API接口,这些接口允许开发者调用旺旺的功能,如发送文本、图片、文件消息,以及接收消息、管理会话、获取用户信息等。通过这些API,开发者可以自定义旺旺在应用中的展现形式...
对于开发者来说,掌握如何在Windows环境下安装Android SDK(Software Development Kit)是进行Android应用开发的第一步。本文将详细介绍如何在Windows系统下安装配置Android SDK及相关开发工具。 #### 二、准备工作...
"这是我的第一个窗口", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口样式 0, 0, // 初始位置 400, 400, // 初始大小 NULL, // 父窗口句柄 NULL, // 菜单句柄 hinstance, // 应用程序实例句柄 NULL); // 额外...
在标题中提到的"nwjs-0.35.1版本 sdk",是指nw.js的一个特定发行版本,0.35.1。SDK(Software Development Kit)通常包含了开发者需要的所有工具和资源,如头文件、库、示例代码和文档,以便于进行应用程序开发。...
通过这个电子书,你可以逐步学习如何设置开发环境,创建第一个Windows应用程序,理解消息循环和消息处理,以及如何利用Win32 API实现更复杂的功能。 总的来说,WinSDK编程需要对操作系统底层工作原理有基本的理解,...
创建非模态对话框的第一步是创建一个新的项目。在Visual Studio中,选择“文件”>“新建”>“项目”,然后选择“Visual C#”或“Visual Basic”下的“Windows Desktop”类别,找到“WinForms应用程序”模板,为你的...