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
原创粉丝点击