第一篇:MFC消息映射机制分析论文
摘 要:MFC以层次结构组织起来,比较庞杂,尤其是它的消息映射机制,更是涉及到很多底层的东西。本文通过对整个消息映射机制进行系统的 分析,可以帮助程序开发人员更好地了解MFC,进行可视化编程。
关键词:消息驱动;消息映射;MFC 程序设计引言
微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类库。MFC封装了大部分Windows ApI函数和Windows控件,使得程序的开发变得简单,极大的缩短了程序的开发周期。MFC独创的Document/View框架结构,能够将管理数据的代码和显示数据的程序代码分开,并且设计了一套方便的消息映射和命令传递机制,方便程序员的开发使用。其中消息映射机制本身比较庞大和复杂,对它的分析和了解无疑有助于我们写出更为合理的高效的程序。这里我们分析一下MFC的消息映射机制,以了解MFC是如何对Windows的消息加以封装,方便用户的开发。SDK下的消息机制实现
首先,简单回顾一下SDK下我们是如何进行Windows的程序开发的。Windows程序的运行是依靠外部发生的事件来驱动的,事件由操作系统捕捉,以消息的形式进入消息队列,然后通过消息循环从队列中不断取出消息,送到对应的窗口过程里处理。相对于DOS程序,Windows是以WinMain作为程序的入口点,以下就是一个简化的Win32程序的主体,通过while语句实现消息循环:
WinMain(…)
{
MSG msg;
RegisterClass(…);// 注册窗口类
CreateWindow(…);// 创建窗口
ShowWindow(…);// 显示窗口
UpdateWindow(…);
While(GetMessage(&msg,…)){ // 消息循环
TranslateMessage(…);
DispatchMessage(…);
}
return msg.wparam;
}
其中,msg代表消息,程序是通过GetMessage函数从和某个线程相对应的消息队列里面把消息取出来并放到消息变量msg里面。然后TranslateMessage函数用来把键盘消息转化并放到响应的消息队列里面,最后DispatchMessage函数把消息分发到相关的窗口过程去处理。窗口过程根据消息的类型对不同的消息进行相关的处理。在SDK编程过程中,用户需要在窗口过程中分析消息的类型及其参数的含义,然后做不同的处理,相对比较麻烦;而MFC把消息调用的过程给封装起来,使用户能够通过ClassWizard方便的使用和处理Windows的各种消息。MFC中的消息映射机制
在MFC的框架结构下,“消息映射”是通过巧妙的宏定义,形成一张消息映射表格来进行的。这样一旦消息发生,Framework就可以根据消息映射表格来进行消息映射和命令传递。
首先在需要进行消息处理的类的头文件(.H)里,都会含有DECLARE_MESSAGE_MAp()宏,声明该类拥有消息映射表格:
class CscribbleDoc:public Cdocument
{
…
DECLARE_MESSAGE_MAp()
};
然后在类 应用 程序文件(.Cpp)实现这一表格
BEGIN_MESSAGE_MAp(CInheritClass, CBaseClass)
//{{AFX_MSG_MAp(CInheritClass)
ON_COMMAND(ID_EDIT_COpY,OnEditCopy)
………
//}}AFX_MSG_MAp
END_MESSAGE_MAp()
----这里主要进行消息映射的实现,把它和消息处理函数联系在一起。其中出现三个宏,第一个宏是BEGIN_MESSAGE_MAp有两个参数,分别是拥有消息表格的类,及其父类。第二个宏是ON_COMMAND,指定命令消息的处理函数名称。第三个宏是END_MESSAGE_MAp()作为结尾符号。中间的奇怪符号//}}和//{{,是ClassWizard产生的,对程序无 影响。
观察DECLARE_MESSAGE_MAp的定义:
#define DECLARE_MESSAGE_MAp()
private:
static const AFX_MESSAGE_ENTRY _messageEntries[];
protected:
static AFX_DATA const AFX_MSGMAp messageMap;
virtual const AFX_MSGMAp* GetMessageMap()const;
里面又包含了MFC新定义的两个数据结构,如下:
AFX_MSGMAp_ENTRY
struct AFX_MSGMAp_ENTRY
{
UINT nMessage;// windows message
UINT nCode;// control code or WM_NOTIFY code
UINT nID;// control ID(or 0 for windows messages)
UINT nLastID;// used for entries specifying a range of control id's
UINT nSig;// signature type(action)or pointer to message #
AFX_pMSG pfn;// routine to call(or special value)
};
和AFX_MSGMAp
struct AFX_MSGMAp
{
const AFX_MSGMAp* pBaseMap;
const AFX_MSGMAp_ENTRY* lpEntries;
};
其中AFX_MSGMAp_ENTRY结构包含了一个消息的所有相关信息,而AFX_MSGMAp主要作用有两个,一是用来得到基类的消息映射入口地址。二是得到本身的消息映射入口地址。
实际上,MFC把所有的消息一条条填入到AFX_MSGMAp_ENTRY结构中去,形成一个数组,该数组存放了所有的消息和与它们相关的参数。同时通过AFX_MSGMAp能得到该数组的首地址,同时得到基类的消息映射入口地址。当本身对该消息不响应的时候,就可以上溯到基类的消息映射表寻找对应的消息响应。
现在我们来分析MFC是如何让窗口过程来处理消息的,实际上所有MFC的窗口类都通过钩子函数_AfxCbtFilterHook截获消息,并且在钩子函数_AfxCbtFilterHook中把窗口过程设定为AfxWndproc。原来的窗口过程保存在成员变量m_pfnSuper中。
在MFC框架下,一般一个消息的处理过程是这样的。
(1)函数AfxWndproc接收Windows操作系统发送的消息。
(2)函数AfxWndproc调用函数AfxCallWndproc进行消息处理,这里一个进步是把对句柄的操作转换成对CWnd对象的操作。
(3)函数AfxCallWndproc调用CWnd类的 方法 Windowproc进行消息处理。
(4)Windowproc调用OnWndMsg进行正式的消息处理,即把消息派送到相关的方法中去处理。在CWnd类中都保存了一个AFX_MSGMAp的结构,而在AFX_MSGMAp结构中保存有所有我们用ClassWizard生成的消息的数组的入口,我们把传给OnWndMsg的message和数组中的所有的message进行比较,找到匹配的那一个消息。实际上系统是通过函数AfxFindMessageEntry来实现的。找到了那个message,实际上我们就得到一个AFX_MSGMAp_ENTRY结构,而我们在上面已经提到AFX_MSGMAp_ENTRY保存了和该消息相关的所有信息,其中主要是消息的动作标识和相关的执行函数。然后我们就可以根据消息的动作标识调用相关的执行函数,而这个执行函数实际上就是通过ClassWizard在类实现中定义的一个方法。这样就把消息的处理转化到类中的一个方法的实现上。
(5)如果OnWndMsg方法没有对消息进行处理的话,就调用DefWindowproc对消息进行处理。这是实际上是调用原来的窗口过程进行缺省的消息处理。所以如果正常的消息处理的话,MFC窗口类是完全脱离了原来的窗口过程,用自己的一套体系结构实现消息的映射和处理。即先调用MFC窗口类挂上去的窗口过程,再调用原先的窗口过程。用户面对的消息参数将不再是固定的wparam和lparam,而是和消息类型具体相关的参数。比如和消息WM_LButtonDown相对应的方法OnLButtonDown的两个参数是nFlags和point。nFlags表示在按下鼠标左键的时候是否有其他虚拟键按下,point更简单,就是表示鼠标的位置。同时MFC窗口类消息传递中还提供了两个函数,分别为WalkpreTranslateTree和preTranslateMessage。我们知道利用MFC框架生成的程序,都是从CWinApp开始执行的,而CWinapp实际继承了CWinThread类。在CWinThread的运行过程中会调用窗口类中的WalkpreTranslateTree方法。而WalkpreTranslateTree方法实际上就是从当前窗口开始查找愿意进行消息翻译的类,直到找到窗口没有父类为止。在WalkpreTranslateTree方法中调用了preTranslateMessage方法。实际上preTranslateMessage最大的好处是我们在消息处理前可以在这个方法里面先做一些事情。举一个简单的例子,比如我们希望在一个CEdit对象里,把所有的输入的字母都以大写的形式出现。我们只需要在preTranslateMessage方法中判断message是否为WM_CHAR,如果是的话,把wparam(表示键值)由小写字母的值该为大写字母的值就实现了这个功能。小结
MFC通过巧妙的宏定义把消息调用的过程给封装起来,使用户能够通过ClassWizard方便的使用和处理Windows的各种消息。通过对MFC消息映射机制的分析,不仅能够使我们更好的使用MFC类库,同时,对于我们自己设计程序框架和类,无疑也有相当大的帮助。
参考 文献 :
[1] 侯俊杰 著,深入浅出MFC(第2版)[M].湖北:华中 科技 大学出版社,2001.5
[2] David J.Kruglinski著,Visual C 技术内幕(第五版)[M].北京:北京希望 电子 出版社,2001.1
第二篇:MFC消息处理函数总结
1.AfxWndProc()该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWnd
Proc
2.AfxCallWndProc()该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应
用程序以后使用,然后调用WindowProc()函数
3.WindowProc()该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWin
dowProc()函数
4.OnWndMsg()该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消
息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5.OnCommand()该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()
就会调用OnCmdMsg()函数
6.OnCmdMsg()根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数
MFC应用程序创建窗口的过程
1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变
创建参数(可以设置窗口风格等等)
2.PreSubclassWindow()这也是一个重载函数,允许首先子分类一个窗口
3.OnGetMinMaxInfo()该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸
4.OnNcCreate()该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告
诉窗口的客户区即将被创建
5.OnNcCalcSize()该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改
变窗口客户区大小
6.OnCreate()该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个
窗口已经被创建
7.OnSize()该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口
大小已经发生变化
8.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动
9.OnChildNotify()该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一
个窗口刚刚被创建
MFC应用程序关闭窗口的顺序(非模态窗口)
1.OnClose()消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送
此消息
2.OnDestroy()消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息
3.OnNcDestroy()消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁
后发送此消息
4.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用
MFC应用程序中打开模式对话框的函数调用顺序
1.DoModal()重载函数,重载DoModal()成员函数
2.PreSubclassWindow()重载函数,允许首先子分类一个窗口
3.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被
创建
4.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
5.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动
6.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框
中控件的字体
7.OnInitDialog()消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对
话框中的控件,或者是创建新控件
8.OnShowWindow()消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWind
ow()函数调用
9.OnCtlColor()消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或
对话框上面控件的颜色
10.OnChildNotify()重载函数,作为WM_CTLCOLOR消息的结果发送
MFC应用程序中关闭模式对话框的顺序
1.OnClose()消息响应函数,响应WM_CLOSE消息,当“关闭”按钮被单击的时候,该函数
被调用
2.OnKillFocus()消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输
入焦点以前被发送
3.OnDestroy()消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发
送
4.OnNcDestroy()消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被
发送
5.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用
打开无模式对话框的顺序
1.PreSubclassWindow()重载函数,允许用户首先子分类一个窗口
2.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被
创建
3.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
4.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动
5.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中
控件的字体
以上这些的执行都是按给定的顺序执行!
只有清楚的了解应用程序的执行顺序,才能在编写代码的时候知道,在什么时候应该执行什
么,以及在什么地方该处理什么!
这只是本人总结的一点小小的经验,希望能对MFC的初学者有所帮助!MFC应用程序中处
理消息的顺序
1.AfxWndProc()该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWnd
Proc
2.AfxCallWndProc()该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应
用程序以后使用,然后调用WindowProc()函数
3.WindowProc()该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWin
dowProc()函数
4.OnWndMsg()该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消
息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5.OnCommand()该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()
就会调用OnCmdMsg()函数
6.OnCmdMsg()根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数
MFC应用程序创建窗口的过程
1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变
创建参数(可以设置窗口风格等等)
2.PreSubclassWindow()这也是一个重载函数,允许首先子分类一个窗口
3.OnGetMinMaxInfo()该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸
4.OnNcCreate()该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告
诉窗口的客户区即将被创建
5.OnNcCalcSize()该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改
变窗口客户区大小
6.OnCreate()该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个
窗口已经被创建
7.OnSize()该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口
大小已经发生变化
8.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动
9.OnChildNotify()该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一
个窗口刚刚被创建
MFC应用程序关闭窗口的顺序(非模态窗口)
1.OnClose()消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送
此消息
2.OnDestroy()消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息
3.OnNcDestroy()消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁
后发送此消息
4.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用
MFC应用程序中打开模式对话框的函数调用顺序
1.DoModal()重载函数,重载DoModal()成员函数
2.PreSubclassWindow()重载函数,允许首先子分类一个窗口
3.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被
创建
4.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
5.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动
6.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框
中控件的字体
7.OnInitDialog()消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对
话框中的控件,或者是创建新控件
8.OnShowWindow()消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWind
ow()函数调用
9.OnCtlColor()消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或
对话框上面控件的颜色
10.OnChildNotify()重载函数,作为WM_CTLCOLOR消息的结果发送
MFC应用程序中关闭模式对话框的顺序
1.OnClose()消息响应函数,响应WM_CLOSE消息,当“关闭”按钮被单击的时候,该函数
被调用
2.OnKillFocus()消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输
入焦点以前被发送
3.OnDestroy()消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发
送
4.OnNcDestroy()消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被
发送
5.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用
打开无模式对话框的顺序
1.PreSubclassWindow()重载函数,允许用户首先子分类一个窗口
2.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被
创建
3.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
4.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动
5.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中
控件的字体
评论(1)|阅读(570)|添加评论
第三篇:MFC应用程序中处理消息的顺序(模版)
MFC应用程序中处理消息的顺序
MFC应用程序中处理消息的顺序
1.AfxWndProc()该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc
2.AfxCallWndProc()该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数
3.WindowProc()该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数
4.OnWndMsg()该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5.OnCommand()该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数
6.OnCmdMsg()根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数
MFC应用程序创建窗口的过程
1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数(可以设置窗口风格等等)
2.PreSubclassWindow()这也是一个重载函数,允许首先子分类一个窗口
3.OnGetMinMaxInfo()该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸
4.OnNcCreate()该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区即将被创建
5.OnNcCalcSize()该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小
6.OnCreate()该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建
7.OnSize()该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经发生变化
8.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动
9.OnChildNotify()该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被创建
MFC应用程序关闭窗口的顺序(非模态窗口)
1.OnClose()消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息
2.OnDestroy()消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息
3.OnNcDestroy()消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息
4.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用MFC应用程序中打开模式对话框的函数调用顺序
1.DoModal()重载函数,重载DoModal()成员函数
2.PreSubclassWindow()重载函数,b31.org 允许首先子分类一个窗口
3.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
4.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
5.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动
6.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体
7.OnInitDialog()消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件
8.OnShowWindow()消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用
9.OnCtlColor()消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色
10.OnChildNotify()重载函数,作为WM_CTLCOLOR消息的结果发送
MFC应用程序中关闭模式对话框的顺序
1.OnClose()消息响应函数,响应WM_CLOSE消息,当“关闭”按钮被单击的时候,该函数被调用
2.OnKillFocus()消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送
3.OnDestroy()消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送
4.OnNcDestroy()消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送
5.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用打开无模式对话框的顺序
1.PreSubclassWindow()重载函数,允许用户首先子分类一个窗口
2.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
3.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
4.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动
5.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体
以上这些的执行都是按给定的顺序执行!
只有清楚的了解应用程序的执行顺序,才能在编写代码的时候知道,在什么时候应该执行什么,以及在什么地方该处理什么!新濠天地娱乐城66bb.org
第四篇:基于Android平台的纹理映射分析与实现论文
引言
纹理映射的本质是对三维物体进行二维参数化,即先求得三维物体表而上任一点的二维(u,v)参数值,进而得到该点的纹理值,最终生成三维图形表而上的纹理图案。在光滑曲而上添加纹理图案的核心问题是映射,因此纹理问题可以简化为从一个坐标系到另一个坐标系的变换。总的来说,纹理映射技术是一种使建立的3D模型更接近现实物体的技术。
1纹理映射基本原理
纹理生成过程实质上是将所定义的纹理映射为反映某种三维景物表面的属性(与光照明模型及表面几何有关的各种参数,如表面法向、漫/镜面反射率等),并参与后续的光照明计算。
二维纹理映射就是从二维纹理平面到三维物体表面的映射。一般二维纹理平面是有范围限制的,在这个平面区域内,每点都可用数学函数表达,从而可以离散的分离出每点的灰度值和颜色值,这个平面区域称为纹理空间,一般将纹理空间的平面区域定义在[0,1]*[0,1]。纹理映射是确定物体表面一点P在纹理空间中的对应点(u,v),从而纹理空间中的点(u,v)处的纹理值就是物体表面点P的纹理属性。建立纹理空间与景物空间及景物空间与屏幕空间之间的映射关系:
图1纹理映射
景物表面的纹理属性主要有以下几种:
表面颜色,即表面的漫反射率;镜面反射分量,即表面的镜面反射率;透明度;表面法向,即挠动表面法向来产生表面的凹凸纹理;环境的漫反射和镜面反射效果;光源强度和色彩分布。
根据纹理定义域的不同,可分为而为二维和三维纹理,由于本文是基于Android平台的,考虑到效率和资源问题,主要给出了二维纹理的模型,对三维纹理映射技术就不再讨论了。
2纹理映射的实现
本节将通过在一个立方体各个面贴上图片来介绍Android平台下基于OpenGLES的纹理映射有关的内容:定义纹理、控制滤波、说明映射方式、绘制场景,给出顶点的纹理坐标和几何坐标。
首先,我们通过Android平台的OpenGLES库来创建一个纹理,并使用图片来生成一个纹理,过程如下:
IntBufferintBuffer=IntBuffer.allocate(1);//创建纹理
gl.glGenTextures(1,intBuffer);//设置要使用的纹理
gl.glBindTexture(GL10.GL_TEXTURE_2D,texture);
函数glGenTextures(intn,intBuffertextures)用于通知OpenGL我们想生成一个纹理的名字。函数glBindTexture(inttarget,inttexture)方法用于通知OpenGL将纹理名字texture绑定到纹理目标上。
在Android中我们使用GLUtils中的一个静态方法texImage2D(inttarget,intlevel,Bitmapbitmap,intborder)来生成一个纹理。过程如下:
//生成纹理
GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,GLImage.mBitmap,0)
通过以上过程,我们便成功地创建了一个纹理。
为了能有更好的效果,我们还需要设置在OpenGL现实图像时,它放大得比原始纹理大(GL_TEXTURE_MAG_FILTER)或缩小得比原始纹理小(GL_TEXTURE_MIN_FILTER)时OpenGL所采用的滤波方式。以下过程是我们设置的线性滤波://设置线性滤波
Gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR);
在android中可以使用glBindTexture(inttarget,inttexture)方法来绑定纹理。以下过程绑定了上面创建的纹理:Gl.glBindTexture(GL10.GL_TEXTURE_COORD_ARRAY);//绑定纹理
纹理需要使用glEnableClientState()方法来开启纹理:Gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
与之对应的,关闭纹理过程如下:
Gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
为了将纹理正确的映射到四边形上,必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右下角和左下角亦是如此。因为,如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都没有。下面是我们对立方体的每一个面所设置的纹理映射数据:
IntBuffertexCoords=IntBuffer.wrap(newint[]
{
One,0.,0,0,0,one,one,one,0,0,0,one,one,one,one,0,One,one,one,0,0,0,0,one
0,one,one,one,one,0,0,0,0,0,0,one,one,one,one,0,One,0,0,0,0,one,one,one
});
设置好这些映射数据之后,可以通过glTexCoordPointer将纹理绑定到要绘制的物体上。过程如下:
Gl.glTextCoordPointer(2,GL10.GL_FIXED,0,texCoords);
最后,将其绘制到屏幕上即可。效果图2如图所示:
图2纹理映射效果
3结束语
本文通过对纹理映射的基本原理进行了分析,并在Android平台中利用OpenglES图形库对纹理映射技术进行了实现。
由于本文利用的是Android应用层封装后的OpenglES图形库,在效率上欠佳,以后的主要工作是通过AndroidNDK对OpenglES进行原生态开发,进而提高实现效率。
参考文献
[1]李增忠.纹理映射技术的研究[D].中国优秀硕士学位论文全文数据库,2005.[2](美)ShaneCo.comnder.Android移动应用开发从入门到精通[M].北京:人民邮电出版社,2010.[3]杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2010.
第五篇:高校教育管理创新机制分析论文
1高校教育管理中创新教育的内涵
在高校中进行创新教育的管理是一种新型的教育管理模式,从某种意义上说就是在继承和发扬中国传统教育管理的基础上,能够根据时代的发展需要为社会提供创新的人才,从而完善我国的教育机制,实现科教兴国的目的。从定义上可以看出,对于高校的教育管理既要在理论上加强管理的内容的创新,更要在实践活动中加强教学模式,使学生结合理论知识和实践知识提升自己的能力,从而更好地为高校的教育管理服务。高校要适应社会发展的需要,不断更新教育观念,创新教育管理,培养创新型人才,建立健全高校教育管理体系,为培养高素质人才提供保障。高校的创新教育内容包含多种方面,从制度建设到学生的管理都要体现教育管理的创新理念,才能够全面加强高校的教育管理。
2高校教育管理中实行创新机制的重要性
高校教育管理的目的是为了促进教育更好的发展。但是,目前高校的教育管理处于不断的更新过程,尤其是为了更好地为教育服务,各大高校都加强了自己的教育管理水平。我国高校教育获得了长足发展,培养了众多国家栋梁和社会紧缺人才,这与科学的高校教育管理是分不开的,然而时代在不断发展,新的社会现实对高校教育管理提出了新的要求。因此,时代的要求和发展对于高校的教育管理提出了更高的要求,这就需要高校的教育管理进行必要的创新机制的研究,才能够使得高校的教育管理工作适应社会主义市场经济的发展。
2.1高校教育管理创新机制是为了适应高校时代发展的需要
面对国内外的教育管理变化,尤其是对于经济全球化的发展,高校教育的管理开放程度逐渐增大,国内外需要更多的人才尤其是具有发展个性和全面发展的创新型的人才,要求高校的教育管理改变传统的教育理念,实现各国之间人才的竞争。而为了适应激烈的国际竞争的需要,要根据中国的时代特色建设具有自己特点的高校管理模式,才能够为建设创新型的国家提供有效的保障。高校人才的培养离不开有效的教育管理,尤其是现行的创新形式的高校教育管理模式,这在很大程度上能够促进创新型人才的培养。因此,从这个意义上说,高校面临的发展形势要求进行管理的创新机制。
2.2为了优化高校的教师队伍建设
教师在整个教学过程中发挥着重要的作用,尤其是面对越来越多的学生,高校的优秀教师出现短缺的状态。而为了保障高校教育管理工作中的教学质量和管理能力,这需要对于高校的教师队伍建设进行有效的培养。这就需要运用创新机制建立一批高素质的人才队伍。尤其是在教育管理方面,要引进具有高度的管理能力的人才,才能够促进高校的全面发展和进步,这种对于师资力量进行动态管理的教育,是为了创造属于自己的品牌。
2.3高校教育管理创新机制是为了解决高校教学管理问题的需要
创新价值的实现表明,创新是一个系统而又复杂的过程,而不是一个阶段性工作,创新不但具有动态性,而且这种动态性具有非线性的特点,也就是说,创新具有动态和开发的特征。高校教育管理工作中存在着多种的弊端,教育管理观念的落后直接导致了高校教育管理工作的顺利进行和开展。传统的经验和管理方式已经不能够处理时代出现的各种问题,只有更新教育理念和创新机制的管理,才能够使一些保守的问题得到有效的解决。尤其是能够从学生的角度出发解决学生的问题,从而能够发挥教师的作用。这种民主化的新型管理方式才能够促进教师与学生之间的距离。特别是运用网络技术的发展,能够促进高校教育管理工作的效率和工作质量的提高。
3目前高校教育管理工作存在的问题
3.1高校的教育管理制度不够完善
目前,我国的高校都具有自己的教育管理机构,同时也有相应的教育管理制度,但是受到传统教育理念的影响,高校的教育管理制度并没有根据时代的发展更新自己的教育制度。这在一定程度上说明部分高校的教育管理制度并不够完善,尤其是涉及到学生守则等管理方面的制度,行政化和体制化的管理制度严重影响了学生的自觉性和主动性,这对于高校的管理方面产生不利的影响。但是高校教育管理没有形成一整套完整的管理标准和管理制度,即使已经形成的一些制度也没有及时根据形势的发展变化进行修订完善,很多还停留在计划经济的层次上,这就使得在高校教育管理过程中缺乏一定的现实管理依据和标准,管理的计划性和程序性不够强,有的管理处于应付和混乱状态。
3.2高校教育管理手段简单化
在高校的教育管理工作中,方式和手段的实施对于高校的管理产生一定的影响,尤其是在高校教学的过程中,管理手段和方式的简单化对于学生的发展产生不利的影响。而面对新技术和新信息的更新,如果采取传统的教学管理手段,这不利于学生的个性发展和全面发展。高校的教育管理方式应该以新的教育理念,从人本化的角度出发,从学生的角度思路问题。才能够不断丰富教育管理的经验,为学生的管理工作服务,从而在教育管理的基础上提高高校教育管理的效果。高校教育管理工作的管理手段如果过于单一和简单化,这就无法满足教育教学改革过程中人才的培养,这种缺乏民主化的管理理念不利于学生的健康成长。
3.3高校教育管理内容更新不及时
受到传统的计划经济体制的影响,高校的教育管理内容大多数采用的是行政命令式的教学模式,因此造成了高校教育教学过程中的内容过于陈旧,并没有根据时代的特征及时更新教育的内容,这对于学生知识的学习和教育都产生不利的影响,从而影响了教育管理的发挥。
4加强高校教育管理创新机制的重要措施
4.1加强高校教育管理平台建设
把网络技术应用到高校的教育管理工作中,建立起高校的教育管理平台,能够使得高校管理的信息及时更新和传达。尤其是针对国家的教育方针及时进行网络的更新,这在一定程度上促进了学校管理与学生之间的沟通,从而为学生的知识的增长提供了有效的指导意义。另外,建设高校教育管理网络平台,间接加强了教育管理双方的交流和沟通,能够使得学生针对学校的教育管理提供建议和意见,更好地促进教育的管理水平。
4.2举办多种创新活动,实现高校教育管理的民主化
充分发挥学生的积极性和主动性,通过多种途径举办具有特色和创新能力的活动,使学生在整个活动中发挥管理的作用,这一方面提升了学生自己管理自己的作用,另一方面也提高了学生的创新意识。在一定程度上对于高校实现教育管理的民主化得到了有效的支持。保持传统教育理念中较为精华的部分,充分尊重学生的主体性地位,承认学生之间的差异性,给予学生更多的人文关怀,注重创新精神、创业意识和创造能力的培养。
4.3实现教育评价体系的创新
评价标准也是高校教育管理工作中的重要内容之一,尤其是在进行高校制度创新的过程中,要实行开放的和多元化的教育管理体制,才能够在一定程度上得到教师和学生的认可,这需要充分利用高校教育过程中的各种资源,根据学生的自主评价方式,结合教师的评价方式共同进行评价标准的考核,才能够在教学手段上进行管理。在面对信息化时代的发展趋势,能够将网络技术的应用和高校的教育管理手段相结合,是高校教育管理的进步。高校教育管理应该建立全方位的目标评价体系,尤其是涵盖学生的思想品德方面的考核,才能够全面建立师生平衡的评价体系,为激发教师和学生的创新能力提供良好的基础。
5结语
新形势下,针对高校教育管理工作存在的问题,要对于高校的教育管理实行创新的机制,才能够在一定程度上运用现代化的教学手段推进教学管理制度的改革,从而能够保障高校教育管理动作的顺利开展。为了实现高校的教育管理工作的目标,从而推进教学管理的创新,这就需要在一定程度上实现教育理念的更新,培养具有创新精神和创新能力的高素质人才。