zoukankan      html  css  js  c++  java
  • MFC一些常见面试问题

    1)说说mfc中的类继承图的基本框架,
    2)说说CView类的子类都有什么。
    3)DLL的三种调用形式。
    4)说说onpaint()和ondraw()的关系。
    5)说说CView类与CDocument的关系(重要)。
    6)说SendMessage()与PostMessage()的区别。
    7)简述COM技术。
    8)说说读写一个文件怎么来完成,分别用c,c++,MFC三种库函数来编写代码。
    9)说说二进制文件和文本文件之间区别,举例子,会吗?
    10).net的技术优点是何?
     
    说说onpaint()和ondraw()的关系
    问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同?
    答:OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。
    至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows会发送两个消息WM_PAINT(通知客户区 有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或 OnPaint()来重画窗口。
     
    OnDraw()和OnPaint()有什么区别呢?首先:我们先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有 OnDraw没有OnPaint的原因。
     
    其次,要想在屏幕上绘图或显示图形,首先需要建立设备环境DC。其实DC是一个数据结构,它包含输 出设备(不单指你17寸的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。MFC提供了CPaintDC类和CWindwoDC类来实时的响 应,而CPaintDC支持重画。
     
    当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它。该视图的 OnPaint 处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint 处理成员函数。
     
    ///CView默认的标准的重画函数
     
    void CView::OnPaint()
        CPaintDC dc(this);
        OnPreparDC(&dc);
        OnDraw(&dc); //调用了OnDraw
    }
     
     
    既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序
     
    ///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。
    void CMyView::OnDraw( CDC* pDC )
        CMyDoc* pDoc = GetDocument(); 
        CString s = pDoc->GetData(); // Returns a CString
        CRect rect;
        GetClientRect( &rect ); 
        pDC->SetTextAlign( TA_BASELINE | TA_CENTER ); 
        pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );
    }
    最后:现在大家明白这哥俩之间的关系了吧。因此我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到目的并且没有问题,怎么干都成。
     
    补充:我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口
      
     
    PostMessage和SendMessage的区别
     
    1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。
    2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。 如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。
    3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail. 如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。 最好不要用PostMessage发送带有指针参数的消息。

     MFC的类层次(

    )

    MFC(微软基础类)也是一种应用程序框架,定义了应用程序的一般处理流程,用于对Windows API实现基于面向对象技术的封装,隐藏在Windows下使用C++编程的大量内部细节。在开发应用程序的过程中,编程人员可以通过对类库中已有类的继承,生成功能更加强大的类库以供自己所用。

    在MFC中类的层次结构(即继承关系)如图5-3所示。

     
    图5-3  MFC中类的层次结构

    从图中可知,在MFC中大多数的类都派生于CObject类,它的主要作用是为子类提供一些基本的功能,这些派生类构成了MFC应用程序的基本框架,它们各自的功能描述如表5-1所示。

    派生类

    功能描述

    CCmdTarget

    用于处理用户请求

    CWinThread

    代表应用程序内部的执行线程

    CWinApp

    应用程序的核心

    CWnd

    为所有的窗口类提供基本的功能,处理常见的系统消息

    CView

    用于显示数据并与文档对象进行交互

    CFrameWnd

    应用程序的主框架

    CDocument

    包含应用程序的数据集

    下面将对上述表中各个类的功能进行具体的讲解。

    1)CCmdTarget类

    CCmdTarget类是MFC的消息映射基础类,MFC为该类设计了许多的成员变量及函数以解决消息映射的问题。派生于CCmdTarget的类可用于处理当用户选择菜单或单击按钮等操作时所产生的Command消息。

    在实际的开发过程中,我们通常很少直接从CCmdTarget中派生类。当想要生成一个处理按键消息的类时,只需从继承于CCmdTarget类的框架子类CView、CWinApp、CDocument、CWnd和CFrameWnd中选择一个来充当父类即可。

    2)CWinThread类

    CWinThread类是MFC中用于封装线程的类,它的成员函数可以使MFC应用程序创建和管理包括UI及工作者在内的线程。每个MFC应用程序都至少应该使用一个从CWinThread派生的类,应用程序类CWinApp就是一个代表。

    3)CWinApp类

    CWinApp类通常代表应用程序自己,它封装了应用程序的初始化、运行及终止的过程。基于框架的应用程序必须有且仅有一个派生于CWinApp的类的对象,并在完成窗口的创建工作之前执行对该对象的构造。

    应用程序类的对象需要完成以下工作。

    初始化应用程序。

    建立文档模板结构。

    循环检索消息队列中的消息并将这些消息发送到指定的地方。

    执行应用程序退出时的清理工作。

    4)CDocument类

    CDocument类是在使用文档/视图结构的应用程序中文档对象的基类,它为应用程序的文档对象提供了基本的功能,包括新建、串行化数据等。

    5)CWnd类

    CWnd类是所有MFC 窗口的基类,它封装了窗口的基本操作,包括窗口的创建、销毁、设置窗口风格等,以及窗口对大部分消息的默认响应。开发人员可以直接从CWnd派生其他类,但通常情况下我们并不这么做,而是通过继承CWnd的派生类生成新类。

    6)CFrameWnd类

    CFrameWnd类往往用于创建应用程序的主窗口,并定义了大量管理视图和文档对象的成员函数及变量。在编写文档/视图结构的应用程序时,视图对象等将作为CFrameWnd的子窗口实现对客户区的共享,并被CFrameWnd有序排列。

    7)CView类

    CView类是在使用文档/视图结构的应用程序中视图对象的基类,它是用户的主要操作界面。在应用程序中,一个视图对象通常只对应一个文档对象,但一个文档对象却可以关联多个视图对象,并且每个视图对象都以不同的形式来显示文档中的数据。

    在上述CObject类的派生类中,CWinApp类、CDocument类、 CCmdTarget类及CWinThread类构成了应用程序的结构类,代表了应用程序的基本结构元素。换句话说,当一个应用程序开始运行时,这些类将最先实现初始化。

    在类的层次结构中,应用程序类CWinApp是一个基于MFC应用程序的最外层对象容器,它不仅拥有诸如实例句柄等需要被传送到WinMain()函数中去的参数,还包含了应用程序的主框架窗口,当主框架窗口被关闭时,应用程序也就跟着结束了。因此,开发人员必须为程序创建一个全局的应用程序对象。

  • 相关阅读:
    JS表格测试
    2018电脑选购配置
    一句话技巧总结
    我的码风
    友情链接
    写代码时需要注意的一些东西
    他是 ISIJ 第四名,也是在线知名题库的洛谷“网红”
    从并查集的按秩合并看一类构造性问题
    高一上期末考游记
    P3233 [HNOI2014]世界树
  • 原文地址:https://www.cnblogs.com/samulescollection/p/3077566.html
Copyright © 2011-2022 走看看