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
- Windows应用程序的基本框架浅析(01)
- Java应用程序的基本框架
- Symbian 应用程序框架浅析
- Symbian 应用程序框架浅析
- Symbian 应用程序框架浅析
- Symbian 应用程序框架浅析
- Symbian 应用程序框架浅析
- Windows应用程序的框架设定
- windows 程序的基本框架
- windows基础应用程序编程(一):基本框架
- Windows应用程序基本结构
- windows应用程序框架
- Windows SDK程序的基本框架
- Win32应用程序基本框架详解
- 第四章Java应用程序的基本框架
- [20140101_Example05(Supplication)]基本的Windows应用程序、类的继承
- Windows程序基本框架
- windows基本程序框架
- C# SQL 整表插入
- 分析倾向单边挤压时金属流动状态
- 关于STM32外接4—16MHz晶振主频处理方法
- 使用JQuery 获取当前[jsp,html,aps,php,...url传参值]
- 初识Linux shell工具
- Windows应用程序的基本框架浅析(01)
- JavaScript编译器
- 数据库学习笔记
- APNS推送服务证书制作 图文详解教程
- PHP 转换字符的编码
- BeagleBone Black编译安装nginx
- 【SPOJ】4487 Can you answer these queries VI 【splay】
- #ifndef #define #endif防止的是“重复编译”,而不是“重复定义”
- 稳定排序和不稳定排序