马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在开辟桌面应用步调时,经常必要为差别的屏幕分辨率和用户界面需求动态调解控件的巨细,而且支持差别的主题(如淡色和深色模式)。在 MFC 中,固然有一些方法来实现这些功能,但实现起来每每比力繁琐。为了更好地管理控件的调解和主题切换,我们可以创建一个通用的基类来处理惩罚这些功能。
1. 需求分析
在一个范例的应用步调中,大概会遇到以下几种需求:
- 动态调解控件巨细:当用户调解窗口巨细时,控件的巨细应根据窗口的变革自动调解。
- 主题切换:根据用户的偏好或体系设置,切换淡色(Light)或深色(Dark)主题。
为了满意这些需求,我们可以筹划一个 CBaseDlg 基类,该类继承自 CDialogEx,并提供以下功能:
2. 筹划 CBaseDlg 基类
起首,界说 CBaseDlg 类,该类提供了管理控件结构、字体、主题切换等功能。
头文件(CBaseDlg.h)
- #pragma once
- #include <memory>
- #include <unordered_map>
- enum class ThemeType {
-
-
- Light, // 浅色主题
- Dark // 深色主题
- };
- struct Theme {
-
-
- COLORREF backgroundColor;
- COLORREF textColor;
- COLORREF buttonColor;
- COLORREF borderColor;
- };
- class CBaseDlg : public CDialogEx
- {
-
-
- DECLARE_DYNAMIC(CBaseDlg)
- public:
- CBaseDlg(UINT id, CWnd* pPage); // 标准构造函数
- virtual ~CBaseDlg(); // 析构函数
- // 字体管理
- CFont* GetOrCreateFont(int nFontSize); // 获取或创建字体
- void SetDefaultFont(); // 设置默认字体
- // 动态控件管理
- BOOL AddControl(UINT nCtrlID, CWnd* pControl); // 添加控件
- BOOL RemoveControl(UINT nCtrlID); // 移除控件
- BOOL UpdateControlText(UINT nCtrlID, const CString& strText); // 更新控件文本
- CWnd* GetControl(UINT nCtrlID); // 获取控件
- // 主题设置
- void SwitchTheme(ThemeType themeType); // 切换主题
- private:
- void AdjustControls(float dScaleX, float dScaleY); // 调整控件大小
- void AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight); // 调整控件字体
- private:
- bool m_bResizing; // 控件是否正在调整大小
- int m_nInitialWidth; // 对话框初始宽度
- int m_nInitialHeight; // 对话框初始高度
- HBRUSH m_hbrBackground; // 画刷
- COLORREF m_lastBackgroundColor; // 上一个背景颜色
- std::unordered_map<int, CRect> m_mapCtrlLayouts; // 控件布局
- std::map<UINT, std::unique_ptr<CWnd>> m_mapControls; // 控件集合
- std::unordered_map<int, std::shared_ptr<CFont>> m_mapFonts; // 控件字体
- DECLARE_MESSAGE_MAP()
- public:
- virtual BOOL OnInitDialog();
- afx_msg void OnSize(UINT nType, int cx, int cy);
- afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);
- afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
- };
复制代码 源文件(CBaseDlg.cpp)
- #include "stdafx.h"
- #include "CBaseDlg.h"
- #include "GridCtrl.h"
- #include <windows.h>
- // 全局主题对象
- Theme g_lightTheme = {
-
- RGB(255, 255, 255), RGB(0, 0, 0), RGB(240, 240, 240), RGB(200, 200, 200) };
- Theme g_darkTheme = {
-
- RGB(40, 40, 40), RGB(255, 255, 255), RGB(60, 60, 60), RGB(80, 80, 80) }
复制代码 |