MFC第二十八天 WM_SIZE应用,CFrameWnd类LoadFrame的方法,PreCreateWindow窗口预处理,Frame-view窗口视图

文章目录

  • WM_SIZE应用
    • 通过WM_SIZE消息实现窗口布局管理
    • 通过控件属性实现窗口布局管理
  • CFrameWnd类
    • CFrameWnd类简介
    • OnCreate和OnCreateClient的方法
    • 注册时的要素与窗口设置
    • PreCreateWindow创建窗口的预处理函数
  • 附录
    • 预处理函数的结构体
    • CFrameWnd::LoadFrame与CreateFrame

WM_SIZE应用

通过WM_SIZE消息实现窗口布局管理

// CApp 消息处理程序
BOOL CAboutDlg::OnInitDialog()
{CDialogEx::OnInitDialog();CRect rect, rc;GetClientRect(rect);m_ok.GetWindowRect(rc); //这个取得屏幕 全屏的坐标ScreenToClient(rc); // 转化为同一坐标系m_cxMargin = rect.right - rc.right;m_cyMargin = rect.bottom - rc.bottom;return TRUE;  
}
void CAboutDlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);if (m_ok){CRect rect;m_ok.GetWindowRect(rect);int x = cx - m_cxMargin - rect.Width();int y = cy - m_cyMargin - rect.Height();m_ok.SetWindowPos(NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);}
}

通过控件属性实现窗口布局管理

点击相应控件的属性,对其进行动态布局的设置,选择两者,窗口再次进行拉伸就会进行改变。

在这里插入图片描述

CFrameWnd类

CFrameWnd类简介

a)CFrameWnd类偏爱WM_CREATE,因为所有的内部窗口都是代码创建的。
而不像对话框是拖入的。
b)CFrameWnd::rectDefault管理层叠
static const CRect rectDefault;
c)LoadFrame内部包含CreateFrame,同时执行注册以及加载快捷键等(参见附录)

class CFrameWnd : public CWnd
{DECLARE_DYNCREATE(CFrameWnd)// Constructors
public:static AFX_DATA const CRect rectDefault;CFrameWnd();BOOL LoadAccelTable(LPCTSTR lpszResourceName);
//创建框架virtual BOOL Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD dwStyle = WS_OVERLAPPEDWINDOW,const RECT& rect = rectDefault,CWnd* pParentWnd = NULL,        // != NULL for popupsLPCTSTR lpszMenuName = NULL,DWORD dwExStyle = 0,CCreateContext* pContext = NULL);
// 加载框架 - load frame and associated resourcesvirtual BOOL LoadFrame(UINT nIDResource,DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,CWnd* pParentWnd = NULL,CCreateContext* pContext = NULL);// 创建中央视图 helper for view creationCWnd* CreateView(CCreateContext* pContext, UINT nID = AFX_IDW_PANE_FIRST);// 第十三章文档架构时获取激活文档virtual CDocument* GetActiveDocument();
//多文档架构获取激活视图 Active child view maintenanceCView* GetActiveView() const;           // active view or NULLvoid SetActiveView(CView* pViewNew, BOOL bNotify = TRUE);// active view or NULL, bNotify == FALSE if focus should not be set// 多文档架构的让某个子框架激活,Active frame (for frames within frames -- MDI)virtual CFrameWnd* GetActiveFrame();// For customizing the default messages on the status barvirtual void GetMessageString(UINT nID, CString& rMessage) const;BOOL m_bAutoMenuEnable;// TRUE => menu items without handlers will be disabledBOOL IsTracking();
// Operationsvirtual void RecalcLayout(BOOL bNotify = TRUE); //核心排版virtual void ActivateFrame(int nCmdShow = -1);void InitialUpdateFrame(CDocument* pDoc, BOOL bMakeVisible);void SetTitle(LPCTSTR lpszTitle);CString GetTitle() const;virtual UINT GetTrackingID() { return m_nIDTracking; }// set/get menu bar visibility stylevirtual void SetMenuBarVisibility(DWORD dwStyle);virtual DWORD GetMenuBarVisibility() const;// set/get menu bar visibility statevirtual BOOL SetMenuBarState(DWORD dwState);virtual DWORD GetMenuBarState() const;BOOL GetMenuBarInfo(LONG idObject, LONG idItem, PMENUBARINFO pmbi) const;
protected:virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);friend class CWinApp;
};

OnCreate和OnCreateClient的方法

为啥对话框CDialog类不偏爱WM_CREATE消息?
a)对话框类使用WM_INITDIALOG消息或者虚函数来初始化;
b)WM_CREATE消息对于对话框也是有效的,为什么对话框很少用这 个消息呢?
c)对话框程序需要初始化控件,WM_CREATE是主窗口刚刚创建好,控件还没有。
d)所以它偏爱OnInitDialog虚函数,控件都被创建好之后方便初始化那些控件。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;static CMenu menu;  //临时对象生命周期不够需要加staticmenu.LoadMenu(IDR_MAINFRAME);SetMenu(&menu);CCreateContext cc;cc.m_pNewViewClass = RUNTIME_CLASS(CMainView);CreateView(&cc);
}
#include "CTestBtn.h"
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
//创建客户区的主区视图
{CCreateContext cc;
//	cc.m_pNewViewClass = RUNTIME_CLASS(CTestBtn);cc.m_pNewViewClass = RUNTIME_CLASS(CMainView);m_pMainView = (CMainView*)CreateView(&cc, AFX_IDW_PANE_FIRST);//AFX_IDW_PANE_FIRST在中间区域自动缩放return m_pMainView!=NULL;
}
int CTestBtn::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CButton::OnCreate(lpCreateStruct) == -1)return -1;SetWindowText(_T("按钮?"));return 0;
}BOOL CTestBtn::PreCreateWindow(CREATESTRUCT& cs)  //视图就是CreateView
{cs.lpszClass = _T("BUTTON");return CButton::PreCreateWindow(cs);
}

注册时的要素与窗口设置

a)例如:注册时你指定灰色背景,窗口生成后可以在WM_ERASEBKGND消息中改成别的颜色。
b)其他包括图标(SetIcon),光标WM_SETCURSOR消息中改,以及菜单(SetMenu)。
c)例如:但凡Create一个Edit注册时的要素都会默认呈现,比如光标的形状,背景是白色。
d)但是后面都是可以改的,比如你想把某个edit改为绿底红字的。(WM_CTLCOLOR)

BOOL CMainFrame::OnEraseBkgnd(CDC* pDC)
{  CRect rect;GetClientRect(rect);pDC->FillSolidRect(rect, 0xffee00); //可指定其他的颜色 注册可以该 默认的实施  按照注册来实施return TRUE;//你注册的灰色是由return CFrameWnd::OnEraseBkgnd(pDC);来实施的//return CFrameWnd::OnEraseBkgnd(pdc)  改为return TRUE 则没有注册的颜色
}

PreCreateWindow创建窗口的预处理函数

创建窗口的预处理函数:virtual BOOL PreCreateWindow(CREATESTRUCT& cs);  

a)预处理核心的一个工作就是注册窗口规格,包括光标,图标以及背景颜色等;
b)预处理函数的结构体中包含,位置、高宽以及菜单,style和dwExStyle
c)为什么LoadFrame中使用注册,而CreateFrame根本没注册都好使?
那就是因为窗口预处理中执行注册,可以说即使从CWnd类派生你只要做预处理就不用RegisterClass

//预处理核心的一个工作就是注册窗口规格,包括光标,图标以及背景颜色等
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;//  CREATESTRUCT cs 来修改窗口类或样式/*cs.x = 100;cs.y = 100;cs.cx = 200;cs.cy = 300;*/ //没有这几行的代码的话 默认是重叠的 有了的话不会重叠
//	cs.style |= WS_THICKFRAME; //拖动大小开关
//	cs.hMenu = ::LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));cs.dwExStyle &= ~WS_EX_CLIENTEDGE;cs.lpszClass = AfxRegisterWndClass(0);return TRUE;
}

附录

预处理函数的结构体

typedef struct tagCREATESTRUCTW {LPVOID      lpCreateParams;HINSTANCE   hInstance;HMENU       hMenu;HWND        hwndParent;int         cy;int         cx;int         y;int         x;LONG        style;LPCWSTR     lpszName;//标题LPCWSTR     lpszClass;//类型名DWORD       dwExStyle;//扩展风格
} CREATESTRUCTW, *LPCREATESTRUCTW;

CFrameWnd::LoadFrame与CreateFrame

BOOL CFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,CWnd* pParentWnd, CCreateContext* pContext)
{CString strFullString;if (strFullString.LoadString(nIDResource))AfxExtractSubString(m_strTitle, strFullString, 0);    // first sub-stringVERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));// attempt to create the windowLPCTSTR lpszClass = GetIconWndClass(dwDefaultStyle, nIDResource);CString strTitle = m_strTitle;if (!Create(lpszClass, strTitle, dwDefaultStyle, rectDefault, pParentWnd, ATL_MAKEINTRESOURCE(nIDResource), 0L, pContext)){return FALSE;   // will self destruct on failure normally}// save the default menu handleASSERT(m_hWnd != NULL);m_hMenuDefault = m_dwMenuBarState == AFX_MBS_VISIBLE ? ::GetMenu(m_hWnd) : m_hMenu;// load accelerator resourceLoadAccelTable(ATL_MAKEINTRESOURCE(nIDResource));if (pContext == NULL)   // send initial updateSendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);return TRUE;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/59294.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测预测效果基本介绍研究内容程序设计参考资料…

2.若依前后端分离版第一个增删查改

1.介绍 若依提供了代码生成功能,单表的CRUD可以直接用若依框架提供的代码生成进行创建。 2.实现 2.1 在数据库创建业务表test_teacher 2.2 生成代码 运行系统,进入菜单[系统工具]-》[代码生成],点击导入按钮,选择需要生成代码的表进行导…

链表oj (环形链表oj)

文章目录 1.数组oj 2.链表oj 文章内容 1.数组oj 1. 原地移除数组中所有的元素值为val&#xff0c;要求时间复杂度为O(N)&#xff0c;空间复杂度为O(1)。力扣 int removeElement(int* nums, int numsSize, int val){int k numsSize;int a 0;int b 0;while(b<k){if(nu…

HDFS中的Trash垃圾桶回收机制

Trash垃圾桶回收机制 文件系统垃圾桶背景功能概述Trash Checkpoint Trash功能开启关闭HDFS集群修改core-site.xml删除文件到trash删除文件跳过从trash中恢复文件清空trash 文件系统垃圾桶背景 回收站&#xff08;垃圾桶&#xff09;是windows操作系统里的一个系统文件夹&#…

C++进阶 智能指针

本篇博客简介&#xff1a;介绍C中的智能指针 智能指针 为什么会存在智能指针内存泄露内存泄漏定义内存泄漏的危害如何检测内存泄漏如何避免内存泄漏 智能指针的使用及其原理RAII设计一个智能指针C官方的智能指针 定制删除器智能指针总结 为什么会存在智能指针 我们首先来看下面…

SpringBoot 底层机制分析[上]

文章目录 分析SpringBoot 底层机制【Tomcat 启动分析Spring 容器初始化Tomcat 如何关联Spring 容器】[上]搭建SpringBoot 底层机制开发环境Configuration Bean 会发生什么&#xff0c;并分析机制提出问题&#xff1a;SpringBoot 是怎么启动Tomcat &#xff0c;并可以支持访问C…

剑指Offer12.矩阵中的路径 C++

1、题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

配置Hive远程服务详细步骤

HiveServer2支持多客户端的并发和认证&#xff0c;为开放API客户端如JDBC、ODBC提供了更好的支持。 &#xff08;1&#xff09;修改hive-site.xml&#xff0c;在文件中添加以下内容&#xff1a; <property><name>hive.metastore.event.db.notification.api.auth&l…

药库管理指南:除了药物质量,这个技能很关键

随着医疗技术的不断进步&#xff0c;药品的质量要求也日益严格&#xff0c;药物的稳定性、疗效以及避免细菌滋生等方面都直接受到温湿度变化的影响。 药品质量和安全是医疗行业的首要任务之一&#xff0c;药库温湿度监控在此过程中发挥着关键作用。通过科学合理地实施温湿度监控…

Q-Vision+Kvaser CAN/CAN FD/LIN总线解决方案

智能联网技术在国内的发展势头迅猛&#xff0c;随着汽车智能化、网联化发展大潮的到来&#xff0c;智能网联汽车逐步成为汽车发展的主要趋势。越来越多整车厂诉求&#xff0c;希望可以提供本土的测量软件&#xff0c;特别是关于ADAS测试。而Softing中国推出的Q-Vision软件不仅可…

不看后悔一辈子!不看错过50K!历尽心血总结Redis全局命令

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的敖云岚&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏&#xff1a;Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c…

CS录屏教程,录制游戏需要注意哪些方面?

​最近有个CS手游的玩家小伙伴咨询想要做一些游戏视频录制&#xff0c;但是不知道有哪些好用的工具来使用&#xff0c;对于游戏录制我们其实是需要注意一些事项的&#xff0c;想要观众的观感上比较好就需要把握好视频的帧率等问题&#xff0c;下面我们就来看看录制方法和需要注…