CFrameWnd

MFC教程 -- Windows界面开发 MFC教程 -- Windows界面开发 Windows消息机制 初步认识MFC 要想熟练掌握 Windows 应用程序的开发, 首先需要理解 Windows 平台下程序运行的内部机制。如果想要更好的学习掌握 MFC,必须要先了解Windows 程序的内部运行机制,为我们扫清学习路途中的第一个障碍,为进一步学习 MFC 程序打下基础。 1.1 基本概念解释 我们在编写标准C程序的时候,经常会调用各种库函数来辅助完成某些功能:初学者使用得最多的C库函数就是printf了,这些库函数是由你所使用的编 阅读详情
 

CFrameWnd类往往用于创建应用程序的主窗口,因为它能很好地支持系统菜单和控制条(工具条、状态条等),为此定义了大量的成员函数和变量。在编写文档/视图结构的应用程序时,CFrameWnd作为主窗口管理视图和文档对象。视图对象和控制条都成为CFrameWnd的子窗口,它们分享客户区,其位置被CFrameWnd有效地排列。 CFrameWnd直接支持单文档界面(SDI),对于多文档界面(MDI),使用其派生类CMDIFrameWnd和CMDIChildWnd。

目录

CFrameWnd的创建
管理视图对象
管理控制条
分发命令消息
必要的消息处理
CFrameWnd类成员

CFrameWnd的创建

  该类定义了两个成员函数用于创建主窗口,即Create()和LoadFrame()。前者主要通过CWnd::CreateEx()创建窗口;而后者首先组织参数,再调用前者。它们的定义如下:
  BOOL CFrameWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, LPCTSTR lpszMenuName, DWORD dwExStyle, CCreateContext* pContext)
  {
  /*可见,参数列表与CWnd::Create()稍有不同。因为目的是创建主窗口,所以第6个参数要求菜单资源名*/
  HMENU hMenu = NULL;
  if (lpszMenuName != NULL)
  {
  //搜索包含该菜单资源的实例(当前进程或者按进行装入的DLL)
  HINSTANCE hInst = AfxFindResourceHandl(lpszMenuName, RT_MENU);
  //装入菜单资源
  if ((hMenu = ::LoadMenu(hInst, lpszMenuName)) == NULL)
  {
  TRACE0(“Warning: failed to load menu for CFrameWnd.\n”);
  PostNcDestroy(); //perhaps delete to C++ object
  return FALSE;
  }
  }
  m_strTitle = lpszWindowName; //存储窗口标题,以备后用(如刷新显示)
  // 调用CWnd::CreateEx()
  if (!CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, rect.left, rect.top, rect.right – rect.left, rect,bottom – rect.top, pParentWnd->GetSafeHwnd(), hMenu, (LPVOID)pContext))
  {
  if (hMenu != NULL)
  DestroyMenu(hMenu); //如果创建失败,释放菜单资源
  return FALSE;
  }
  return TRUE;
  }
  BOOL CFrameWnd::LoadFrame(UNIT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext)
  {
  /*主窗口的菜单、图标、加速键、及标题都以nIDResource标识。除创建窗口外,还要做许多工作,如设置帮助上下文ID、装入加速键、初始化子窗口。所以在文档/视图框架程序中,总是使用LoadFrame()创建主窗口。*/
  ASSERT_VALID_IDR(nIDResource);
  ASSERT(m_nIDHelp == 0 || m_nIDHelp == nIDResource);
  m_nIDHelp = nIDResource; // ID for help context (+HID_BASE_RESOURCE)
  CString strFullString;
  if (strFullString.LoadString(nIDResource))
  AfxEXtractSubString(m_strTitle, strFullString, 0); //取得窗口标题
  VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
  //装入图标,注册窗口类
  LPCTSTR lpszClass = GetIconWndClass(dwDefaultStyle, nIDResource);
  LPCTSTR lpszTitle = m_strTitle;
  //调用CFrameWnd::Create()
  if (!Create(lpszClass, lpszTitle, dwDefaultStyle, rectDefault, pParentWnd, MAKEINTRESOURCE(nIDResource), 0L, pContext))
  return FALSE;
  //存储菜单句柄
  ASSERT(m_hWnd != NULL);
  m_hMenuDefault = ::GetMenu(m_hWnd);
  //装入加速键
  LoadAccelTable(MAKEINTRESOURCE(nIDResource));
  if (pContext == NULL) //初始化子窗口
  SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);
  return TRUE;
  }
  由于LoadFrame()的形能简洁,在创建窗口的同时,完成许多主窗体的初始化工作。所以,如果以CFrameWnd为程序主窗体,一般通过LoadFrame()创建。如果要使用CFrameWnd 创建简单化的主窗体或子窗体,可调用Create()。
  在文档视图支持的SDI程序中,主框架窗是在文档模板中应用CDocTemplate::CreateNewFrame()创建的。在该函数中,首先动态创建CFrameWnd对象,再调用对象的LoadFrame()成员。由于在CFrameWnd::PostNcDestroy()中清除了当前对象,所以尽管CFrameWnd对象惯于在堆中构造,却不必关心它的释放。例如:
  void CFrameWnd::PostNcDestroy()
  {
  delete this;
  }
  另外,因为CFrameWnd创建了主窗口,所以在窗口销毁时,要向消息循环发送WM_QUIT消息,这个处理已封装在基类CWnd中。

管理视图对象

  其实,视图无非是主框架窗口的一个ID为AFX_IDW_PANE_FIRST,带有边框的子窗口,这个主框架窗口是由CFrameWnd类封装并创建的。显然,视图作为其子窗口,也是由CFrameWnd创建的。成员函数CFrameWnd::OnCreateClient()用于创建视图窗口,它是该类的WM_CREATE消息处理函数中被调用的。代码如下:
  BOOL CFrameWnd::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext)
  {
  /*pContext->m_pNewViewClass存储视图的运动时类信息的指针(CRuntimeClass*),可用于动态创建视图*/
  if (pContext != NULL && pContext->m_pNewViewClass != NULL)
  {
  //调用CFrameWnd::CreateView()创建视图
  if (CreateView(pContext, AFX_IDW_PANE_FIRST) == NULL)
  return FALSE;
  }
  return TRUE;
  }
  CWnd* CFrameWnd::CreateView(CCreateContext* pContext, UINT nID)
  {
  ASSERT(m_hWnd != NULL);
  ASSERT(::IsWindow(m_hWnd));
  ASSERT(pContext != NULL);
  ASSERT(pContext->m_pNewViewClass != NULL);
  //应用运行类信息,动态创建视图对象
  CWnd* pView = (CWnd*)pContext->m_pNewViewClass->CreateObject();
  if (pView == NULL)
  {
  TRACE1(“Warning: Dynamic create of view type %hs failed.\n”, pContext->m_pNewViewClass->m_lpszClassName);
  return NULL;
  }
  ASSERT_KINDOF(CWnd, pView);
  //使用已经创建的视图对象创建视图窗口
  if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, nID, pContext))
  {
  TRACE0(“Warning: could not create view for frame.\n”);
  return NULL; //can’t continue without a view
  }
  //根据视图窗口的边界风格调整框架窗口风格
  if (afxData.bWin4 && (pView->GetExStyle() & WS_EX_CLIENTEDGE))
  {
  //如果视图已经设置了凹陷边框,去除主窗口的凹陷边框
  ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED);
  }
  return pView;
  }
  一个主窗口可能包含多个视图,它们或者是通过CSpliterWnd在客户区拆分创建的,或者是直接在客户区以子窗口形式创建。框架规定只能有一个活动视图,如果不使用拆分,同时只能显示一个视图。在主框架窗口创建后(视图也已创建),一般要调用CFrameWnd::InitialUpdateFrame()进行初始化,该函数首先设置第一视图(ID为AFX_IDW_PANE_FIRST)为活动视图,然后向所有视图发送初始化消息,确保每个视图CView::OnInitialUpdate()被调用。
  可以调用CFrameWnd::SetActiveView()及CFrameWnd::GetActiveView()设置或取得活动视图。在设置活动视图后,应该将活动视的ID切换为AFX_IDW_PANE_FIRST,因为有些操作是只针对第一视图的。例如,只有第一视图才能与控制条争夺主窗口客户区的空间,所以其他视图无法在主框架窗口中正常显示(如果不使用拆分)。

管理控制条

  主框架窗口的直观特点是被丰富的控制条装饰的,如工具条、状态条等,它们都派生于基类CControlBar。当鼠标移到工具条或某菜单项区域时,相应的提示信息会在状态栏显示或以Tip形式弹出;没有建立消息映射的命令会自动禁止;客户区发生变化时视图和控制条会自动排列。这一切都是CFrameWnd封装的功能。下面列举几个重要的控制条操作函数。
  EnableDocking(): 允许控制条在自己的客户区依靠。
  DockControlBar(): 将控制条依靠在客户区周边。
  FloatControlBar(): 将控制条浮动在屏幕上,而不是依靠在客户区。
  ShowControlBar(): 显示或隐藏控制条。
  SaveBarState(): 将所有控制条的状态存入初始化文件或注册表。
  LoadBarState(): 从初始化文件或注册表中恢复所有控制条状态。
  GetDockState(): 将控制条状态信息存入一个CDockState对象。
  SetDockState(): 从一个CDockState对象中恢复控制条状态。
  SetMessageText(): 在状态栏的第一个面板区域显示一个信息串。
  ReclcLayout(): 虚函数,当控制条位置变化或客户区尺寸变化时被调用,重新设置视图及控制条在客户区的位置。可根据需要重载它或主动调用它。

分发命令消息

  命令消息是指菜单、工具栏、加速键及命令按钮向其所在窗口发送的WM_COMMAND消息。主框架窗口通常包含应用程序的系统主菜单和工具栏,而加速键往往在LoadFrame()中装入主窗口,它们都要向主窗口发送命令消息。
  命令消息与窗口消息(除WM_COMMAND之外,前缀是WM_的消息)不同,窗口消息与某一窗口(句柄)紧密相关,应该由接收消息的窗口来处理;而命令消息往往与具体的窗口无关,只是为本程序完成一个功能操作。主框架窗口的系统菜单(工具按钮)尤其如此,某一个主菜单命令在其他窗口中(如视图)或在其他模块中(如文档)处理也许更合理。为了解决这个矛盾,CFrameWnd实现了分发命令消息的机制,它能够将本窗口收到的命令消息分发给视图、文档和应用类。
  CCmdTarget类定义了一个OnCmdMsg()虚拟函数,用于处理命令消息,派生类可以重载它,实现自己的命令消息处理方式。是的,CFrameWnd的命令消息分发机制就是通过重载这个函数实现的。该函数的代码如下:
  BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
  {
  CPushRoutingFrame push(this);
  //首先将命令消息传给活动视图
  CView* pView = GetActiveView();
  //如果袖图没有处理,它将传送命令消息给关联的文档对象
  if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE; //视图或文档已经处理该命令,返回
  //视图或文档没有处理该消息,即没有建立该命令的消息映射,下面由主窗口本身处理
  if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE; //主窗口已处理
  //主窗口没有处理,最后尝试应用类
  CWinApp* pApp = AfxGetApp();
  if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  return TRUE;
  return FALSE; //最终没有处理该命令消息,返回false,该消息由默认过程处理
  }
  最后,读者要注意这样一个事实:主窗口直接调用视图(间接调用文档)、应用类的OnCmdMsg()虚函数处理命令消息,并没有通过SendMessage()或PostMessage()将命令消息转发。而OnCmdMsg()仅在类中搜索消息映射表,查找该命令的处理函数,找不到则返回false。所以视图类只有通过消息映射,才能处理主窗口转发的命令消息,如果使用CView::WindowProc()捕捉该类消息,会一无所获。

必要的消息处理

  为了管理控制条和视图,CFrameWnd为几个窗口消息建立了消息映射,专门进行处理。
  OnInitMenuPopup(): 处理WM_INITMENUPOPUP消息,设置弹出菜单的各项目的启用/禁止状态。
  OnEnterIdle(): 处理WM_ENTERIDLE消息,设置状态条的空闲时提示信息。
  OnMenuSelect(): 处理WM_MENUSELECT消息,当某菜单项被选择时更新状态条提示。
  OnToolTipText(): 处理TTN_NEEDTEXT通知消息,显示工具条的工具提示。
  OnUpdateKeyIndicator(): 更新状态条的键盘状态指示器信息。
  OnUpdateControlBarMenu(): 更新控制条的启用/禁止状态,如工具条按钮。
  OnSize(): 处理WM_SIZE消息,调用RecalcLayout()排列客户区控件及视图。
  OnHScroll(): 处理WM_HSCROLL消息,滚动视图。
  OnVScroll(): 处理WM_VSCROLL消息,滚动视图。
  OnClose(): 处理WM_CLOSE消息,存储并关闭文档。

CFrameWnd类成员

  数据成员
  
m_bAutoMenuEnable自动控制使菜单项目可用或无效
rectDefault当构造一个CFrameWnd对象时传递此静态CRect作为参数,使Windows选择窗体的初始大小和位置
  构造函数
  
CFrameWnd构造一个CFrameWnd对象
  初始化
  
Create调用以构造和初始化一个与CFrameWnd对象有关的Windows框架窗口
LoadFrame调用以从资源信息中动态构造一个框架窗口
LoadAccelTable装入一个加速器表格
LoadBarState复位控件条设置
SaveBarState存储控件条设置
ShowControlBar显示控件条
SetDockState在主窗口中停靠框架窗口
GetDockState获取框架窗口的停靠状态
  操作
  
ActivateFrame使框架对用户可视并可用
InitialUpdateFrame在调用的框架窗中使OnInitialUpdate成员函数属于所有视图
GetActiveFrame返回活动CFrameWnd对象
SetActiveView设置活动CView对象
GetActiveView返回活动CView对象
CreateView在框架中构造一个非CView派生的视图
GetActiveDocument返回活动CDowment对象
GetControlBar返回控件条
GetMessageString获得与命令ID相符的消息
IsTracking确定分隔条是否正在移动
SetMessageText设置标准状态条的文本
EnableDocking允许一个控件条停靠
DockControlBar停靠一个控件条
FloatControlBar浮动一个控件条
BeginModalState将框架窗口设置为模态
EndModalState结束框架窗口的模态状态,用BeginModalState使无效的窗口可用
InModalState返回一个表明框架窗口是否处于模态状态
ShowOwnedWindows显示所有CFrameWnd对象的后代窗口
RecalcLayout重新设置CFrameWnd对象的控件条的位置
  可重载函数
  
OnCreateClient为框架构造一个用户窗口
OnSetPreviewMode设置应用的主框架成为或退出预打印模式
GetMessageBar返回一个属于框架窗口的状态条指针
NegotiateBorderSpace调整框架窗口中的边框空白
  命令处理
  
OnContextHelp处理相应项的SHIFT+F1帮助
站长统计
CFrameWnd::GetActiveView函数点滴        我用vc6的生成向导生成了一个不使用document/view结构的运用程序。        仔细看了一下他的结构,发现了一个函数如下(摘自mfc源代码):BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo){ // let the view hav 阅读详情

相关推荐

深入了解MFC类库:从基础到高级

本文还有配套的精品资源,点击获取 简介:MFC(Microsoft Foundation Classes)是微软开发的C++类库,用于简化Windows应用程序开发,提供了面向对象的接口。本教程详细解析了MFC的结构、核心类、消息映射机制、数据库和网络编程支持、DLL使用、资源管理以及国际化与本地化等多个方面。学习MFC可以大幅提升Windows平台下C++桌面应用程序的开...

weixin_36369848的博客 1467

【MFC】CFrameWnd类详解

00. 目录 文章目录00. 目录01. 概述02. 数据成员03. 成员方法04. 命令处理05. 附录 01. 概述 CFrameWnd类提供Windows单文档界面重叠或弹出式框架窗口,以及管理窗口的成员。 CObject └CCmdTarget └CWnd └CFrameWnd 要为应用构造有用的框架窗口,可从CFrameWnd中派生类。向派生类加入成员变量,以便存储指定给应用的数据。在派生类中实现消息处理成员函数和消息映射,指定当消息指向窗口时的动作。 用Cre

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 3402

告别TwinCAT:手把手教你用IgH EtherCAT Master在LinuxCNC上搭建实时运动控制平台

本文详细介绍了如何利用IgH EtherCAT Master和LinuxCNC搭建开源实时运动控制平台,替代商业软件TwinCAT。通过分步指南,包括实时Linux环境配置、EtherCAT主站安装、LinuxCNC集成及多轴同步控制实现,帮助开发者构建高性能、低成本的工业自动化解决方案。

weixin_42641741的博客 401

打怪升级之CFrameWnd类

CFrame的一些事

Blanchet的博客 438

给宇树Go2机器人装‘眼睛’:在Jetson Orin Nano上从零部署YOLOv5的保姆级避坑实录

本文详细介绍了在Jetson Orin Nano上为宇树Go2机器人部署YOLOv5视觉系统的完整流程,涵盖硬件选型、环境配置、模型优化及系统集成等关键步骤。针对机器人应用场景特有的离线部署、版本冲突和实时推理等挑战,提供了实用的解决方案和性能优化技巧,帮助开发者快速实现机器人的视觉能力升级。

weixin_29169505的博客 378

c++多线程(1)------创建和管理线程td::thread

std::thread 是 C++11 标准库中用于创建和管理线程的核心类,定义在 <thread> 头文件中。它使得多线程编程变得简单、类型安全且跨平台。

jndingxin的专栏 647

CFrameWnd创建要在堆上

问题描述 最近写一个程序,在主界面中弹出一个窗口,就想当然的想从CFrameWnd下继承一个新类,然后将此类的对象作为一个成员变量放在主界面窗口类中。这个从CFrameWnd继承来的窗口可以正常显示,但是一旦关闭此窗口,就报以下错误了: 问题分析 MSDN明确指出了,CFrameWnd要创建在堆上: Before you call either Create or LoadFrame, you...

憧憬,思考,奋斗,飞翔 409

大众奥迪诊断不求人:手把手解析SAE J2819(CAN TP2.0)协议报文与连接流程

本文深入解析大众奥迪车型诊断核心标准SAE J2819(CAN TP2.0)协议,详细拆解连接建立流程与报文控制字段。通过实战案例展示通道设置、参数协商等关键步骤,提供诊断设备配置建议和常见故障排查技巧,帮助工程师掌握汽车诊断通信协议的精髓。

weixin_30421809的博客 396

MFC之CFrameWnd类的探索

CFrameWnd::Create(.....) BOOL CFrameWnd::Create(LPCTSTR lpszClassName,    // 应用程序类名 LPCTSTR lpszWindowName,   // 应用程序窗口名 DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, LPCTSTR lps

1729

【四旋翼】pixhawk2.4.8-地面站配置-APM固件-四旋翼从装机到试飞

因为MP版本和APM版本的适配问题,真的真的是很大一个坑。最好先走别人走过的路,走通了再去自由发挥,不然白白浪费时间。下面提供我试飞成功过的版本。下面提供任意版本固件和地面站的下载方法。

xifan的博客 3万+

32、高光谱遥感技术在军事领域的应用解析

高光谱遥感技术凭借其高分辨率和精细光谱分析能力,在军事领域广泛应用于战场详细侦察、伪装目标识别及目标实际温度与发射率的检测,显著提升了目标识别精度和作战支持能力。同时,该技术在内陆水体成分反演、海洋环境监测和农业管理等领域也展现出巨大潜力。尽管面临数据量大、处理复杂、技术融合不足和仪器性能限制等挑战,未来通过人工智能融合、高效算法研发和先进仪器开发,高光谱遥感技术将在多领域实现更深入应用与发展。

blue的专栏 229

cframewnd oncreatecontrol

https://www.google.com.hk/#newwindow=1&q=cframewnd+oncreatecontrol&safe=strict http://searchcode.com/codesearch/view/17132102 http://venus-gui.googlecode.com/svn-history/r9/trunk/Code/Tools/VEdito

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1300

Allegro23.1新功能之软件自带阻抗计算工具操作指导

Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。

weixin_54787054的博客 782

CFrameWnd::ActivateFrame小解

(1) 中文MSDN CFrameWnd::ActivateFrame virtual void ActivateFrame (int nCmdShow = -1); 参数: nCmdShow 指定传递到CWnd::ShowWindow的参数,缺省时

fangfang的专栏 4327

Python 爬虫实战:拼多多商品评论情感分析(含词云生成与差评预警)

在电商行业竞争日益激烈的当下,商家对商品评论的分析需求愈发迫切。通过 Python 爬虫收集拼多多商品评论,并结合情感分析、词云可视化及差评预警技术,商家可精准洞察消费者反馈,优化商品与服务。本文将深度剖析从爬虫搭建到数据挖掘的关键环节,助力读者构建全流程电商评论分析系统。

yansideyucsdn的博客 1450

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MFC简单框架启动流程(CWinApp,CFrameWnd)

先看下例子代码 #include class CMyFrameWnd : public CFrameWnd { public: CMyFrameWnd(); virtual ~CMyFrameWnd(); // DECLARE_DYNCREATE(CMyFrameWnd) DECLARE_MESSAGE_MAP() protected: afx_msg voi

阿凡的专栏 6772

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

CFrameWnd的两个函数

CFrameWnd::SetMessageText void SetMessageText(LPCTSTR lpszText); void SetMessageText(UINT nID); 参数: lpszText 指向将被设置到状态条的字符串。 nID 将被设置到状态条上的字符串资源的ID。 说明: 调用此成员函数将一个字符串放在I

GyafdxIs的专栏 701

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

CFrameWnd - MSDN6翻译交流

BUG和建议请提出,谢谢!CFrameWndThe CFrameWnd class provides the functionality of a Windows single document interface (SDI) overlapped or pop-up frame window, along with members for managing the window.

CaiKanXP的专栏 1960

CFrameWnd delete 出错 ,create后的陷阱

int CDlgTest::OnCreate(LPCREATESTRUCT lpCreateStruct) { m_pFrameWnd = new CFrameWnd(); m_pFrameWnd->Create(strMyClass, "", WS_CHILD, CRect(0, 0, 300, 300), this); } 我们习惯性创建了就去对话框的析构函数里delete,但是MFC关闭对话框会报异常,原因是关闭对话框时会触发PostNcDestroy虚函数,del...

tajon1226的专栏 566

CFrameWnd::RecalcLayout 函数详解

CFrameWnd::RecalcLayout 函数详解:Called by the framework when the standard control bars are toggled on or off or when the frame window is resized.当标准工具栏或状态栏隐藏或者显示,或者窗口调整大小时,框架调用这个方法。方法原型为: virtual v

1121

MFC基础窗口创建,CWinApp、CFrameWnd

1、CWinApp(包括了这个类的导出类):代表了我们的程序。封装了消息循环等。 2、CFrameWnd:代表了程序的框架窗口。封装了窗口的注册、创建、显示、刷新、等等窗口操作。 3、Win32中、一个窗口:注册->显示->信息循环。 4、CFrameWnd类来做窗口。   4.1、   //创建一个代表框架窗口的类对象 CFrameWnd *pFrame = ...

weixin_30546933的博客 463

MFC中CFrameWnd::GetActiveView函数的使用

被一个小bug卡了很长时间,走了很多弯路。应该先查MSDN的。我的错误在于不知道“在MDI应用程序中,MDI主框架窗口没有一个关联的视图。 相反,每个单独的子窗口(CMDIChildWnd)具有一个或多个关联的视图。” 见http://technet.microsoft.com/zh-cn/exchange/zs0t7t34(v=VS.80) CFrameWnd::GetAct

黄金之心 2803

CFrameWnd::RecalcLayout

1.  说明 : virtual void RecalcLayout( BOOL bNotify = TRUE ); Called by the framework when the standard control bars are toggled on or off or when the frame window is resized. ==&gt;  当标准控制条打开或关闭或框架窗口...

u010096608的博客 718

CFrameWnd中的PreCreateWIndow虚函数探索

BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs) { if (cs.lpszClass == NULL) {     // AfxDeferRegisterClass 注册类,注册的是一个已经创建好的类 VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)); cs.lpszClass

463

MFC的CFrameWnd::OnCmdMsg消息链路

首先是视图类,其次是窗口类,然后是应用程序类。下面的源码为证。 BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,  AFX_CMDHANDLERINFO* pHandlerInfo) {  CPushRoutingFrame push(this);  // pump through current view F

jadeshu的博客 1304
上一篇: CSingleDocTemplate
下一篇: 消息循环
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值