Windows应用程序的基本框架浅析(01)

来源:互联网 发布:中级软件开发工程师 编辑:程序博客网 时间:2024/05/16 03:23

关于Windows应用程序的基本框架,先用一个示例来说明

我们创建一个控制台应用程序(Console Application),

然后在main函数中创建一个自定义的win32窗口并显示

完整代码如下,有详细的注释

#include <Windows.h>#include <iostream>#include <string>using namespace std;// 创建一个自定义的窗口// 返回已创建窗口的句柄(HWND)HWND CreateMyWindow(HINSTANCE hInst, LPCSTR lpszName, LPCSTR lpszTitle, DWORD dwStyle, int left,int top,int width, int height){WNDCLASS wc;ZeroMemory(&wc, sizeof(wc));wc.hInstance = hInst;wc.lpszClassName = lpszName;  // 窗口类名, 以此关联, 相当于取了一个名字wc.style = CS_HREDRAW | CS_VREDRAW; // 水平/垂直发生变化时 都进行重绘wc.hCursor = LoadCursor(hInst, IDC_ARROW); // 光标wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 255)); // 窗口背景颜色(蓝色画刷)wc.lpfnWndProc = DefWindowProc; // 消息处理例程(这里设为默认,可以自定义一个)// 关联了窗口过程函数(即上述的'消息处理例程')后// 使用这个类创建的窗口 对应的事件 都由这个函数进行处理// 作为示例 我们暂时使用默认的DefWindowProc// 在实际应用中根据需要可以自行定义RegisterClass(&wc);HWND hWnd = CreateWindow(lpszName, lpszTitle, dwStyle, left, top, width, height, NULL, NULL, hInst, NULL);return hWnd;}// 设置窗口的参数,注册这个类(RegisterClass), 然后就可使用这个类来创建实例了// 创建窗口并显示窗口, 为了刷新窗口内容 需要事件驱动/消息循环// 消息循环: 某个事件发生进行对应处理, 收到'关闭'或'退出'消息时关闭并结束int main(void){cout << "请输入窗口标题:";string strTitle;getline(cin, strTitle);cout << "请输入窗口宽度 高度:";int width, height;cin >> width >> height;cin.get(); // ‘吃’掉回车符HINSTANCE hInst = (HINSTANCE)0xABADFACE;LPCSTR lpszName = "CustomizedWindow";  // 窗口类的名称, 注册之后才可以使用DWORD dwStyle = WS_OVERLAPPEDWINDOW;HWND hWnd = CreateMyWindow(hInst, lpszName, strTitle.c_str(), dwStyle, 100, 100, width, height);cout << "窗口\'" << lpszName << "\'已创建" << endl;cout << "显示并更新窗口" << endl;ShowWindow(hWnd, SW_NORMAL);UpdateWindow(hWnd);cout << "要关闭窗口,请按回车键";cin.get();  // 等待输入回车CloseWindow(hWnd); cout << "窗口\'" << lpszName << "\'已关闭." << endl;UnregisterClass(lpszName, hInst); // 注销 system("pause");return 0;}

你也许不习惯这种方式(来源于对"控制台窗口"的"抵触情绪"),但这种方式

更能激发你的"学习热情",不走寻常路才能考到不寻常风景


我们知道,windows经典应用程序都是依托于窗口(window)的

(所以微软的操作系统取名为Windows?)

其他类型的应用程序比如后台程序、MetroUI风格的应用不在此列


那么,我们要做的就是(后面括号中的星号越多表示越重要/复杂):

1、设计我们的窗口类型,并向系统注册这个类型(**)

2、创建窗口并显示(*)

3、在窗口上展示我们的业务(比如显示文字、图片,播放声音等)(*****)

4、遇到结束命令,销毁窗口,回收资源(*)


第一部分,是设计

Windows已经为我们做了许多基础工作,我们只需要填充余下部分就行了

在设计时,采用WNDCLASS结构,设置它的各项参数,并且为它取一个名字

以后提到这个名字,就是说这个WNDCALSS结构体

然后注册这个专属的名字(只有向系统注册了才可以使用)

你也可以创建多个不同的WNDCLASS(如果需要的话,比如一个粗框架风格,一个对话框风格)

设计时,还需要指定窗口过程(暂且理解为事件处理子函数吧,具体会在后续文章详述)


第二部分,是创建

我们已经注册了自己的窗口类WNDCLASS,现在可以使用它了

创建一个实例(即窗口对象,根据实际需要也可以创建多个实例,只要注册过了就能使用)

需要注意的是,每个创建好的窗口都有自己的标识(类似于ID)以及专属的事件处理过程

就是说,每创建一个窗口,就会有一个关联的窗口过程

创建好了,就应该以合适的方式(比如现在哪里,显示尺寸等等)显示出来


第三部分,是展示

窗口时人机交互的接口,为了实现生动的交互,就需要一个“驱动系统”

Windows为我们提供了一套解决方案:事件驱动/消息循环

具体会在后续文章详述


第四部分,是销毁

用户或者系统向本程序发出“关闭” "退出" 或 "结束"这样的命令时,窗口过程会立即执行一些“特有的动作”

这些动作一般就是:关闭窗口,回收资源


下面贴出执行效果截图


创建窗口并显示


关闭窗口



因为整个过程都是与窗口打交道的,因此窗口标识(HWND)很重要,

留着它作为参数传递

另外,每个程序(进程)实例(Instance)都有自己的编号(HINSTANCE),

它指示了这个应用程序本身

对于这个程序的操作,就需要以HINSTANCE作为参数

比如,这个程序拥有一个窗口HWND,然后需要退出程序,那么先关闭窗口,

回收资源,然后退出程序

大致就是下面的(伪代码) 

CloseWindow(HWND) -->  ReleaseObjects() --> Exit(HINSTANCE)


到这里,读者应当有一个大概的认识了,

后续文章将会针对一些重点或者细节进行详细介绍

至少,请眼熟两个关键概念:窗口   消息/事件


如果你对于这方面刚接触不久,那么本文可能会对你有一定负面影响,请参考更加权威的资料


如果你已经有一定的基础,那么这部分仅作为一个参考,因为它仅仅是个人见解


如果你已经有深刻的认识以及丰富的知识经验,那么请指正本文的错误与不足


另请注意我所使用的两个名词

示例 = example  列举的例子,比如代码示例

实例 = instance  "创建"的实体,比如窗口实例

因为输入法输入可能会有偏差,希望读者能够辨别博文中的一些错误(我会尽量自审以减少错误)


或许一段时间之后,我对这些概念的认识发生了变化,但是现在将这些贴出来,

还是可以给读者一些启发的


本文原创,原始地址

http://blog.csdn.net/fengyhack/article/details/39344099

0 0
原创粉丝点击