C++基于MFC设置对话框、所有控件和所有控件上的字体等比例放缩程序
时间: 2024-02-19 11:58:52 浏览: 104
C++ MFC开发的设置字体软件
5星 · 资源好评率100%
下面是一个基于MFC的对话框和所有控件以及所有控件上的字体进行等比例放缩的示例代码:
```
void CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 获取对话框的原始尺寸和所有控件的原始位置和大小
GetClientRect(&m_rectDlg);
CWnd* pWnd = GetWindow(GW_CHILD);
while (pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
m_mapCtrlRect[pWnd] = rect;
m_mapCtrlFont[pWnd] = new CFont;
m_mapCtrlFont[pWnd]->CreateFontIndirect(&pWnd->GetFont()->lf);
pWnd = pWnd->GetNextWindow(GW_HWNDNEXT);
}
}
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// 计算变化比例
double scalex = (double)cx / m_rectDlg.Width();
double scaley = (double)cy / m_rectDlg.Height();
// 设置所有控件的新位置和大小
for (auto it = m_mapCtrlRect.begin(); it != m_mapCtrlRect.end(); ++it)
{
CWnd* pWnd = it->first;
CRect rect = it->second;
int x = (int)(rect.left * scalex);
int y = (int)(rect.top * scaley);
int w = (int)(rect.Width() * scalex);
int h = (int)(rect.Height() * scaley);
pWnd->SetWindowPos(NULL, x, y, w, h, SWP_NOZORDER | SWP_NOREDRAW);
}
}
void CMyDlg::OnSetFont(CFont* pFont)
{
CDialogEx::OnSetFont(pFont);
// 设置所有控件的新字体
for (auto it = m_mapCtrlFont.begin(); it != m_mapCtrlFont.end(); ++it)
{
CWnd* pWnd = it->first;
CFont* pOrigFont = it->second;
LOGFONT lf;
pOrigFont->GetLogFont(&lf);
pFont->GetLogFont(&lf);
it->second->DeleteObject();
it->second->CreateFontIndirect(&lf);
pWnd->SetFont(it->second);
}
}
void CMyDlg::OnDestroy()
{
// 释放所有控件的新字体
for (auto it = m_mapCtrlFont.begin(); it != m_mapCtrlFont.end(); ++it)
{
delete it->second;
}
CDialogEx::OnDestroy();
}
```
在这个示例中,我们通过获取对话框的原始尺寸和所有控件的原始位置和大小,在对话框的OnInitDialog()函数中保存了这些信息和原始字体。
在对话框的OnSize()函数中,我们计算了对话框的变化比例,然后遍历所有控件,根据比例计算了控件的新位置和大小,并将其设置到相应的控件上。
在对话框的OnSetFont()函数中,我们获取了新的字体并设置到所有控件上。
在对话框的OnDestroy()函数中,我们释放了所有控件的新字体。
阅读全文