我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 允许重画 >

MFC中的几个常用类——CWnd - zhangyujsj的个人空间 - OSCHINA

归档日期:06-28       文本归类:允许重画      文章编辑:爱尚语录

  CWnd是MFC窗口类的基类,提供了微软基础类库中所有窗口类的基本功能。

  CWnd对象与Windows的窗口不同,但是两者有紧密联系。CWnd对象是由CWnd的构造函数析构函数创建或销毁的。另一方面,Windows的窗口是Windows的一种内部数据结构,它是由CWnd的Create成员函数创建的,而由CWnd的虚拟析构函数销毁。DestroyWindow函数销毁Windows的窗口,但是不销毁对象。

  CWnd类和消息映射机制隐藏了WndProc函数。接收到的Windows通知消息通过消息映射被自动发送到适当的CWnd OnMessage成员函数。你可以在派生类重载OnMessage成员函数以处理成员的特定消息。

  CWnd类同时还使你能够为应用程序创建Windows的子窗口。先从CWnd继承一个类,然后在派生类中加入成员变量以保存与你的应用程序有关的数据。在派生类中实现消息处理成员函数和消息映射,以指定当消息被发送到窗口时应该如何动作。

  你可以经过两个步骤来创建一个子窗口。首先,调用构造函数CWnd以创建一个CWnd对象,然后调用Create成员函数以创建子窗口并将它连接到CWnd对象。当用户关闭你的子窗口时,应销毁CWnd对象,或者调用DestroyWindow成员函数以清除窗口并销毁它的数据结构。

  窗口操作是Windows编程的核心内容,它派生于CCmdTarget类,是最基本的GUI对象。我们在屏幕上看到的一切对象都与窗口有关,它们或者派生于CWnd,属继承关系,如对话框、工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象的关系,如图标、菜单、显示设备。从CWnd派生的控件类,如CButton,可以被直接使用,也可以被进一步派生出其它类来。

  窗口类CWnd与Windows操作系统管理是显示(或隐藏)给用户的,作为应用程序的一种表现形式的窗口是两个概念。前者通过一个窗口句柄操作后者,不同的操作被封装为不同的成员函数。而后者,操作系统为其开辟了一个内存区,存储一个数据结构,进行管理。后者包括窗口风格、窗口类、当前状态等信息。其实我们可以理解为CWnd是MFC中所有组件对象的父类,GetDlgItem()可以通过组件的ID号得到组件对象的地址,这里是以父类指针CWnd*返回,如果需要使用可以强转,CWnd类封装的窗口操作主要包括窗口的创建和销毁、操作窗口风格、操作窗口状态、窗口子类化、获取指定窗口等。

  当给定一个窗口的句柄时,返回CWnd对象的指针。如果没有CWnd对象与这个句柄相连接,则创建一个临时的CWnd对象并与之相连接

  当给定一个窗口的句柄时,返回CWnd对象的指针。如果没有CWnd 对象与这个句柄相连接,则返回NULL

  CWinApp的空闲处理函数自动调用这个函数,清除由FromHandle创建的任何临时CWnd对象

  创建一个Windows的可重叠窗口、弹出窗口或子窗口,并把它连接到一个CWnd对象上

  为窗口(可以是任意子窗口,不仅是对话框中的控件)设置窗口ID或控件ID

  将一个Windows控件与CWnd对象连接,然后使它通过CWnd的消息映射转发消息

  像类型库中标记的那样,将调用对象的缺省的简单移动属性和与数据源控件相关的游标绑定在一起

  将一个游标移动属性与数据移动控件绑定在一起,然后在MFC的绑定管理器中注册这种联系

  获得游标的指针,该游标是通过数据源控件的DataSource、UserName、Password和SQL属性定义的

  返回这个窗口当前处理的消息的指针。只应该在OnMessage消息处理函数内部调用

  调用缺省的窗口过程,它提供了对应用程序没有处理的任何窗口消息的缺省处理

  在消息被发送到Windows函数TranslateMessage和DispatchMessage之前,CWinApp使用这个函数来过滤窗口消息

  将一条消息发送到窗口并尽快返回,返回的速度取决于该窗口是否是由调用线程所创建

  将CWnd加入一个窗口链,每当剪贴板的内容发生变化时,就会通知这些窗口

  打开剪贴板。其它应用程序将不能修改剪贴板,直到调用Windows的CloseClipboard函数

  调用缺省的窗口过程,它提供了对应用程序没有处理的任何窗口消息的缺省处理

  框架调用这个函数以通知父窗口,在它的一个控件发生了一个事件,或该控件需要消息

  当用户从控制菜单中选择命令,或者当用户选择了最大化或最小化按钮时,调用这个函数

  调用这个函数时使用调色板的所有窗口能够实现它们的逻辑调色板并更新它们的客户区

  由于调用了SetWindowPos函数或其它的窗口管理函数,因而窗口的大小、位置和次序将要发生变化时,就调用这个函数

  由于调用了SetWindowPos函数或其它的窗口管理函数,因而当窗口的大小、位置和次序发生了变化时,就调用这个函数

  当用户在注册为可以接收拖放文件的窗口上方释放鼠标左键时,这个函数就被调用

  当CWnd的大小和位置发生变化或者CWnd被激活时,就为多文档界面(MDI)的子窗口调用这个函数

  调用这个函数以通知应用程序的主窗口过程,模式对话框或菜单正在进入空闲状态

  每当Windows需要知道最大化的位置和大小,或者最小或最大跟踪尺寸时,就调用这个函数

  当CWnd被最小化(图标化),并且在画出图标之前,必须填充图标的背景时调用这个函数

  当用户按下一个菜单助记字符,但是不能与当前菜单中任何预定义的助记符相匹配时,就调用这个函数

  指明Windows的::SetWindowLong函数已经改变了一个或多个窗口风格

  指明Windows的::SetWindowLong函数将要改变一个或多个窗口风格

  当创建或销毁一个子窗口,或者当用户在子窗口上方点击了鼠标键时调用这个函数

  这个函数被具有LBS_WANTKEYBOARDINPUT风格的子列表框调用,用以响应WM_CHAR消息

  当一个自画子列表框或组合框中将被销毁时,或者从控件中删除项时调用这个函数

  当自画子按钮控件、组合框控件、列表框控件或菜单的可视部分需要被画出时调用这个函数

  在响应数据源控件引发的事件时调用,该事件是当与数据源控件绑定的控件修改或将要修改游标时产生的

  当控件被创建时为自画子组合框,列表框或菜单项调用这个函数。CWnd通知Windows该控件的大小

  当用户旋转鼠标轮时调用这个函数。使用WindowsNT4.0的消息处理

  当用户旋转鼠标轮的时候调用这个函数。使用Windows 95和Windows NT 3.51的消息处理

  如果CWnd中包含了光标,或者用SetCapture捕获了鼠标输入时,每当鼠标移动时,Windows调用这个函数

  当通过Windows的EmptyClipboard函数清空剪贴板时调用这个函数

  当剪贴板的拥有者要滚动剪贴板的图像、使适当的部分无效以及更新滚动条值的时候调用这个函数

  当拥有者要滚动剪贴板的图像、使适当的部分无效以及更新滚动条值的时候调用这个函数

  前面介绍了消息的默认处理函数Default(),该函数一般要调用一个默认的窗口过程,对当前消息执行默认的系统级处理。例如对于窗口的WM_LBUTTONDOWN消息,默认处理函数要为该窗口设置焦点。对于许多消息,执行这种默认的处理是完全必要的。这样,程序员只需在消息到来之际执行相关的用户级处理,对这些消息的系统级处理不必关心。所以,在一个消息处理函数中,如果允许当前消息正常执行,最终就应该调用默认处理函数Default()。例如,下面要控制一个CEdit控件的接收字符集,不允许输入0~9的数字,并将输入的小写字母转换为大写字母。程序如下:

  void CEditnew::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

  LPARAM lpara=nFlags16nRepCnt;

  SendMessage(WM_CHAR,(WPARAM)nChar,lpara);

  然而,在实际的编程中,很少直接调用Default(),更多是调用基类的消息处理函数。例如在上例中,以 CEdit::OnChar(nChar, nRepCnt, nFlags);

  代替Default()要更合理。因为针对大部分消息,CWnd类已经定义了相应的处理函数,封装对Default()的调用。例如,针对WM_CHAR消息的处理函数这样定义:

  void CWnd::OnChar(UINT, UINT, UINT)

  同时,对于一些特殊的消息,仅执行系统级的处理是不够的,框架必须针对消息完成一些例行的操作。例如,收到WM_SYSCOLORCHANGE消息后,要将系统颜色的变化通知所有子窗口;收到WM_NCDESTROY消息,要做必要的清理工作,并使MFC窗口对象与已经关闭的窗口分离。针对这些消息,CWnd类也定义了相应的处理函数,封装框架的例行处理。下面是针对WM_SYSCOLORCHANGE消息的处理函数。

  if (pApp != NULL && pApp-m_pMainWnd == this)

  if (AfxGetThread() != NULL && AfxGetThread()-m_pMainWnd == this)

  _AFX_CTL3D_STATE* pCtl3dState = _afxCtl3dState;

  if (pCtl3dState-m_pfnColorChange != NULL)

  (*pCtl3dState-m_pfnColorChange)();

  SendMessageToDescendants(WM_SYSCOLORCHANGE, 0, 0L, TRUE, TRUE);

  利用PreTranslateMessage,响应按钮控件的按下(WMLBUTTONDOWN)和松开(WMLBUTTONUP) VC的button控制只有两个事件,一个是单击事件,一个事双击事件。在这个方面VB就方便多了。但是我们有其...

  MFC(VC6.0)的CWnd及其子类中,有如下三个函数: 让人很不容易区分,不知道它们究竟干了些什么,在什么情况下要改写哪个函数? 想知道改写函数?让我先告诉你哪个不能改写,那就是SubclassWin...

  第六章 :MFC程序的生死因果 本章主要是从MFC程序代码中,找出一个windows程序原本该有的程序入口点、窗口类注册、窗口产生、消息循环、窗口函数等操作。抽丝剥茧彻底理解一个MFC程序的诞生与...

  在C++中重载new和delete操作符可以给程序带来更灵活的存储控制,对于游戏设计等对效率要求较高的应用而言是必不可少的。一般的C++书籍中也会介绍它们的应用和实现,然而在VC中实现却有几个必...

  第九章:消息映射与命令传递。 本章将会对MFC的消息映射和 命令传递机制做深入探讨。 MFC规定了消息传递的路线,消息会按照这个路线传递下去,找不到归宿的话就交给DefWindowProc。 在产生窗...

  亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示

本文链接:http://darwinsucks.com/yunxuzhonghua/103.html