因为需要对所有对话框的控件和尺寸进行公共的操作,因此考虑把公有的代码封装成一个类。
但是自定义类完后,编译时总出问题,最后搞定了。总结过程如下。
1. 建立头文件。
#pragma once \\只编译一次
#include "stdafx.h" \\必须包含class ccsize : public CDialogEx \\从对话框来进行操作。
{
public:
CWnd *pdlg \\ 需要调整的对话框的指针。用它来进行操作。
\\主对话框可以用AfxGetMainWnd()找到,其他的可以通过先赋值的办法,找到。或者直接this
public:CRect GetContr(UINT nID);
void SetSizePosFon(UINT nID, CRect rec_contr, CRect m_rect, int cx, int cy);
void Getcxcy(int *cx, int *cy, CRect *m_rect);
};
2.建立cpp文件。 首先一定右键点击该cpp文件,选择属性,要选中“不预编译头”。然后再敲击相应的代码。
#include "size.h"
void ccsize::Getcxcy(int *cx, int *cy, CRect *m_rect) //返回cx,cy,m_rect
{
HDC hDC = ::GetDC(NULL);//获得屏幕的DC
*cx = ::GetDeviceCaps(hDC, HORZRES) + //获取屏幕的水平尺寸
GetSystemMetrics(SM_CXBORDER);
*cy = ::GetDeviceCaps(hDC, VERTRES) + //获取屏幕的垂直尺寸
GetSystemMetrics(SM_CYBORDER);
::ReleaseDC(NULL, hDC);
pdlg->GetClientRect(m_rect);
}
CRect ccsize:: GetContr(UINT nID)
{
CWnd *pWnd;
CRect rec_contr; //控件所占矩形
pWnd = pdlg->GetDlgItem(nID);
pWnd->GetWindowRect(&rec_contr); //获取控件变化前的大小
pdlg->ScreenToClient(&rec_contr); //将控件大小转化为在对话框中的区域坐标
return(rec_contr);
}
// 当对话框尺寸改变,动态改变控件大小
void ccsize:: SetSizePosFon(UINT nID, CRect rec_contr, CRect m_rect, int cx, int cy)
//nID为控件ID,x,y分别为对话框的当前长和宽,rec_contr为控件的原始尺寸,m_rect为原客户区大小
{rec_contr.left = float(rec_contr.left*cx / m_rect.Width()); //按照比例调整空间的新位置
rec_contr.top = float(rec_contr.top*cy / m_rect.Height());
rec_contr.bottom = float(rec_contr.bottom*cy / m_rect.Height());
rec_contr.right = float(rec_contr.right*cx / m_rect.Width());
pdlg->GetDlgItem(nID)->MoveWindow(rec_contr); //伸缩控件
//按钮字体大小,字形设置
CFont * f;
f = new CFont;
f->CreateFont(15 * cy / m_rect.Height(), // nHeight
10 * cx / m_rect.Width(), // nWidth
0, // nEscapement
0, // nOrientation
FW_BOLD, // nWeight
TRUE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("楷体")); // lpszFac
pdlg->GetDlgItem(nID)->SetFont(f);
}
3. 在使用时,可以用如下代码
int cx, cy;
ccsize ccc;
ccc.pdlg = AfxGetMainWnd(); //也可以用ccc.pdlg = this;
ccc.Getcxcy(&cx, &cy, &m_rect);
rect_IDCANCEL = ccc.GetContr(IDCANCEL);
ccc.SetSizePosFon(IDCANCEL, rect_IDCANCEL, m_rect, cx, cy);
rect_IDOK = ccc.GetContr(IDOK);
ccc.SetSizePosFon(IDOK, rect_IDOK, m_rect, cx, cy);
rect_IDCPIC1 = ccc.GetContr(IDC_PIC1);
ccc.SetSizePosFon(IDC_PIC1, rect_IDCPIC1, m_rect, cx, cy);
rect_IDCSTA1 = ccc.GetContr(IDC_STA1);
ccc.SetSizePosFon(IDC_STA1, rect_IDCSTA1, m_rect, cx, cy);
需要特别指出,CFont * f;
f = new CFont;
以后应该要delete f; 但是一旦删除以后,字体更改就失效。在网上找了很多说明,有说不用删的。但是为了保险起见,可以在整个程序
退出的时候,删除。比如在destroy消息中删除,或者oncancel消息中删除。