一、Windows程序框架
所有的Windows程序都是基于一个模式的,分为以下几个步骤:
1、定义窗口类(使用已有窗口类时可省略)
2、注册窗口类(使用已有窗口类时可省略)
3、创建窗口
4、显示窗口(根据情况可省略)
5、更新窗口(根据情况可省略)
6、设立消息循环
7、响应消息
用MFC编程看不到以上步骤,但实际上这些步骤仍然存在,只不过是封装在MFC的框架之中了
以下是Windows编程的基本架构,它几乎是万能的,稍加修改就可用作任何程序的起始阶段:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpszCmd,int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS w;
memset(&w,0,sizeof(w));
w.style=CS_HREDRAW|CS_VREDRAW;
w.lpfnWndProc=WndProc;
w.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
w.lpszClassName="Win32Test";
RegisterClass(&w);
hWnd=::CreateWindow("Win32Test","Test",WS_OVERLAPPEDWINDOW,10,10,600,400,NULL,NULL,hInst,NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)(msg.wParam);
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
if(uMsg==WM_DESTROY)
{
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
在Visual studio .net中,以上程序在编译时可能会出错,这是由于Visual studio .net生成的工程默认采用Unicode。修正方法有两种:一是修改工程属性,去掉Unicode;二是将字符转为Unicode字符(如L“Win32Test”或TEXT("Win32Test"),其中用TEXT()方式转换对Unicode工程及非Unicode工程均可用,可易植性好。若是#include <TCHAR.H>,则还可用_T()及_TEXT())。
特别需要注意的是,消息循环时,要用while(GetMessage(&msg,NULL,0,0)),而非while(GetMessage(&msg,hWnd,0,0))。因为此时是从Windows中取消息,而非仅从本窗口中取消息,否则会出现窗口已关闭而程序仍在运行的情况。
二、 框架程序注释
1、WinMain函数
WinMain函数是Windows程序的入口点,程序自此开始,它的各项参数是:
(1)HINSTANCE hInst是当前进程的句柄
(2)HINSTANCE hPreInst是这个程序前一个实例的句柄,只对16位Windows编程有用,对Win32编程无效,总是NULL。
(3)LPSTR lpszCmd是传给程序的参数
(4)int nCmdShow指明程序开始时的状态(最大化/最小化/正常)
2、定义Window类
WNDCLASS或WNDCLASSEX结构用于定义Windows窗口类的名称、样式、窗口处理函数、背景、图标、光标、菜单等属性。其中最重要的是窗口类名称及窗口处理函数。
对WNDCLASS及WNDCLASSEX结构不详述。
3、注册Windows类
RegisterClass或RegisterClassEx用于注册窗口类,其参数类型是指向WNDCLASS或WNDCLASSEX的指针。
对RegisterClass及RegisterClassEx结构不详述。
4、生成窗口
CreateWindow或CreateWindowEx用于生成窗口,其函数原型为:
HWND CreateWindow(
LPCTSTR lpClassName, //窗口类名称
LPCTSTR lpWindowName, //窗口标题
DWORD dwStyle, //窗口样式
int x, //水平位置
int y, //垂直位置
int nWidth, //窗口宽度
int nHeight, //窗口高度
HWND hWndParent, //父窗口句柄
HMENU hMenu, //菜单句柄
HINSTANCE hInstance, //进程句柄
LPVOID lpParam); //窗口建立的数据的地址
HWND CreateWindowEx(
DWORD dwExStyle, //扩展的窗口样式
LPCTSTR lpClassName, //窗口类名称
LPCTSTR lpWindowName, //窗口标题
DWORD dwStyle, //窗口样式
int x, //水平位置
int y, //垂直位置
int nWidth, //窗口宽度
int nHeight, //窗口高度
HWND hWndParent, //父窗口句柄
HMENU hMenu, //菜单句柄
HINSTANCE hInstance, //进程句柄
LPVOID lpParam); //窗口建立的数据的地址
5、显示并更新窗口
ShowWindow函数用于显示窗口,它除了需要窗口的句柄作为参数外,还需要一个参数用于确定窗口的状态,这个参数有以下值:
SW_SHOWMINIMIZED 最小化
SW_SHOWMAXIMIZED 最大化
SW_SHOW 正常显示
UpdateWindow函数用于更新窗口,它向Windows发送一条WM_PAINT消息,以要更新的窗口的句柄为参数。
6、消息循环
GetMessage函数用于获取消息,在窗口消息循环时,要用while(GetMessage(&msg,NULL,0,0)),而非while(GetMessage(&msg,hWnd,0,0))。因为此时是从Windows中取消息,而非仅从本窗口中取消息,否则会出现窗口已关闭而程序仍在运行的情况。GetMessage只有在收到WM_QUIT消息时才会返回0,从而终止消息循环。
TranslateMessage用于对消息进行处理以使消息规范化,DispatchMessage将消息传递给窗口过程,以使窗口过程能够处理消息。
7、响应消息
对消息的响应是由窗口过程完成的。窗口过程是一个回调函数,其原型为:
LRESULT CALLBACK WindowProc(
HWND hwnd, //发送消息的窗口句柄
UINT uMsg, //消息
WPARAM wParam, //消息参数
LPARAM lParam); //消息参数
DefWindowProc是Windows默认的窗口过程函数,程序可只对自己感兴趣的消息进行处理,其余消息交给默认窗口过程函数处理。
PostQuitMessage函数向系统发出WM_QUIT消息,系统在接收到WM_QUIT消息后才会终止消息循环。
分享到:
相关推荐
windows程序的文件结构,系统介绍文件结构的文档 windows程序的文件结构,系统介绍文件结构的文档
Charles Petzold从 1984年开始编写个人计算机程序,从 1985年开始编写 Microsoft Windows程序。他在《Microsoft Systems Joumal》1986年 12月号上发表了第一篇关于 Windows程序设计的杂志论文。从 1986年到 1995年...
在Windows中,API还意味着一个特殊的程序架构,我们将在每章的开头进行研究。 一般而言,Windows API自Windows 1.0以来一直保持一致,没什么重大改变。具有Windows 98程序写作经验的Windows程序写作者会对Windows ...
深入研究Windows内部原理系列之三:Windows体系结构-从应用程序的角度.zip
《mfc windows程序设计(第2版)》是对其极为经典的第1版的全面更新,本书不仅扩展了已被认为是权威的关于microsoft用于windows api的功能强大的c++类库的阐述,还新增了有关com、ole和activex的内容。本书的作者...
书籍目录: 第1章 Windows程序设计基础 1.1 必须了解的内容 1.2 VC++的基本使用 1.3 本书推荐的编程环境 1.4 代码的风格 第2章 Win32程序运行原理 2.1 CPU的保护模式和Windows系统 2.2 ...
如在本章稍后所讨论的,这不是写作Windows程序的唯一方法。然而,无论最终您使用什么方式写作程序,了解Windows API都是非常重要的。 正如您可能知道的,Windows 98已成为使用Intel 32位微处理器(例如486和Pentium...
第1章 起步 1.1 Windows环境 1.1.1 Windows简史 1.1.2 Windows的方方面面 1.1.3 动态链接 1.2 Windows编程选项 1.2.1 API及内存管理模式 1.2.2 语言选择 1.2.3 编程环境 1.2.4 API文档 1.3 你的第一个Windows程序 ...
如在本章稍后所讨论的,这不是写作Windows程序的唯一方法。然而,无论最终您使用什么方式写作程序,了解Windows API都是非常重要的。 正如您可能知道的,Windows 98已成为使用Intel 32位微处理器(例如486和Pentium...
MFC.Windows程序设计(第2版)...《MFC Windows程序设计》(第2版)(修订版)涵盖了以下专题:事件驱动程序设计和MPC的基础知识文档/视图体系结构位图、调色板和区域多线程和线程同步MFC与组件对象模型(COM)ActiveX控件
在掌握基于消息的windows程序结构和多线程程序设计方法的基础上,设计一个多线程同步的程序。使学生能够从程序设计的角度了解多线程程序设计的方法和在windows系统下多线程同步互斥的机制。 2、实验内容 理解Windows...
作者: (美)Jeff Prosise ...《MFC Windows程序设计》(第2版)(修订版)涵盖了以下专题:事件驱动程序设计和MPC的基础知识文档/视图体系结构位图、调色板和区域多线程和线程同步MFC与组件对象模型(COM)ActiveX控件
《MFCWindows程序设计》(第2版)...《MFCWindows程序设计》(第2版)(修订版)涵盖了以下专题:事件驱动程序设计和MPC的基础知识文档/视图体系结构位图、调色板和区域多线程和线程同步MFC与组件对象模型(COM)ActiveX控件
Windows程序设计基础课件:第2讲MFC应用程序框架及文档视图架构.pdf
该文档详细介绍了Windows程序设计流程、基本结构、语法结构等。感兴趣的朋友可以下载下来学习学习,了解了解。
Windows SDK笔记(一):Windows程序基本结构