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

这篇具有很好参考价值的文章主要介绍了MFC第二十八天 WM_SIZE应用,CFrameWnd类LoadFrame的方法,PreCreateWindow窗口预处理,Frame-view窗口视图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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);
	}
}

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

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

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

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 popups
				LPCTSTR lpszMenuName = NULL,
				DWORD dwExStyle = 0,
				CCreateContext* pContext = NULL);
// 加载框架 - load frame and associated resources
	virtual BOOL LoadFrame(UINT nIDResource,
				DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
				CWnd* pParentWnd = NULL,
				CCreateContext* pContext = NULL);

// 创建中央视图 helper for view creation
	CWnd* CreateView(CCreateContext* pContext, UINT nID = AFX_IDW_PANE_FIRST);

// 第十三章文档架构时获取激活文档
	virtual CDocument* GetActiveDocument();
//多文档架构获取激活视图 Active child view maintenance
	CView* GetActiveView() const;           // active view or NULL
	void 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 bar
	virtual void GetMessageString(UINT nID, CString& rMessage) const;

	BOOL m_bAutoMenuEnable;
		// TRUE => menu items without handlers will be disabled

	BOOL IsTracking();
// Operations
	virtual 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 style
	virtual void SetMenuBarVisibility(DWORD dwStyle);
	virtual DWORD GetMenuBarVisibility() const;
	// set/get menu bar visibility state
	virtual 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;  //临时对象生命周期不够需要加static
	menu.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文章来源地址https://www.toymoban.com/news/detail-629906.html

//预处理核心的一个工作就是注册窗口规格,包括光标,图标以及背景颜色等
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-string

	VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));

	// attempt to create the window
	LPCTSTR 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 handle
	ASSERT(m_hWnd != NULL);
	m_hMenuDefault = m_dwMenuBarState == AFX_MBS_VISIBLE ? ::GetMenu(m_hWnd) : m_hMenu;

	// load accelerator resource
	LoadAccelTable(ATL_MAKEINTRESOURCE(nIDResource));

	if (pContext == NULL)   // send initial update
		SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);

	return TRUE;
}

到了这里,关于MFC第二十八天 WM_SIZE应用,CFrameWnd类LoadFrame的方法,PreCreateWindow窗口预处理,Frame-view窗口视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MFC第二十六天 CRgn类简介与开发、封装CMemoryDC类并应用开发

    CRgn类是MFC(Microsoft Foundation Classes)中的一个图形区域类。该类用于创建和操作图形区域,可以表示各种形状的区域,如矩形、椭圆、多边形等。 CRgnDlg.h CRgnDlg.cpp CircleRgnDlg.h CircleRgnDlg.cpp CCircleRgnDlg.h CCircleRgnDlg.cpp CFlashDlg.h CFlashDlg.cpp QQDlg.h QQDlg.cpp CPaintDC,CClientDC,CWindowDC,CMemory

    2024年02月14日
    浏览(48)
  • MFC第十八天 非模式对话框、对话框颜色管理、记事本项目(查找替换、文字和背景色、Goto(转到)功能的开发)

    a)调用CDialog::Create函数实现,例如:QQ的聊天框,记事本的查找等。 b)非阻塞,对象的生命期必须足够,否则就析构时摧毁了。 c)可以采用堆空间申请多例模式,也可以用全局或者成员。 d)EndDialog只对模式对话框有效,对非模式对话框无效,如果要摧毁调用DestroyWindow (只是隐

    2024年02月17日
    浏览(53)
  • 第二十八章 Unity射线检测

    本章节我们介绍一下射线。射线就是从一个固定点向一个方向发射出一条直线,在发射过程中需要判断该射线有没有与游戏物体发送碰撞。射线既可以用来检测射击游戏中武器指向目标;又可以判断鼠标是否指向游戏物体。射线的创建方式,一般使用代码来实现。接下来,我

    2024年02月11日
    浏览(59)
  • 第二十八回:如何给PageView添加指示器

    我们在前面章回中介绍了PageView这个Widget,本章回中将介绍 如何给PageView添加指示器 .闲话休提,让我们一起Talk Flutter吧。 我们在这里说的指示器表示 PageView 底部的小圆圈,它用来指示当前哪个页面被选中。常用的场景是滑动页面时小圆圈高亮显示当前被选中的页面,其它小圆

    2024年02月04日
    浏览(73)
  • 《微服务实战》 第二十八章 分布式锁框架-Redisson

    第二十八章 分布式锁框架-Redisson 第二十七章 CAS 第二十六章 Java锁的分类 第二十五章 Java多线程安全与锁 第二章 CountDownLatch和Semaphone的应用 第一章 Java线程池技术应用 Redisson 在基于 NIO 的 Netty 框架上,充分的利⽤了 Redis 键值数据库提供的⼀系列优势,在Java 实⽤⼯具包中常

    2024年02月10日
    浏览(47)
  • 从0开始学C++ 第二十八课 数据结构深入 - 栈和队列

    第二十八课:数据结构深入 - 栈和队列 学习目标: 理解栈(Stack)的基本概念和特性。 掌握队列(Queue)的基本概念和特性。 学会在C++中使用栈和队列。 了解栈和队列的典型应用场景。 学习内容: 栈(Stack) 概念:栈是一种后进先出(LIFO, Last In First Out)的数据结构,元素

    2024年01月23日
    浏览(45)
  • UNIX网络编程卷一 学习笔记 第二十八章 原始套接字

    原始套接字提供普通的TCP和UDP套接字不具备的以下3个能力: 1.有了原始套接字,进程可以读写ICMPv4、IGMPv4、ICMPv6等分组。例如,ping程序就使用原始套接字发送ICMP回射请求并接收ICMP回射应答。多播路由守护程序mrouted也使用原始套接字发送和接收IGMPv4分组。 这个能力还使得使

    2024年02月11日
    浏览(46)
  • MFC第二十九天 CView类的分支(以及其派生类的功能)、MFC六大关键技术

    对CMainView使用了CEditView类的派生,对其默认字体进行改变。 需要添加#include afxhtml.h头文件 MainFrm.h CMainFrame 类的接口 CMainView .h a)CListCtrl的内部创建原理是通过CWnd::Create(sClassName,…)来实现的。 b)CStatic,CEdit,CButton的内部创建原理无一不是这个原理,即使是拖入对话框的控件底层也

    2024年02月13日
    浏览(42)
  • 【送书福利-第二十八期】《AIGC:让生成式AI成为自己的外脑》

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《送书福利》系列专栏,该专栏福利多多

    2024年02月05日
    浏览(65)
  • 【送书福利-第二十八期】《从概念到现实:ChatGPT和Midjourney的设计之旅》

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《送书福利》系列专栏,该专栏福利多多

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包