LAPTOP-T815PCOQ\25526
2024-11-21 d84ddeea533a8e5f122cc4a2fed06e93c2aacf3d
1.显示对话框继续缩放 2.登录界面加载图片
已重命名2个文件
已修改9个文件
439 ■■■■■ 文件已修改
SourceCode/Bond/BondEq/BondEq.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEq.vcxproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/Resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisSettingsDlg.h 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/LoginDlg.cpp 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/LoginDlg.h 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/SystemLogManagerDlg.cpp 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/SystemLogManagerDlg.h 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/UserManagerDlg.cpp 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/UserManagerDlg.h 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEq.rc
Binary files differ
SourceCode/Bond/BondEq/BondEq.vcxproj
@@ -196,7 +196,6 @@
    <ClInclude Include="Alarm.h" />
    <ClInclude Include="AlarmMonitor.h" />
    <ClInclude Include="ApredTreeCtrl.h" />
    <ClInclude Include="AxisSettingsDlg.h" />
    <ClInclude Include="BaseSetPage.h" />
    <ClInclude Include="BlButton.h" />
    <ClInclude Include="BondEq.h" />
@@ -245,6 +244,7 @@
    <ClInclude Include="ToolUnits.h" />
    <ClInclude Include="TopToolbar.h" />
    <ClInclude Include="VerticalLine.h" />
    <ClInclude Include="View\AxisSettingsDlg.h" />
    <ClInclude Include="View\ChangePasswordDlg.h" />
    <ClInclude Include="View\LoginDlg.h" />
    <ClInclude Include="View\SystemLogManagerDlg.h" />
@@ -256,7 +256,6 @@
    <ClCompile Include="Alarm.cpp" />
    <ClCompile Include="AlarmMonitor.cpp" />
    <ClCompile Include="ApredTreeCtrl.cpp" />
    <ClCompile Include="AxisSettingsDlg.cpp" />
    <ClCompile Include="BaseSetPage.cpp" />
    <ClCompile Include="BlButton.cpp" />
    <ClCompile Include="BondEq.cpp" />
@@ -307,6 +306,7 @@
    <ClCompile Include="ToolUnits.cpp" />
    <ClCompile Include="TopToolbar.cpp" />
    <ClCompile Include="VerticalLine.cpp" />
    <ClCompile Include="View\AxisSettingsDlg.cpp" />
    <ClCompile Include="View\ChangePasswordDlg.cpp" />
    <ClCompile Include="View\LoginDlg.cpp" />
    <ClCompile Include="View\SystemLogManagerDlg.cpp" />
SourceCode/Bond/BondEq/Resource.h
Binary files differ
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp
ÎļþÃû´Ó SourceCode/Bond/BondEq/AxisSettingsDlg.cpp ÐÞ¸Ä
@@ -34,25 +34,27 @@
    CDialogEx::DoDataExchange(pDX);
}
void CAxisSettingsDlg::SetDefaultFont()
CFont* CAxisSettingsDlg::GetOrCreateFont(int nFontSize)
{
    CFont* defaultFont = nullptr;
    // å¦‚果字体管理容器中有默认大小(如 12)的字体,直接使用
    auto it = m_mapFonts.find(12);
    auto it = m_mapFonts.find(nFontSize);
    if (it != m_mapFonts.end()) {
        defaultFont = it->second;
        return it->second;
    }
    else {
        // åˆ›å»ºé»˜è®¤å­—体
        defaultFont = new CFont();
    CFont* font = new CFont();
        LOGFONT logFont = { 0 };
        _tcscpy_s(logFont.lfFaceName, _T("Segoe UI"));
        logFont.lfHeight = -12;
    logFont.lfHeight = -nFontSize;
        logFont.lfQuality = CLEARTYPE_QUALITY;
        defaultFont->CreateFontIndirect(&logFont);
        m_mapFonts[12] = defaultFont; // å­˜å‚¨åˆ°å­—体管理容器
    font->CreateFontIndirect(&logFont);
    m_mapFonts[nFontSize] = font;
    return font;
    }
void CAxisSettingsDlg::SetDefaultFont()
{
    CFont* defaultFont = GetOrCreateFont(12);
    // éåŽ†æ‰€æœ‰æŽ§ä»¶ï¼Œåº”ç”¨é»˜è®¤å­—ä½“
    CWnd* pWnd = GetWindow(GW_CHILD);
@@ -62,34 +64,31 @@
    }
}
void CAxisSettingsDlg::AdjustControls(int nWidth, int nHeight)
void CAxisSettingsDlg::AdjustControls(float dScaleX, float dScaleY)
{
    CWnd* pWnd = GetWindow(GW_CHILD);
    while (pWnd) {
        UINT nCtrlID = pWnd->GetDlgCtrlID();
        CRect ctrlRect;
        pWnd->GetWindowRect(&ctrlRect);
        ScreenToClient(&ctrlRect);
        // è®¡ç®—控件的新位置和大小,按比例调整
        int newX = (int)(ctrlRect.left * (nWidth / (float)m_nInitialWidth));
        int newY = (int)(ctrlRect.top * (nHeight / (float)m_nInitialHeight));
        int newWidth = (int)(ctrlRect.Width() * (nWidth / (float)m_nInitialWidth));
        int newHeight = (int)(ctrlRect.Height() * (nHeight / (float)m_nInitialHeight));
        int nCtrlID = pWnd->GetDlgCtrlID();
        if (nCtrlID != -1 && m_mapCtrlLayouts.find(nCtrlID) != m_mapCtrlLayouts.end())
        {
            CRect originalRect = m_mapCtrlLayouts[nCtrlID];
            CRect newRect(
                static_cast<int>(originalRect.left * dScaleX),
                static_cast<int>(originalRect.top * dScaleY),
                static_cast<int>(originalRect.right * dScaleX),
                static_cast<int>(originalRect.bottom * dScaleY));
        TCHAR szClassName[256];
        GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
        if (_tcsicmp(szClassName, _T("ComboBox")) == 0) {
            CComboBox* pComboBox = (CComboBox*)pWnd;
            pComboBox->SetItemHeight(-1, nHeight);  // -1 è¡¨ç¤ºæ‰€æœ‰é¡¹çš„高度
                pComboBox->SetItemHeight(-1, newRect.Height());  // -1 è¡¨ç¤ºæ‰€æœ‰é¡¹çš„高度
        }
        pWnd->MoveWindow(newX, newY, newWidth, newHeight);
        AdjustControlFont(pWnd, newWidth, newHeight);
        // èŽ·å–ä¸‹ä¸€ä¸ªæŽ§ä»¶
            pWnd->MoveWindow(&newRect);
            AdjustControlFont(pWnd, newRect.Width(), newRect.Height());
        }
        pWnd = pWnd->GetNextWindow();
    }
}
@@ -100,23 +99,10 @@
    int fontSize = nHeight / 2;
    if (fontSize < 8) fontSize = 8;
    // æ£€æŸ¥å­—体是否已经存在
    auto it = m_mapFonts.find(fontSize);
    if (it == m_mapFonts.end()) {
        // åŠ¨æ€åˆ›å»ºæ–°å­—ä½“
        CFont* newFont = new CFont();
        LOGFONT logFont = { 0 };
        _tcscpy_s(logFont.lfFaceName, _T("Segoe UI"));
        logFont.lfHeight = -fontSize;
        logFont.lfQuality = CLEARTYPE_QUALITY; // å¯ç”¨ ClearType æŠ—锯齿
        newFont->CreateFontIndirect(&logFont);
    // èŽ·å–æˆ–åˆ›å»ºå­—ä½“
    CFont* pFont = GetOrCreateFont(fontSize);
        // å­˜å‚¨åˆ°å­—体管理容器中
        m_mapFonts[fontSize] = newFont;
        it = m_mapFonts.find(fontSize);
    }
    pWnd->SetFont(it->second);
    pWnd->SetFont(pFont);
    pWnd->Invalidate(); // åˆ·æ–°æŽ§ä»¶æ˜¾ç¤º
}
@@ -152,16 +138,31 @@
    CDialogEx::OnInitDialog();
    // TODO:  åœ¨æ­¤æ·»åŠ é¢å¤–çš„åˆå§‹åŒ–
    //ModifyStyle(0, WS_THICKFRAME | WS_SIZEBOX);
    // è®¾ç½®é»˜è®¤å­—体
    SetDefaultFont();
    CRect screenRect, dlgRect, clientRect;
    GetClientRect(&clientRect);
    m_nInitialWidth = clientRect.Width();
    m_nInitialHeight = clientRect.Height();
    // åˆå§‹åŒ–默认字体
    CFont* pDefaultFont = GetOrCreateFont(12);
    // éåŽ†æ‰€æœ‰å­æŽ§ä»¶ï¼Œè®°å½•åˆå§‹ä½ç½®å¹¶è®¾ç½®é»˜è®¤å­—ä½“
    CWnd* pWnd = GetWindow(GW_CHILD);
    while (pWnd) {
        int nCtrlID = pWnd->GetDlgCtrlID();
        if (nCtrlID != -1) {
            // è®°å½•控件初始布局
            CRect ctrlRect;
            pWnd->GetWindowRect(&ctrlRect);
            ScreenToClient(&ctrlRect);
            m_mapCtrlLayouts[nCtrlID] = ctrlRect;
            // è®¾ç½®é»˜è®¤å­—体
            pWnd->SetFont(pDefaultFont);
        }
        pWnd = pWnd->GetNextWindow();
    }
    GetWindowRect(&dlgRect);
    int dlgWidth = dlgRect.Width() * 2;
    int dlgHeight = dlgRect.Height() * 2;
SourceCode/Bond/BondEq/View/AxisSettingsDlg.h
ÎļþÃû´Ó SourceCode/Bond/BondEq/AxisSettingsDlg.h ÐÞ¸Ä
@@ -18,14 +18,16 @@
#endif
private:
    CFont* GetOrCreateFont(int nFontSize);
    void SetDefaultFont();
    void AdjustControls(int nWidth, int nHeight);
    void AdjustControls(float dScaleX, float dScaleY);
    void AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight);
private:
    int m_nInitialWidth;
    int m_nInitialHeight;
    std::map<int, CFont*> m_mapFonts; // ç®¡ç†å­—体的容器,键为字体大小
    std::map<int, CRect> m_mapCtrlLayouts;
    std::map<int, CFont*> m_mapFonts;
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
SourceCode/Bond/BondEq/View/LoginDlg.cpp
@@ -24,9 +24,9 @@
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_STATIC_IMAGE, m_staticImage);
    DDX_Control(pDX, IDC_EDIT_USERNAME, m_editUsername);
    DDX_Control(pDX, IDC_EDIT_PASSWORD, m_editPassword);
    DDX_Control(pDX, IDC_COMBO_ROLE, m_comboRole);
    DDX_Control(pDX, IDC_CHECK_REMEMBER_PASSWORD, m_checkRememberPassword);
}
@@ -46,10 +46,24 @@
    // è®¾ç½®çª—口标题和初始值
    SetWindowText(_T("登录"));
    m_comboRole.AddString(_T("管理员"));
    m_comboRole.AddString(_T("工程师"));
    m_comboRole.AddString(_T("操作员"));
    m_comboRole.SetCurSel(0);
    CString strIconPath;
    strIconPath.Format(_T("%s\\Res\\Operator_High_32.ico"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    // åŠ è½½å›¾æ ‡
    HICON hIcon = (HICON)::LoadImage(
        nullptr,
        strIconPath,
        IMAGE_ICON,
        32, // å›¾æ ‡å®½åº¦
        32, // å›¾æ ‡é«˜åº¦
        LR_LOADFROMFILE);
    if (hIcon) {
        // è®¾ç½® CStatic æŽ§ä»¶ä¸ºå›¾æ ‡æ ·å¼
        m_staticImage.ModifyStyle(0xF, SS_ICON);
        m_staticImage.SetIcon(hIcon);
    }
    // æ·»åŠ SS_NOTIFY样式
    CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC_CHANGE_PASSWORD);
@@ -59,11 +73,6 @@
    UserManager& userManager = UserManager::getInstance();
    if (userManager.isLoggedIn()) {
        int nRole = (int)userManager.getCurrentUserRole();
        if (nRole <= m_comboRole.GetCount()) {
            m_comboRole.SetCurSel(nRole);
        }
        if (userManager.isRememberMe()) {
            m_checkRememberPassword.SetCheck(BST_CHECKED);
        }
@@ -81,7 +90,6 @@
    CString username, password, role;
    m_editUsername.GetWindowText(username);
    m_editPassword.GetWindowText(password);
    m_comboRole.GetLBText(m_comboRole.GetCurSel(), role);
    if (username.IsEmpty() || password.IsEmpty()) {
        AfxMessageBox(_T("请输入用户名和密码。"));
SourceCode/Bond/BondEq/View/LoginDlg.h
@@ -17,16 +17,16 @@
    enum { IDD = IDD_DIALOG_LOGIN };
#endif
private:
    CStatic m_staticImage;
    CEdit m_editUsername;
    CEdit m_editPassword;
    CButton m_checkRememberPassword;
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    virtual BOOL OnInitDialog();
    afx_msg void OnBnClickedLogin();
    afx_msg void OnBnClickedChangePassword();
    DECLARE_MESSAGE_MAP()
private:
    CEdit m_editUsername;
    CEdit m_editPassword;
    CComboBox m_comboRole;
    CButton m_checkRememberPassword;
};
SourceCode/Bond/BondEq/View/SystemLogManagerDlg.cpp
@@ -14,7 +14,8 @@
CSystemLogManagerDlg::CSystemLogManagerDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DIALOG_SYSTEM_LOG_MANAGER, pParent)
{
    m_nInitialWidth = 0;
    m_nInitialHeight = 0;
}
CSystemLogManagerDlg::~CSystemLogManagerDlg()
@@ -70,11 +71,11 @@
    m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("No."));
    m_listLogs.SetColumnWidth(nColIdx, 10);
    m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("类型"));
    m_listLogs.SetColumnWidth(nColIdx, 200);
    m_listLogs.SetColumnWidth(nColIdx, 100);
    m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("事件"));
    m_listLogs.SetColumnWidth(nColIdx, 30);
    m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("用户"));
    m_listLogs.SetColumnWidth(nColIdx, 70);
    m_listLogs.SetColumnWidth(nColIdx, 50);
    m_listLogs.SetItemText(nRowIdx, nColIdx++, _T("时间"));
    // åˆ›å»º 20 è¡Œç©ºç™½æ•°æ®è¡Œ
@@ -152,11 +153,30 @@
        }
    }
    m_listLogs.Invalidate();
    m_listLogs.UpdateWindow();
    m_listLogs.ExpandColumnsToFit(FALSE);
    m_listLogs.ExpandLastColumn();
    m_listLogs.Invalidate();
    m_listLogs.UpdateWindow();
    UpdatePageInfo();
}
CFont* CSystemLogManagerDlg::GetOrCreateFont(int nFontSize)
{
    auto it = m_mapFonts.find(nFontSize);
    if (it != m_mapFonts.end()) {
        return it->second;
    }
    CFont* font = new CFont();
    LOGFONT logFont = { 0 };
    _tcscpy_s(logFont.lfFaceName, _T("Segoe UI"));
    logFont.lfHeight = -nFontSize;
    logFont.lfQuality = CLEARTYPE_QUALITY;
    font->CreateFontIndirect(&logFont);
    m_mapFonts[nFontSize] = font;
    return font;
}
void CSystemLogManagerDlg::UpdatePageInfo()
@@ -169,23 +189,7 @@
void CSystemLogManagerDlg::SetDefaultFont()
{
    CFont* defaultFont = nullptr;
    // å¦‚果字体管理容器中有默认大小(如 12)的字体,直接使用
    auto it = m_mapFonts.find(12);
    if (it != m_mapFonts.end()) {
        defaultFont = it->second;
    }
    else {
        // åˆ›å»ºé»˜è®¤å­—体
        defaultFont = new CFont();
        LOGFONT logFont = { 0 };
        _tcscpy_s(logFont.lfFaceName, _T("Segoe UI"));
        logFont.lfHeight = -12;
        logFont.lfQuality = CLEARTYPE_QUALITY;
        defaultFont->CreateFontIndirect(&logFont);
        m_mapFonts[12] = defaultFont; // å­˜å‚¨åˆ°å­—体管理容器
    }
    CFont* defaultFont = GetOrCreateFont(12);
    // éåŽ†æ‰€æœ‰æŽ§ä»¶ï¼Œåº”ç”¨é»˜è®¤å­—ä½“
    CWnd* pWnd = GetWindow(GW_CHILD);
@@ -203,41 +207,40 @@
    }
}
void CSystemLogManagerDlg::AdjustControls(int nWidth, int nHeight)
void CSystemLogManagerDlg::AdjustControls(float dScaleX, float dScaleY)
{
    CWnd* pWnd = GetWindow(GW_CHILD);
    while (pWnd) {
        UINT nCtrlID = pWnd->GetDlgCtrlID();
        CRect ctrlRect;
        pWnd->GetWindowRect(&ctrlRect);
        ScreenToClient(&ctrlRect);
        // è®¡ç®—控件的新位置和大小,按比例调整
        int newX = (int)(ctrlRect.left * (nWidth / (float)m_nInitialWidth));
        int newY = (int)(ctrlRect.top * (nHeight / (float)m_nInitialHeight));
        int newWidth = (int)(ctrlRect.Width() * (nWidth / (float)m_nInitialWidth));
        int newHeight = (int)(ctrlRect.Height() * (nHeight / (float)m_nInitialHeight));
        int nCtrlID = pWnd->GetDlgCtrlID();
        if (nCtrlID != -1 && m_mapCtrlLayouts.find(nCtrlID) != m_mapCtrlLayouts.end())
        {
            CRect originalRect = m_mapCtrlLayouts[nCtrlID];
            CRect newRect(
                static_cast<int>(originalRect.left * dScaleX),
                static_cast<int>(originalRect.top * dScaleY),
                static_cast<int>(originalRect.right * dScaleX),
                static_cast<int>(originalRect.bottom * dScaleY));
        TCHAR szClassName[256];
        GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
        if (_tcsicmp(szClassName, _T("ComboBox")) == 0) {
            CComboBox* pComboBox = (CComboBox*)pWnd;
            pComboBox->SetItemHeight(-1, nHeight);  // -1 è¡¨ç¤ºæ‰€æœ‰é¡¹çš„高度
                pComboBox->SetItemHeight(-1, newRect.Height());  // -1 è¡¨ç¤ºæ‰€æœ‰é¡¹çš„高度
        }
        if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) {
            CGridCtrl* pGridCtrl = (CGridCtrl*)pWnd;
            pGridCtrl->SetDefCellHeight(newHeight / 21);
                pGridCtrl->SetDefCellHeight(newRect.Height() / 21);
            pGridCtrl->ExpandColumnsToFit(TRUE);
                pGridCtrl->ExpandLastColumn();
            pGridCtrl->Invalidate();
                pGridCtrl->UpdateWindow();
        }
        pWnd->MoveWindow(newX, newY, newWidth, newHeight);
        AdjustControlFont(pWnd, newWidth, newHeight);
        // èŽ·å–ä¸‹ä¸€ä¸ªæŽ§ä»¶
            pWnd->MoveWindow(&newRect);
            AdjustControlFont(pWnd, newRect.Width(), newRect.Height());
        }
        pWnd = pWnd->GetNextWindow();
    }
}
@@ -256,23 +259,10 @@
    int fontSize = nHeight / 2;
    if (fontSize < 8) fontSize = 8;
    // æ£€æŸ¥å­—体是否已经存在
    auto it = m_mapFonts.find(fontSize);
    if (it == m_mapFonts.end()) {
        // åŠ¨æ€åˆ›å»ºæ–°å­—ä½“
        CFont* newFont = new CFont();
        LOGFONT logFont = { 0 };
        _tcscpy_s(logFont.lfFaceName, _T("Segoe UI"));
        logFont.lfHeight = -fontSize;
        logFont.lfQuality = CLEARTYPE_QUALITY; // å¯ç”¨ ClearType æŠ—锯齿
        newFont->CreateFontIndirect(&logFont);
    // èŽ·å–æˆ–åˆ›å»ºå­—ä½“
    CFont* pFont = GetOrCreateFont(fontSize);
        // å­˜å‚¨åˆ°å­—体管理容器中
        m_mapFonts[fontSize] = newFont;
        it = m_mapFonts.find(fontSize);
    }
    pWnd->SetFont(it->second);
    pWnd->SetFont(pFont);
    pWnd->Invalidate(); // åˆ·æ–°æŽ§ä»¶æ˜¾ç¤º
}
@@ -302,6 +292,7 @@
    ON_CBN_SELCHANGE(IDC_COMBO_TYPE, &CSystemLogManagerDlg::OnSelchangeComboType)
    ON_CBN_SELCHANGE(IDC_COMBO_USER, &CSystemLogManagerDlg::OnSelchangeComboUser)
    ON_WM_SIZE()
    ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()
@@ -314,9 +305,6 @@
    // TODO:  åœ¨æ­¤æ·»åŠ é¢å¤–çš„åˆå§‹åŒ–
    SetWindowText(_T("系统运行日志"));
    // è®¾ç½®é»˜è®¤å­—体
    SetDefaultFont();
    m_nCurrentPage = 1;  // ä»Žç¬¬ä¸€é¡µå¼€å§‹
    m_nTotalPages = 1;   // é»˜è®¤æ€»é¡µæ•°ä¸º 1
@@ -347,6 +335,34 @@
    m_nInitialWidth = clientRect.Width();
    m_nInitialHeight = clientRect.Height();
    // åˆå§‹åŒ–默认字体
    CFont* pDefaultFont = GetOrCreateFont(12);
    // éåŽ†æ‰€æœ‰å­æŽ§ä»¶ï¼Œè®°å½•åˆå§‹ä½ç½®å¹¶è®¾ç½®é»˜è®¤å­—ä½“
    CWnd* pWnd = GetWindow(GW_CHILD);
    while (pWnd) {
        int nCtrlID = pWnd->GetDlgCtrlID();
        if (nCtrlID != -1) {
            // è®°å½•控件初始布局
            CRect ctrlRect;
            pWnd->GetWindowRect(&ctrlRect);
            ScreenToClient(&ctrlRect);
            m_mapCtrlLayouts[nCtrlID] = ctrlRect;
            // è·³è¿‡ç‰¹æ®ŠæŽ§ä»¶ï¼ˆå¦‚ MFCGridCtrl)
            TCHAR szClassName[256];
            GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
            if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) {
                pWnd = pWnd->GetNextWindow();
                continue;
            }
            // è®¾ç½®é»˜è®¤å­—体
            pWnd->SetFont(pDefaultFont);
        }
        pWnd = pWnd->GetNextWindow();
    }
    GetWindowRect(&dlgRect);
    int dlgWidth = dlgRect.Width() * 2;
    int dlgHeight = dlgRect.Height() * 2;
@@ -375,11 +391,25 @@
    CDialogEx::OnSize(nType, cx, cy);
    // TODO: åœ¨æ­¤å¤„添加消息处理程序代码
    CRect rect;
    GetClientRect(&rect);
    if (nType == SIZE_MINIMIZED || m_mapCtrlLayouts.empty()) {
        return;
    }
    float dScaleX = static_cast<float>(cx) / m_nInitialWidth;
    float dScaleY = static_cast<float>(cy) / m_nInitialHeight;
    // éåŽ†å¯¹è¯æ¡†ä¸­çš„æ‰€æœ‰æŽ§ä»¶
    AdjustControls(rect.Width(), rect.Height());
    AdjustControls(dScaleX, dScaleY);
}
void CSystemLogManagerDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // TODO: åœ¨æ­¤æ·»åŠ æ¶ˆæ¯å¤„ç†ç¨‹åºä»£ç å’Œ/或调用默认值
    lpMMI->ptMinTrackSize.x = 400; // æœ€å°å®½åº¦
    lpMMI->ptMinTrackSize.y = 300; // æœ€å°é«˜åº¦
    CDialogEx::OnGetMinMaxInfo(lpMMI);
}
SourceCode/Bond/BondEq/View/SystemLogManagerDlg.h
@@ -20,9 +20,10 @@
private:
    void InitSystemLogManager();
    void FillSystemLogManager();
    CFont* GetOrCreateFont(int nFontSize);
    void UpdatePageInfo();
    void SetDefaultFont();
    void AdjustControls(int nWidth, int nHeight);
    void AdjustControls(float dScaleX, float dScaleY);
    void AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight);
    void AdjustComboBoxStyle(CComboBox& comboBox);
    void AdjustDateTimeCtrlStyle(CDateTimeCtrl& dateTimeCtrl);
@@ -32,6 +33,7 @@
    int m_nInitialHeight;  // åˆå§‹é«˜åº¦
    int m_nCurrentPage;    // å½“前页码
    int m_nTotalPages;     // æ€»é¡µæ•°
    std::map<int, CRect> m_mapCtrlLayouts;    // å­˜å‚¨æŽ§ä»¶çš„初始布局信息
    std::map<int, CFont*> m_mapFonts; // ç®¡ç†å­—体的容器,键为字体大小
private:
@@ -50,6 +52,7 @@
public:
    virtual BOOL OnInitDialog();
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);
    afx_msg void OnBnClickedButtonSearch();
    afx_msg void OnBnClickedButtonPrevPage();
    afx_msg void OnBnClickedButtonNextPage();
SourceCode/Bond/BondEq/View/UserManagerDlg.cpp
@@ -20,7 +20,8 @@
CUserManagerDlg::CUserManagerDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DIALOG_USER_MANAGER, pParent)
{
    m_nInitialWidth = 0;
    m_nInitialHeight = 0;
}
CUserManagerDlg::~CUserManagerDlg()
@@ -349,25 +350,27 @@
    return false;
}
void CUserManagerDlg::SetDefaultFont()
CFont* CUserManagerDlg::GetOrCreateFont(int nFontSize)
{
    CFont* defaultFont = nullptr;
    // å¦‚果字体管理容器中有默认大小(如 12)的字体,直接使用
    auto it = m_mapFonts.find(12);
    auto it = m_mapFonts.find(nFontSize);
    if (it != m_mapFonts.end()) {
        defaultFont = it->second;
        return it->second;
    }
    else {
        // åˆ›å»ºé»˜è®¤å­—体
        defaultFont = new CFont();
    CFont* font = new CFont();
        LOGFONT logFont = { 0 };
        _tcscpy_s(logFont.lfFaceName, _T("Segoe UI"));
        logFont.lfHeight = -12;
    logFont.lfHeight = -nFontSize;
        logFont.lfQuality = CLEARTYPE_QUALITY;
        defaultFont->CreateFontIndirect(&logFont);
        m_mapFonts[12] = defaultFont; // å­˜å‚¨åˆ°å­—体管理容器
    font->CreateFontIndirect(&logFont);
    m_mapFonts[nFontSize] = font;
    return font;
    }
void CUserManagerDlg::SetDefaultFont()
{
    CFont* defaultFont = GetOrCreateFont(12);
    // éåŽ†æ‰€æœ‰æŽ§ä»¶ï¼Œåº”ç”¨é»˜è®¤å­—ä½“
    CWnd* pWnd = GetWindow(GW_CHILD);
@@ -385,41 +388,40 @@
    }
}
void CUserManagerDlg::AdjustControls(int nWidth, int nHeight)
void CUserManagerDlg::AdjustControls(float dScaleX, float dScaleY)
{
    CWnd* pWnd = GetWindow(GW_CHILD);
    while (pWnd) {
        UINT nCtrlID = pWnd->GetDlgCtrlID();
        CRect ctrlRect;
        pWnd->GetWindowRect(&ctrlRect);
        ScreenToClient(&ctrlRect);
        // è®¡ç®—控件的新位置和大小,按比例调整
        int newX = (int)(ctrlRect.left * (nWidth / (float)m_nInitialWidth));
        int newY = (int)(ctrlRect.top * (nHeight / (float)m_nInitialHeight));
        int newWidth = (int)(ctrlRect.Width() * (nWidth / (float)m_nInitialWidth));
        int newHeight = (int)(ctrlRect.Height() * (nHeight / (float)m_nInitialHeight));
        int nCtrlID = pWnd->GetDlgCtrlID();
        if (nCtrlID != -1 && m_mapCtrlLayouts.find(nCtrlID) != m_mapCtrlLayouts.end())
        {
            CRect originalRect = m_mapCtrlLayouts[nCtrlID];
            CRect newRect(
                static_cast<int>(originalRect.left * dScaleX),
                static_cast<int>(originalRect.top * dScaleY),
                static_cast<int>(originalRect.right * dScaleX),
                static_cast<int>(originalRect.bottom * dScaleY));
        TCHAR szClassName[256];
        GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
        if (_tcsicmp(szClassName, _T("ComboBox")) == 0) {
            CComboBox* pComboBox = (CComboBox*)pWnd;
            pComboBox->SetItemHeight(-1, nHeight);  // -1 è¡¨ç¤ºæ‰€æœ‰é¡¹çš„高度
                pComboBox->SetItemHeight(-1, newRect.Height());  // -1 è¡¨ç¤ºæ‰€æœ‰é¡¹çš„高度
        }
        if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) {
            CGridCtrl* pGridCtrl = (CGridCtrl*)pWnd;
            pGridCtrl->SetDefCellHeight(newHeight / 21);
                pGridCtrl->SetDefCellHeight(newRect.Height() / 21);
            pGridCtrl->ExpandColumnsToFit(TRUE);
                pGridCtrl->ExpandLastColumn();
            pGridCtrl->Invalidate();
                pGridCtrl->UpdateWindow();
        }
        pWnd->MoveWindow(newX, newY, newWidth, newHeight);
        AdjustControlFont(pWnd, newWidth, newHeight);
        // èŽ·å–ä¸‹ä¸€ä¸ªæŽ§ä»¶
            pWnd->MoveWindow(&newRect);
            AdjustControlFont(pWnd, newRect.Width(), newRect.Height());
        }
        pWnd = pWnd->GetNextWindow();
    }
}
@@ -465,6 +467,7 @@
    ON_BN_CLICKED(IDC_BUTTON_DEL, &CUserManagerDlg::OnBnClickedButtonDel)
    ON_BN_CLICKED(IDOK, &CUserManagerDlg::OnBnClickedOk)
    ON_BN_CLICKED(IDC_BUTTON_INSERT, &CUserManagerDlg::OnBnClickedButtonInsert)
    ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()
@@ -480,12 +483,37 @@
    SetWindowText(_T("用户管理"));
    SystemParametersInfo(SPI_GETWORKAREA, 0, &screenRect, 0);
    // è®¾ç½®é»˜è®¤å­—体
    SetDefaultFont();
    GetClientRect(&clientRect);
    m_nInitialWidth = clientRect.Width();
    m_nInitialHeight = clientRect.Height();
    // åˆå§‹åŒ–默认字体
    CFont* pDefaultFont = GetOrCreateFont(12);
    // éåŽ†æ‰€æœ‰å­æŽ§ä»¶ï¼Œè®°å½•åˆå§‹ä½ç½®å¹¶è®¾ç½®é»˜è®¤å­—ä½“
    CWnd* pWnd = GetWindow(GW_CHILD);
    while (pWnd) {
        int nCtrlID = pWnd->GetDlgCtrlID();
        if (nCtrlID != -1) {
            // è®°å½•控件初始布局
            CRect ctrlRect;
            pWnd->GetWindowRect(&ctrlRect);
            ScreenToClient(&ctrlRect);
            m_mapCtrlLayouts[nCtrlID] = ctrlRect;
            // è·³è¿‡ç‰¹æ®ŠæŽ§ä»¶ï¼ˆå¦‚ MFCGridCtrl)
            TCHAR szClassName[256];
            GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
            if (_tcsicmp(szClassName, _T("MFCGridCtrl")) == 0) {
                pWnd = pWnd->GetNextWindow();
                continue;
            }
            // è®¾ç½®é»˜è®¤å­—体
            pWnd->SetFont(pDefaultFont);
        }
        pWnd = pWnd->GetNextWindow();
    }
    GetWindowRect(&dlgRect);
    int dlgWidth = dlgRect.Width() * 3;
@@ -509,17 +537,33 @@
    // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
void CUserManagerDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType, cx, cy);
    // TODO: åœ¨æ­¤å¤„添加消息处理程序代码
    CRect rect;
    GetClientRect(&rect);
    if (nType == SIZE_MINIMIZED || m_mapCtrlLayouts.empty()) {
        return;
    }
    float dScaleX = static_cast<float>(cx) / m_nInitialWidth;
    float dScaleY = static_cast<float>(cy) / m_nInitialHeight;
    // éåŽ†å¯¹è¯æ¡†ä¸­çš„æ‰€æœ‰æŽ§ä»¶
    AdjustControls(rect.Width(), rect.Height());
    AdjustControls(dScaleX, dScaleY);
}
void CUserManagerDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // TODO: åœ¨æ­¤æ·»åŠ æ¶ˆæ¯å¤„ç†ç¨‹åºä»£ç å’Œ/或调用默认值
    lpMMI->ptMinTrackSize.x = 400; // æœ€å°å®½åº¦
    lpMMI->ptMinTrackSize.y = 300; // æœ€å°é«˜åº¦
    CDialogEx::OnGetMinMaxInfo(lpMMI);
}
void CUserManagerDlg::OnGridComboSelChange(NMHDR* pNMHDR, LRESULT* pResult)
{
@@ -550,11 +594,13 @@
    *pResult = 0;
}
void CUserManagerDlg::OnBnClickedButtonAdd()
{
    // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
    AddRow(&m_gridUserManager);
}
void CUserManagerDlg::OnBnClickedButtonInsert()
{
@@ -619,12 +665,14 @@
    m_gridUserManager.UpdateWindow();
}
void CUserManagerDlg::OnBnClickedButtonDel()
{
    // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
    DeleteSelectedRow(&m_gridUserManager);
}
void CUserManagerDlg::OnBnClickedOk()
{
    // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
SourceCode/Bond/BondEq/View/UserManagerDlg.h
@@ -23,13 +23,15 @@
    void AddRow(CGridCtrl* pGridCtrl);
    void DeleteSelectedRow(CGridCtrl* pGridCtrl);
    bool IsUsernameDuplicate(const CString& username);
    CFont* GetOrCreateFont(int nFontSize);
    void SetDefaultFont();
    void AdjustControls(int nWidth, int nHeight);
    void AdjustControls(float dScaleX, float dScaleY);
    void AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight);
private:
    int m_nInitialWidth;
    int m_nInitialHeight;
    std::map<int, CRect> m_mapCtrlLayouts;
    std::map<int, CFont*> m_mapFonts;
    std::map<CString, CString> m_mapRoleDescriptions;
@@ -43,6 +45,7 @@
public:
    virtual BOOL OnInitDialog();
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);
    afx_msg void OnGridComboSelChange(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnBnClickedButtonAdd();
    afx_msg void OnBnClickedButtonInsert();