有了自动布局缩放的方法,那就创建一个基类,所有窗口类都继承此类
添加MFC类
名称自定义 CbaseDlg
CbaseDlg.h
#pragma once
#include "afxcontrolbarutil.h"
#include "afxdialogimpl.h"
#include "./layout/ControlAutoLayout.h"
// CbaseDlg 对话框 基类 自动布局缩放,其他窗口继承此类
class CbaseDlg : public CDialogEx
{
DECLARE_DYNAMIC(CbaseDlg)
public:
//CbaseDlg(CWnd* pParent = nullptr); // 标准构造函数
CbaseDlg(UINT nIDD, CWnd* pParent = NULL);
virtual ~CbaseDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_CbaseDlg };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
BOOL OnInitDialog();
afx_msg void OnSize(UINT nType, int cx, int cy); // cx 窗体宽度,cy窗体高度
DECLARE_MESSAGE_MAP()
private:
ControlAutoLayout control_auto_layout_;
};
CbaseDlg.cpp
// CbaseDlg.cpp: 实现文件
//
#include "stdafx.h"
#include "ServerManager.h"
#include "CbaseDlg.h"
#include "afxdialogex.h"
// CbaseDlg 对话框
IMPLEMENT_DYNAMIC(CbaseDlg, CDialogEx)
CbaseDlg::CbaseDlg(UINT nIDD, CWnd* pParent /*=NULL*/)
: CDialogEx(nIDD, pParent)
{
}
CbaseDlg::~CbaseDlg()
{
}
void CbaseDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BOOL CbaseDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
control_auto_layout_.SetDialogHandle(this);
return 0;
}
void CbaseDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
//同步控件大小
CRect rectDlg;
GetClientRect(rectDlg);//获得窗体的大小
control_auto_layout_.InitLayout(rectDlg.Width(), rectDlg.Height());
//遍历控件
HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件
int c_id;
while (hwndChild)
{
c_id = ::GetDlgCtrlID(hwndChild);//取得ID
control_auto_layout_.SetControlAutoChangeMode(c_id, 1, 1, 1, 1);
hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
}
}
BEGIN_MESSAGE_MAP(CbaseDlg, CDialogEx)
ON_WM_SIZE()
END_MESSAGE_MAP()
// CbaseDlg 消息处理程序
主要是 有两个函数
BOOL CbaseDlg::OnInitDialog()//初始化的函数
void CbaseDlg::OnSize(UINT nType, int cx, int cy)//窗口变化的函数
其他窗口类继承 CbaseDlg
用户设置类
UserSetDlg.h
#pragma once
#include"CbaseDlg.h"
// UserSetDlg 对话框
class UserSetDlg : public CbaseDlg
{
DECLARE_DYNAMIC(UserSetDlg)
public:
UserSetDlg(CWnd* pParent = nullptr); // 标准构造函数
virtual ~UserSetDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DEPT_DLG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
afx_msg void OnSize(UINT nType, int cx, int cy); // cx 窗体宽度,cy窗体高度
BOOL UserSetDlg::OnInitDialog();
DECLARE_MESSAGE_MAP()
};
UserSetDlg.cpp
// UserSetDlg.cpp: 实现文件
//
#include "stdafx.h"
#include "ServerManager.h"
#include "UserSetDlg.h"
#include "afxdialogex.h"
// UserSetDlg 对话框
IMPLEMENT_DYNAMIC(UserSetDlg, CbaseDlg)
UserSetDlg::UserSetDlg(CWnd* pParent /*=nullptr*/)
: CbaseDlg(IDD_USER_DLG, pParent)
{
}
UserSetDlg::~UserSetDlg()
{
}
void UserSetDlg::DoDataExchange(CDataExchange* pDX)
{
CbaseDlg::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(UserSetDlg, CbaseDlg)
ON_WM_SIZE()
END_MESSAGE_MAP()
void UserSetDlg::OnSize(UINT nType, int cx, int cy)
{
CbaseDlg::OnSize(nType, cx, cy);
}
BOOL UserSetDlg::OnInitDialog()
{
CbaseDlg::OnInitDialog();
return TRUE;
}
// UserSetDlg 消息处理程序
这样 用户设置窗口 就 自动 继承了 自动布局的方法
如图