LAPTOP-T815PCOQ\25526
2024-11-21 07b2cefe6e0dfe8bc530aab3b58d4159502ceba8
SourceCode/Bond/BondEq/AxisSettingsDlg.cpp
@@ -20,11 +20,104 @@
CAxisSettingsDlg::~CAxisSettingsDlg()
{
   for (auto& pair : m_mapFonts) {
      if (pair.second) {
         pair.second->DeleteObject();
         delete pair.second;
      }
   }
   m_mapFonts.clear();
}
void CAxisSettingsDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialogEx::DoDataExchange(pDX);
}
void CAxisSettingsDlg::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; // 存储到字体管理容器
   }
   // 遍历所有控件,应用默认字体
   CWnd* pWnd = GetWindow(GW_CHILD);
   while (pWnd) {
      pWnd->SetFont(defaultFont, TRUE);
      pWnd = pWnd->GetNextWindow();
   }
}
void CAxisSettingsDlg::AdjustControls(int nWidth, int nHeight)
{
   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));
      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 表示所有项的高度
      }
      pWnd->MoveWindow(newX, newY, newWidth, newHeight);
      AdjustControlFont(pWnd, newWidth, newHeight);
      // 获取下一个控件
      pWnd = pWnd->GetNextWindow();
   }
}
void CAxisSettingsDlg::AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight)
{
   // 根据控件高度动态调整字体大小
   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);
      // 存储到字体管理容器中
      m_mapFonts[fontSize] = newFont;
      it = m_mapFonts.find(fontSize);
   }
   pWnd->SetFont(it->second);
   pWnd->Invalidate(); // 刷新控件显示
}
@@ -61,15 +154,29 @@
   // TODO:  在此添加额外的初始化
   //ModifyStyle(0, WS_THICKFRAME | WS_SIZEBOX);
   CRect rect;
   GetClientRect(&rect);
   m_nInitialWidth = rect.Width();
   m_nInitialHeight = rect.Height();
   // 设置默认字体
   SetDefaultFont();
   rect.right *= 1.5;
   rect.bottom *= 1.5;
   // 调整对话框大小
   MoveWindow(rect);
   CRect screenRect, dlgRect, clientRect;
   GetClientRect(&clientRect);
   m_nInitialWidth = clientRect.Width();
   m_nInitialHeight = clientRect.Height();
   GetWindowRect(&dlgRect);
   int dlgWidth = dlgRect.Width() * 2;
   int dlgHeight = dlgRect.Height() * 2;
   SystemParametersInfo(SPI_GETWORKAREA, 0, &screenRect, 0);
   if (dlgWidth > screenRect.Width()) {
      dlgWidth = screenRect.Width();
   }
   if (dlgHeight > screenRect.Height()) {
      dlgHeight = screenRect.Height();
   }
   int centerX = screenRect.left + (screenRect.Width() - dlgWidth) / 2;
   int centerY = screenRect.top + (screenRect.Height() - dlgHeight) / 2;
   MoveWindow(centerX, centerY, dlgWidth, dlgHeight);
   return TRUE;  // return TRUE unless you set the focus to a control
   // 异常: OCX 属性页应返回 FALSE
@@ -189,57 +296,4 @@
void CAxisSettingsDlg::OnBnClickedButtonAxisTestStop()
{
   // TODO: 在此添加控件通知处理程序代码
}
void CAxisSettingsDlg::AdjustControls(int nWidth, int nHeight)
{
   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));
      pWnd->MoveWindow(newX, newY, newWidth, newHeight);
      AdjustControlFont(pWnd, newWidth, newHeight);
      // 获取下一个控件
      pWnd = pWnd->GetNextWindow();
   }
}
void CAxisSettingsDlg::AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight)
{
   TCHAR szClassName[256];
   GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
   if (_tcsicmp(szClassName, _T("Static")) == 0) {
      CStatic* pStatic = (CStatic*)pWnd;
      pStatic->ModifyStyle(0, SS_CENTER | SS_CENTERIMAGE);
      return;
   }
   if (_tcsicmp(szClassName, _T("ComboBox")) == 0) {
      CComboBox* pComboBox = (CComboBox*)pWnd;
      pComboBox->SetItemHeight(-1, nHeight);  // -1 表示所有项的高度
   }
   int fontSize = nHeight - 10;
   CFont* pCurrentFont = pWnd->GetFont();
   LOGFONT logFont;
   pCurrentFont->GetLogFont(&logFont);
   logFont.lfHeight = -fontSize;
   CFont newFont;
   newFont.CreateFontIndirect(&logFont);
   pWnd->SetFont(&newFont);
   pWnd->Invalidate();
}
}