MFC面试高频题库及详细答案(职场实战版)_第1页
MFC面试高频题库及详细答案(职场实战版)_第2页
MFC面试高频题库及详细答案(职场实战版)_第3页
MFC面试高频题库及详细答案(职场实战版)_第4页
MFC面试高频题库及详细答案(职场实战版)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

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

文档简介

MFC面试高频题库及详细答案(职场实战版)一、MFC基础概念类(入门高频)1、什么是MFC?MFC的核心作用是什么?答案:MFC是微软提供的C++类库,封装了Windows原生的API、窗口机制、消息循环、资源管理等底层操作。原生Windows编程需要手动编写大量繁琐的API代码,比如窗口注册、消息处理、内存释放、控件绘制等,MFC把这些功能封装成面向对象的类,大幅简化Windows桌面程序开发。同时保留了Windows编程的原生逻辑,兼顾开发效率和程序稳定性,是传统PC客户端开发的主流框架。2、MFC的核心架构是什么?答案:MFC核心是文档/视图架构(Doc/View)和消息映射机制,同时基于C++继承体系搭建。核心四大类:CWinApp:应用程序主类,管理程序启动、消息循环、程序入口CFrameWnd:框架窗口类,负责程序主窗口、菜单栏、工具栏承载CDocument:文档类,专门负责数据存储、数据读写、业务数据处理CView:视图类,负责数据显示、界面绘制、用户交互操作简单来说:文档存数据,视图显界面,框架搭窗口,应用管全局。3、MFC程序的执行流程是怎样的?答案:整体流程固定,也是面试必背流程:程序启动,全局CWinApp对象初始化(唯一全局实例)执行InitInstance()函数,初始化程序实例、注册窗口、创建主窗口创建框架窗口、文档、视图,加载菜单、图标等资源进入Run()消息循环,不断抓取系统消息、分发消息窗口通过消息映射处理鼠标、键盘、绘制等用户操作程序退出时,自动执行析构函数,释放资源、关闭消息循环4、InitInstance()和InitApplication()的区别?答案:InitApplication():早期MFC版本函数,只在程序第一次启动执行,多用于初始化程序全局配置、注册表信息,现在基本很少重写。InitInstance():每启动一个程序实例都会执行,是核心初始化函数。我们创建窗口、加载资源、初始化全局变量、单例限制都写在这里,是开发中最常用的初始化接口。二、消息机制核心考点(MFC重中之重)1、MFC消息的分类有哪些?答案:主要分为三类,职场开发常用:命令消息:以WM_COMMAND开头,菜单、按钮、工具栏点击都会触发,可被窗口、视图、文档、应用类接收处理。通知消息:控件专属消息,比如BN_CLICKED(按钮点击)、EN_CHANGE(编辑框内容改变),用于子控件向父窗口反馈操作状态。2、什么是消息映射?MFC为什么要用消息映射?答案:消息映射是MFC通过宏定义(BEGIN_MESSAGE_MAP、END_MESSAGE_MAP),将Windows消息和自定义的消息处理函数绑定的机制。原生C++如果用虚函数处理所有窗口消息,需要定义上百个虚函数,冗余极大、效率极低。MFC通过消息映射表,只绑定需要用到的消息函数,不需要的消息直接走默认处理,极大精简代码、提升执行效率,也是MFC区别于原生Win32的核心优势。3、消息的传递顺序是怎样的?答案:命令消息传递优先级:视图类>文档类>框架窗口类>应用程序类普通窗口消息只会由当前窗口自身处理,不会向上传递。只有菜单、按钮这类命令消息会按照上述顺序逐级传递,直到找到对应的处理函数,没有处理则执行默认函数。4、PreTranslateMessage的作用是什么?答案:这是消息预处理函数,在消息分发到窗口处理函数之前执行。开发中常用场景:拦截按键消息、屏蔽快捷键、自定义键盘响应、过滤无效鼠标消息。比如禁止回车换行、屏蔽ESC关闭窗口、自定义快捷键等,都可以重写这个函数实现。返回true表示拦截消息,false表示放行。三、GDI绘图与界面绘制1、MFC中DC是什么?常用的DC类有哪些?答案:DC是设备上下文,是Windows绘图的核心载体,所有画线、画图、写字、填充颜色的操作都必须依托DC完成。MFC常用DC类:CClientDC:客户区DC,不用手动释放,作用于窗口客户区,适合临时绘图CWindowDC:整个窗口DC,包含标题栏、边框,可绘制非客户区CMemDC:内存DC,用于双缓冲绘图,解决界面闪烁问题2、界面闪烁的原因及MFC解决办法?答案:闪烁原因:窗口刷新时,系统先清空背景,再重新绘制界面,清空和绘制的间隔会造成肉眼可见的闪烁;频繁刷新、绘制内容过多也会加重闪烁。解决方法(职场常用):重写OnEraseBkgnd函数,直接返回true,禁止系统自动擦除背景使用双缓冲绘图:先在内存DC中绘制所有内容,一次性贴到窗口DC减少无效刷新,精准控制Invalidate刷新区域3、OnPaint和OnDraw的区别?答案:OnDraw:视图类专属函数,基于Doc/View架构,专门用于业务数据绘图。可以接收打印、预览、界面绘制三种场景的DC,一套代码适配屏幕显示和打印功能。简单说:普通窗口绘图写OnPaint,视图数据绘图写OnDraw。四、控件与窗口核心问题1、模态对话框和非模态对话框的区别?答案:模态对话框(DoModal):弹出后阻塞父窗口,必须关闭当前对话框才能操作主界面。自带消息循环,无需手动创建和销毁,资源由MFC自动管理,适合弹窗提示、参数设置窗口。非模态对话框(Create):弹出后不阻塞父窗口,可同时操作主界面和弹窗。需要手动创建对象、手动调用ShowWindow显示、手动释放资源,多用于悬浮窗口、工具栏弹窗。2、MFC控件变量两种绑定方式的区别?答案:值变量(CString、int):绑定控件数据,通过UpdateData(TRUE)把控件内容赋值给变量,UpdateData(FALSE)把变量数据刷新到控件,只负责数据交互。控件变量(CEdit、CButton):绑定控件句柄,可直接调用控件的所有方法,比如设置字体、禁用控件、滚动显示、批量操作,自由度更高。3、Invalidate、UpdateWindow、Refresh的区别?答案:Refresh:自定义刷新方法,本质是封装了Invalidate+UpdateWindow,实现强制立即刷新。五、内存与资源、常见bug问题1、MFC中GDI资源泄漏的原因和规避方法?答案:泄漏原因:创建的画笔、画刷、字体、位图等GDI对象,选入DC后没有及时释放,反复创建会导致资源占用堆积,最终程序卡顿、闪退。规避方法:遵循选入即选出原则:新GDI对象选入DC后,必须保存旧对象,绘制完成后还原旧对象局部GDI对象在函数结束前手动DeleteObject释放优先使用栈对象,不要频繁new堆对象,减少手动释放压力2、MFC中CString的特点,会不会内存泄漏?答案:CString是MFC封装的字符串类,自带内存自动管理,栈上创建的CString无需手动释放,函数结束自动析构。正常使用不会泄漏,只有手动new出来不delete、或者跨线程异常导致析构失效时,才会出现内存泄漏。3、MFC单文档、多文档、对话框程序的区别?答案:对话框程序:无Doc/View架构,结构简单、开发快,适合小型工具、配置软件,是最常用的轻量化MFC程序。单文档(SDI):同一时间只能打开一个文档窗口,主框架固定,适合单一业务的客户端软件。多文档(MDI):可同时打开多个子窗口、多个文档,子窗口嵌套在主框架内,适合多文件编辑类软件。六、进阶面试高频题1、MFC线程分为哪两种?区别是什么?答案:MFC线程分为界面线程和工作线程。工作线程(CWinThread):无消息循环,专门处理耗时业务,比如文件读写、数据计算、网络通信,不能操作界面控件,否则会闪退崩溃。界面线程:自带消息循环,拥有独立窗口,可以独立处理界面交互、消息响应,适合多窗口独立运行的复杂程序。注意:子线程绝对不能直接操作UI,必须通过自定义消息发送到主线程,由主线程更新界面。2、MFC自定义消息的实现步骤?答案:标准四步,面试必答:头文件中定义自定义消息:#defineWM_USER_MSG(WM_USER+100)在窗口类头文件声明消息处理函数:afx_msgLRESULTOnUserMsg(WPARAMwParam,LPARAMlParam);在源文件消息映射表中绑定消息:ON_MESSAGE(WM_USER_MSG,OnUserMsg)实现消息处理函数,通过SendMessage/PostMessage发送消息补充:SendMessage同步阻塞,等待消息处理完成才返回;PostMessage异步投递,直接返回,不等待执行结果。3、MFC动态创建机制是什么?答案:MFC通过宏实现类的动态创建,核心是DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE两个宏。作用是让程序可以在运行时动态创建类对象,无需提前实例化,框架窗口、视图

温馨提示

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

最新文档

评论

0/150

提交评论