现在的位置: 首页 > 综合 > 正文

msg结构

2013年12月11日 ⁄ 综合 ⁄ 共 5606字 ⁄ 字号 评论关闭

msg结构
    typedef struct tagMSG{
HWND hWnd; 所欲送达的窗口代码(handle)
UINTmessage;消息为-Unsign 整数(int)
WPARAMwParam;相关参数后文说明
LPARAMtParam;相关参数后文说明
DWORDtime 时间
POINTpt 鼠标光标位置
}MSG;

CALL-BACK FUNCTION(回调函数)
窗口函数是在Register 窗口类时在wc.tpfn-WndProc 这个对象上设
置的例如:
wc.lpfnWndProc = WndProc; *将窗口函数WndProc“嵌入”系统*
这样当运行Register Class ( WC)时就把WndProc()这个函数的
Visual C++6.0 编程实例与技巧
www.BOOKOO.com.cn 188
地址登记到Windows 也就是“嵌入”系统
DispatchMessage( msg)

WinMain()
WinMain()是Windows 程序的起始函数通常它会做窗口注册创
建窗口显示窗口的动作然后进入消息循环此循环会不断地往消息
队列中读取消息一旦取得消息立刻用Dispatch Massage()通过系统来调
用消息处理函数如此一直循环直到GetMassage()找不到消息 让
出控制权才暂告休息

WndProc()是处理消息的函数或称窗口函数WndProc()统一由
Windows 来调用为一回调型的函数WndProc()按消息来做出响应
是控制窗口行为的过程。

     模块定义文件
NAME WINHELLO
DESCRIPTION C Windows Application
EXETYPEWindows
STUB Winstub.exe
CODEPRELOAD MOVEABLE
DATAPRELOAD MOVEABLE MULTIPLE
HEAPSIZE1024
STACKSIZE4096
EXPORTSWndProc

1. NAME 名称栏
这是指可运行文件.EXE 的文件名通常与主程序文件(WinMain 所
在的文件)同名
2. DESCRIPTION 描述栏
此字段的内容将以字符串类型放在.EXE 文件中但不会被运行这
个字段的目的是让编程者可以放一些让自己或别人看的消息于程序中
例如版权或版本说明等
3. EXETYPE 运行文件种类栏
这一栏通常的内容就是Windows 代表这是一个必须在Windows 下
运行的.EXE 文件
4. STUB 标号栏
这一栏的字符串是指要一起连接在.EXE 开头的小程序如果您试
着在DOS 下直接运行一个Windows 应用程序会看到这么一行字:The
Program requires Microsoft Windows 就是由Win stub.exe 这个小程序所完
成的这个小程序的作用是在程序最开头的地方判别现在系统是 否
处于Windows 环境下如果是便运行程序;如果不是就显示上列文
字而停止运行因此 如果您改变了这个标号文件改以自己编写的
判断程序下次运行时(在DOS 下)便会看到 您自己加入的消息或画面

5. CODE 代码字段
这个字段的参数是用来描述代码段的性质PRELOAD是指Windows
必须在运行前将代码装入至 内存中;MOVEABLE 代表此段程序是可移
动地址的这样窗口系统可将此代码搬移以获得较大的连续可用内
存;DISCARDABLE 则是用于通知系统当内存不够用时可以将此程
序段抛弃
6. DATA 数据文件段
DATA 定段是指数据段的性质其中前两个参数PRELOAD 和
MOVEABLE 代表的意义和CODE 字段 中相同最后一个MULTIPLE
是指程序的每一个instance 都要有一个自己的数据段正如前面说过的。
同一个程序有好几个同时运行的instance 则DATA 声明成MULTIPLE
的作用就是在 使数据段不要相混
7. HEAPSIZE 调整内存空间字段
当程序中要求动态分配内存时系统就会将heap 中的内存分配给该
程序因此这个字段决定要保留多少内存给动态分配使用尽管我们
在程序中并没有任何分配内存的要求我们还要必须保留1K 的空间给
heap
8. STACKSIZE 堆栈区大小字段
堆栈是C 程序中很重要的区域所有调用函数传递参数的动作
都必须要有足够的堆栈区我们的程序中并没有作很多层的调用也没
有太多的消息所以要求的堆栈区并不大如 果您的程序中有用到
递归调用或是使用相当多的local 变量就必须声明较大的堆栈区
9. EXPORTS 外加嵌入字段
前面提到过消息处理函数WndProc 必须被嵌入到系统中才能由
系统来调用所有在程序中必须被嵌入而由系统来调用的函数都必须
在此字段中声明此处只有一个WndProc 将 来我们会看到许多:定时
处理对话框处理

成员函数Run
初始化完成后WinMain 函数将调用CWinApp 的成员函数Run 来
处理消息循环成员函数Run 不断执行消息循环检查消息队列中有没
有消息如果有消息将消息发送下去以便采取动 作如果没有消
息则调用消息CWinApp 的成员函数OnIdle 来做空闲时的处理工作
如果既 没有消息要处理也没有空闲时的处理工作要做则应用程序
将一直等待直到消息出现 当应用程序结束时成员函数Run 将调
用ExitInstance 来做最后的清理工作。

成员函数ExitInstance
每当要终止应用程序的某一副本时都要调用CwinApp 的成员函数
ExitInstance 如果要做专门的清理工作如释放GDI 资源或释放执行期
间所占用的内存则可以覆盖成员函数Exi tInstance

成员函数OnIdle
如果没有消息要处理则应用程序将调用CwinApp 的成员函数
OnIdle 来做空闲处理缺省时该成员函数将更新用户界面对象如工
具栏按钮的状态并完成在运行过程中所创 建的临时对象的清理工

文档模板
文档模板用于存放与应用程序文档视图和边框窗口有关的信息
MFC 类库提供有两种文档模板类即用于SDI 应用程序的
CSingleDocTemplate 和用于MDI 应用程序的CMultiDocTemplat e
对于每种文档类型CSingleDocTemplate 每次只能创建并管理一个文档而
CMultiDocTe mplate 可以创建并管理多个文档

窗口对象
窗口对象不管是边框窗口还是其他类型的窗口与Windows 窗口
HWND 是有区别的窗口对象是可以由应用程序直接创建的CWnd
类或派生类的对象它随着对应用程序的构造 函数和析构函数的
调用而出现和消失而Windows 窗口是Windows 内部数据结构的句柄
在显 示时要消耗系统资源Windows 窗口由窗口句柄HWND 标识
并由CWnd 类的成员函数Creat e 在创建CWnd 对象之后创建窗口可
以被应用程序调用销毁也可以被用户动作销毁窗口 句柄保存在窗
口对象的mhWnd 成员变量中
CWnd 及其派生类提供有构造函数析构函数和成员函数用于初
始化对象创建Windows 基本结构和访问被封装的窗口句柄HWND
CWnd 还提供用于封装Windows API 的成员函数使用这些函数可以发
送消息访问窗口状态转换坐标更新和滚动窗口等
CWnd 的主要目的在于提供处理标准Windows 消息如WMPAINT
或WMMOUSEM OVE 的接口CWn d 的多数成员函数都是标准
Windows 消息以标识符afxmsg 及以前缀“On”开始的 消息如OnPaint
和OnMouseMove 等的处理函数

图形对象
Cpen 封装了GDI 的画笔对象Windows 句柄为HPEN
Cbrush 封装了GDI 的画刷对象Windows 句柄为HBRUSH
Cfont 封装了GDI 的字体对象Windows 句柄为HFONT
Cbitmap 封装了GDI 的位图对象Windows 句柄为HBITMAP
Cpalette 封装了Windows 调色板Windows 句柄为HPALETTE
CRgn 封装了GDI 的区域对象Windows 句柄为HRGN

标准Windows 消息
除WMCOMMAND 外所有以“WM”为前缀的消息都是标准
Windows 消息标准Windows 消息由窗口和视图处理这类消息通常含
有用于确定如何对消息进行处理的一些参数标准Window s 消息都有
缺省的处理函数这些函数在CWnd 类中进行了预定义
MFC 类库以消息名为基础形成这些处理函数的名称这些处理函数
的名称都以前缀“On”开始有的处理函数不带参数而有的则有几个参
数有的还有除void 以外的返回值类型CW nd 中消息处理函数的说
明都有afxmsg 例如消息WMPAINT 的处理函数 在CWnd 中被声明

afxmsg void OnPaint()
关键字afxmsg 用于把处理函数与其他CWnd 成员函数区分开来这
些函数并不真正是虚拟的而是通过消息映射实现的消息映射仅仅依
赖于标准的预处理宏而不是依赖于C++语言的任何扩展经过预处理
以后关键字afxmsg 的位置就变成空白如果要覆盖CWnd 类中已定
义的某一消息处理函数只需用ClassWizard 在派生类中用同样的原型
定义一个函数并为该 函数做一个消息映射条目即可当ClassWizard 为
某一给定的消息编写处理函数的轮廓时将使用被覆盖成员函数推荐使
用的形式例如WMCREATE 消息的OnCreate 处理函 数将首先调用
基类的处理函数只有在不返回-1 的条件下才继续执行:
int CMyAppView::OnCreate LPCREATESTRUCT
lpCreateStruct
{
if Cview::OnCreate (lpCreateStruct ==-1)
return -1
//TODO 在此处添加专门的创建代码
return 0
}
标准Windows 消息常见的有WMCHAR 消息鼠标消息WMPAINT
消息WMHSCROLL 消息WMVSCROLL 消息和WMTIMER 消息等
1. WMCHAR 消息
当用户按下键盘上的某一键时都会产生WMCHAR 消息
WMCHAR 消息的处理函数为OnChar 函数原型为
afxmsg void OnChar UINTnChar,UINT nRepCni,UINT nFlags
其中参数nChar 是所按键的字符代码值nRepCnt 表示重复次数;
该值是用户按键时重复击键的次数nFlags 表示扫描码先前键状态和
键转换状态等其含义参阅有关资料
2. 鼠标消息
在Windows 中鼠标输入是不可避免的几乎所有的应用程序都要
进行鼠标操作由于鼠标使用相当频繁而且相当重要因此鼠标消息
的类型也较多主要有WMMOUSEMOVE 移鼠标 到新的位置
WMLBUTTONDOWN 单击鼠标左按钮WMRBUTTONDOWN 单
击鼠标右按钮 WMLBUTTONUP 释放鼠标左按钮
WMRBUTTONUP 释放鼠标右按钮和WMLBUTTONDBLCLK 双
击鼠标左按钮等
所有鼠标消息的处理函数都有类似的原型例如对于
WMLBUTTONDOWN 消息其处 理函数的原型为
afxmsg void OnLButtonDown(UINT nFlags,Cpoint point)
所有鼠标消息的处理函数都有两个参数nFlags 和point nFlags 参
数表示鼠标按钮的状态及鼠标事件发生时键盘上某些键的状态每一状
态都由nFlags 的某一位表示详细资料请参 阅有关书籍
参数point 是鼠标事件发生时鼠标光标的位置位置是相对于窗口左
上角的水平X 坐标和垂直Y 坐标而言的
3. WMPAINT 消息
当调用成员函数UpdateWindow 或RedrawWindow 要求重新绘制窗
口内容时应用程序将收到WM PAINT 消息Windows 之所以提供
WMPAINT 消息是因为当窗口最小化后 再还原或被另一窗 口遮盖然
后又移开后当前窗口的某些内容必须重新绘制通常Windows 并不
记录窗口中 的具体内容因为维护窗口内容是编程人员而不是系统的
责任多数情况下应用程序比系 统更了解窗口内容也更易于维护
窗口内容当然系统也能帮助维护窗口内容其方式是向 Windows 应
用程序发送WMPAINT 消息应用程序检索到该消息后就需要重新显
示 窗口内容WMPAINT 消息的处理函数为OnPaint 该函数无参数
4. WMHSCROLL 消息
WMHSCROLL 消息是用户单击窗口的水平滚动条时产生的消息
WMHSCROLL 消息的处理函数为OnHScroll 函数原型为
afxmsg void OnHScroll UINT nSBCode
UINT nPos CScrollBar* pScrollBar
其中参数nSBCode 是指示用户滚动请求的滚动条代码其取值可
以查阅有关资料
当滚动条代码为SBTHUMBPOSITION 和SBTHUMBTRACK 时
nPos 用于指定滚动框的位置否则无意义如果滚动消息来自滚动条
控件则pScrollBar 为指向控件的指 针如果单击窗口滚动条则该值
为NULL
5. WMVSCROLL 消息
WMVSCROLL 消息是用户单击窗口的垂直滚动条时产生的消息
WMVSCROLL 消息的处理函数为OnVScrol1 函数原型为
afxmsg void OnVScroll UINT nSBCode
UINT nPos CScrollBar* pScrollBar
其中参数nSBCode 是指示用户滚动请求的滚动条代码其取值可
以查阅有关资料
当滚动条代码为SBTHUMBPOSITION 和SBTHUMBTRACK 时
nPos 用于指定滚动框的位置否则无意义如果滚动消息来自滚动条
控件则pScrollBar 为指向控件的指针如果单击窗口滚动条则该值
为NULL
处理WMHSCROLL 和WMVSCROLL 消息要调用成员函数
SetScrollPos 来重新设置滚动框的位置
6. WMTIMER 消息
在Windows 中安装有计时器时可以使用成员函数SetTimer 定期
向应用程序发送消息这种消息就是WMTIMER. 每当计时器周期被
触发时系统就发送消息WMTI ME R 可以使用计时器来激活某个程
序尤其是当应用程序被作为一个任务在后台运行时
WMTIMER 消息的处理函数OnTimer 函数原型为
afxmsg void OnTimer(UINT nIDEvent);
其中参数nIDEvent 用于指示计时器的标示符

抱歉!评论已关闭.