Win32基础程序概念(上)
来源:互联网 发布:植物生长算法程序 编辑:程序博客网 时间:2024/06/01 12:54
学习MFC必要基础:
1.对于Windows程序的事件驱动特性的了解(消息的产生、获得、分派、判断、处理)
2.对C++多态的精确体会
Win32程序开发流程:
Window程序分为“程序代码”和“UI资源”两大部分,两部分最后以RC编译器整合为一个完整的EXE档案。
需要什么库函数(.LIB)
应用程序调用的Windows API 函数是在“执行时期”才链接上的。
Windows程序调用的函数分为C Runtimes以及Windows API两大部分。
LIBC.LIB---------这是C Rutime函数库的静态链接库版本
MSVCRT.LIB-------这是C Runtime函数库的动态链接版本(MSVCRT40.DLL)
Windows API由系统本身(GDI32.DLL和USER32.DLL和KERNEL32.DLL)提供。在链接时期,需要先为调用者准备一些适当的信息,才能在执行期间顺利调到DLL中执行。这些适当的信息放在所谓的“import函数库”中。对应为(GDI32.LIB和USER32.LIB和KERNERL32.LIB)
需要什么头文件
WINDOWS.H
以消息为基础,以事件驱动之(message based,event driven)
由硬件装置所产生的消息(如鼠标移动或键盘被按下),放在系统队列(system queue)中
由Windows系统或其他Windows程序发送过来的消息放在程序队列(application queue)中
以应用程序来看放在哪里并没有什么却别,反正程序调用GetMessage API就取得一个消息,程序就是靠它来推动
窗口类之注册与窗口之诞生
InitApplication和InitInstance分别调用了RegisterClass和CreatWindos,这两个函数被MFC封装成CWinApp的两个虚成员函数。(第六章)
消息循环
初始化后,进入所谓的消息循环:
while(GetMessage(&msg,...))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
其中TranslateMessage就是讲键盘消息转化,DispatchMessage将消息传给窗口函数处理。
消息映射(Message Map)的雏形
首先,定义一个MSGMAP_ENTRY结构和一个dim宏:
struct MSGMAP ENTRY{
UINT nMessage;
LONG (*pfn) (HWND,UINT ,WPATAM,LPARAM);
};
#define dim(x) (sizeof(x)/sizeof(x[0]))
其中pfn是一个函数指针。这就是面向对象观念中把数据和处理数据的方法封装起来的具体实现。只不过目前用的不是C++语言。
接下来组织两个数组_messageEntries[]和_commandEntries[],把程序中欲处理的消息和消息处理函数关联起来
struct MSGMAP_ENTRY _messageEntries[]=
{
WM_CREATE , OnCreate,
WM_PAINT, OnPaint,
WM_SIZE, OnSize,
WM_COMMAND, OnCommand,
WM_SETFOCUS, OnSetFocus,
WM_CLOSE, OnClose,
WM_DESTROY, OnDestroy,
};
其中前者是消息,后者是消息处理程序
struct MSGMAP_ENTRY _commandEntries[]=
{
IDM_ABOUT , OnAbout,
IDM_FILEOPEN,OnFileOpen,
IDM_SAVES, OnSavesAs,
};
前者是WM_COMMAND目录项,后者是目录处理函数
于是窗口可以如下设计
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int i ;
for(i=0;i<dim(_messageEntries;i++))
{
if(message==_messageEntries[i].nMessage)
{
return ((*_messageEntries[i].pfn)(hWnd,message,wParam,lParam));
}
}
return (DefWindowProc(hWnd,message,wParam,lParam));
}
这么一来,WndProc永远不用改变,每当有新的要处理的函数消息,只要在_messageEntries[]中增加新的元素,并针对新消息撰写心新的处理函数即可。当然MFC的Message Map把这些封装的更加精致。
0 0
- Win32基础程序概念(上)
- Win32 app 概念程序
- [Win32基础]多线程相关概念
- win32程序基础
- win32基础程序
- 1.Win32基本程序概念(深入浅出MFC之读书笔记)
- VC6.0 win32程序基础
- Spring基础-上-概念篇
- 《深入浅出MFC》学习笔记一 : Win32基本程序概念 (转)
- 将Win32程序移植到Linux上
- Linux程序开发基础概念
- Win32多线程编程(1) — 基础概念篇
- Win32多线程编程(1) — 基础概念篇
- Win32多线程编程(1) — 基础概念篇
- 程序猿必修----数据结构(1基础概念跟介绍)
- 程序基础(上)
- [Win32] 服务程序开发(2)Session 0隔离(上)
- Win32 GDI基础(笔记)
- hg 相关指令
- Java集合(fail-fast机制)
- 二叉搜索树的第k个节点
- 利用JavaFx开发RIA桌面应用-获取屏幕四个角落的坐标
- VS2012下实现CMFCPropertyGridCtrl 内添加日期时间控件
- Win32基础程序概念(上)
- 前端自动化工具里面gulp和fis,有哪些优缺点?
- 第16周项目1-验证算法(7)归并排序
- 一键切图
- Qt上的OpenCv学习日记③之图像的基本操作(下)
- Sublime2编辑器编写Python脚本的快捷操作
- 20161217湘潭大学新生赛B题
- Hibernate报错解决 a different object with the same identifier value was already associated with the sess
- Android NDK 编译出现 string:No such file or directory