VC定义全局变量和消息机制.doc_第1页
VC定义全局变量和消息机制.doc_第2页
VC定义全局变量和消息机制.doc_第3页
VC定义全局变量和消息机制.doc_第4页
VC定义全局变量和消息机制.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

全局变量一般这样定义:1。在一类的.cpp中定义 int myInt;然后再在要用到的地方的.cpp里extern int myInt;这样就可以用了。 2。在stdafx.cpp中加入:int myInt;然后在stdafx.h中加入:extern int myInt这样定义以后无论在什么文件中都是可见的.3。比较规范的是,先定义一个Glbs.h,把所有的全局变量原始定义放进去。然后定义一个Externs.h,把你先前定义在Glbs.h中的变量都加上extern。注意:如果你在Glbs.h中设置了初值,那么在Externs.h中就不要加值了。然后调用时,第一次调用的i nclude ,以后调用的i nclude 另:问:如何在VC+中使用全局变量,以使文档中的所有类都能访问。答:把该变量放到该应用程序类的头文件中的attribute处。然后,在程序的任何地方,你都可以用下面的方法来访问该变量:CMyApp *app=(CMyApp*)AfxGet-App();app-MyGlobalVariable=用这个方法,不但可以定义全局变量,也可以定义全局对象。例如:MyClass MyObject;CMyApp*app=(CMyApp*)AfxGet-App();app-MyObject.MyFunction();VC中使用全局变量的2种办法及防错措施 1. 对于全局变量存在和函数一样的问题,为了在其他CPP文件中能够访问这些变量,必须在主文件的H文件中加上extern声明,格式如下:extern varibletype var; (声明)在主文件的CPP文件中定义varibletype var; (定义)例子:AppWizard建立一个Test工程那么在Test.h中声明extern CString cs;在Test.app定义CString cs; 如果要定义整个工程的全局变量,在任何一个CPP文件中进行定义,然后在需要引用这个变量的文件中进行声明。如全局变量很多可以选择使用定义全局变量的。h文件,在需要的地方直接include头文件即可,不需要写那么多extern了。2.应用程序类的主头文件处定义变量varibletype var,然后,在程序的任何地方,都可以用下面的方法来访问该变量:CClassApp *app=(CClassApp*)AfxGetApp();app-var=类似的,以上方法也可以定义全局对象例子:AppWizard建立一个Test工程那么在Test.h中声明 CString cs;使用的时候CTestApp *app=(CTestApp*)AfxGetApp(); app-cs=Global防错措施:若定义的函数和全局变量在多个文件包含且造成嵌套或多次调用的话,这样将导致这个头文件每被包含依次,函数或变量就被重新定义一次,在链接编译时会导致重定义错误。为此需要使用一种被称为Guard macro的技术来保证不出错。在一个头文件开头加上#ifndef _MACRO_1_#define _MACRO_1_在文件末尾增加#endifwindows消息机制1. 窗口过程 每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)2 消息类型 1) 系统定义消息(System-Defined Messages) 在SDK中事先定义好的消息,非用户定义的,其范围在0x0000, 0x03ff之间, 可以分为以下三类:1窗口消息(Windows Message) 与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,也可以是Dialog,控件等。如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL.2命令消息(Command Message)与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型3 控件通知(Notify Message) 控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展。2) 程序定义消息(Application-Defined Messages) 用户自定义的消息, 对于其范围有如下规定:WM_USER: 0x0400-0x7FFF (ex. WM_USER+10)WM_APP(winver4.0): 0x8000-0xBFFF (ex.WM_APP+4)RegisterWindowMessage: 0xC000-0xFFFF3 消息队列(Message Queues) Windows中有两种类型的消息队列1) 系统消息队列(System Message Queue)这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理2) 线程消息队列(Thread-specific Message Queue)每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.注意: 线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。4 队列消息(Queued Messages)和非队列消息(Non-Queued Messages)1)队列消息(Queued Messages) 消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理如鼠标,键盘消息。2) 非队列消息(NonQueued Messages)消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED 注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中; SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理5 PostMessage(PostThreadMessage), SendMessage PostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage:把消息放到指定线程的消息队列中后立即返回。SendMessage:直接把消息送到窗口过程处理, 处理完了才返回。6 GetMessage, PeekMessage PeekMessage会立即返回可以保留消息GetMessage在有消息时返回会删除消息7 TranslateMessage, TranslateAccelerator TranslateMessage: 把一个virtual-key消息转化成字符消息(character message),并放到当前线程的消息队列中,消息循环下一次取出处理。TranslateAccelerator: 将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。8(消息死锁( Message Deadlocks) 假设有线程A和B, 现在有以下下步骤1) 线程A SendMessage给线程B, A等待消息在线程B中处理后返回2) 线程B收到了线程A发来的消息,并进行处理, 在处理过程中,B也向线程A SendMessgae,然后等待从A返回。因为此时, 线程A正等待从线程B返回, 无法处理B发来的消息, 从而导致了线程A,B相互等待, 形成死锁。多个线程也可以形成环形死锁。可以使用 SendNotifyMessage或SendMessageTimeout来避免出现死锁。9 BroadcastSystemMessage 我们

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论