作為一個mfc的初學者,難免會遇到這樣的問題,視窗可以改變大小,而其中的控制項大小也隨之改變,那怎麼樣去做呢。
1.對應視窗的屬性Maximize Box和Minimize Box設定為true,從而能夠使視窗最大化和最小化,Border屬性設定為Resizing從而可以改變視窗的大小。
2.在訊息有個WM_SIZE,添加函數OnSize,這樣可以在函數內調整控制項的大小,特別說明很多代碼中利用當前控制項比值與視窗大小比值再乘上當前視窗大小來改變控制項大小,但是由於精度的問題,調整多次就會出問題,那麼這裡可以利用一個結構體儲存每個控制項與原視窗的比值。
先建立結構體:
typedef struct Rect
{
public:
int Id;
double scale[4];
Rect()
{
Id=-2;
scale[0]=0;
scale[1]=0;
scale[2]=0;
scale[3]=0;
}
Rect(const Rect& c)
{
*this=c;
}
}control;
其中Id用來儲存控制項的Id,但是這裡初始化為-2代表著裡面沒有控制項,所以你要注意你的控制項中沒有宏定義Id為-2的,這裡算是一個不完善點。
然後在類的成員變數中添加變數
CRect m_rect;//擷取最開始的視窗大小
control m_control[10];//最多10個控制項,這裡代碼可移植性沒那麼強,但是作者能力比較低,直接用數字代表,也沒有用宏定義
然後就可以在OnSize中添加方法了
//控制控制項大小,使得隨視窗大小變化而變化
void CChangeDBToolDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
//擷取控制項得到大小以及原大小,方便進行比例調整
CWnd *pWnd;
int woc;
//列出所有控制項
HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD);
//判定是否為最小狀態,是的話就不進行重繪
if(!cx||!cy)
{
return;
}
else
{
while(hwndChild)
{
woc=::GetDlgCtrlID(hwndChild);//獲得控制項的ID
pWnd= GetDlgItem(woc); //擷取ID為woc的空間的控制代碼
int i=0;
if(pWnd)
{
CRect rect; //擷取當前視窗的大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//將控制項大小轉換為在對話方塊中的地區座標
for( i=0;i<10;i++)
{
if(m_control[i].Id==woc)//如果儲存的有該控制項與視窗比值,直接乘上當前視窗大小
{
rect.left = m_control[i].scale[0] * cx;
rect.right = m_control[i].scale[1] * cx;
rect.top = m_control[i].scale[2] * cy;
rect.bottom = m_control[i].scale[3] * cy;
break;
}
}
if(i==10)
{
for(i=0;i<10;i++)
{
if(m_control[i].Id==-2)//沒有找到控制項的比值,則選擇一個沒有資料的空間進行儲存
{
m_control[i].Id=woc;
m_control[i].scale[0] = (double)rect.left/m_rect.Width();//注意類型轉換,不然儲存成long型就直接為0了
m_control[i].scale[1] = (double)rect.right/m_rect.Width();
m_control[i].scale[2] = (double)rect.top/m_rect.Height();
m_control[i].scale[3] = (double)rect.bottom/m_rect.Height();
/////調整控制項大小
rect.left = m_control[i].scale[0] * cx;
rect.right = m_control[i].scale[1] * cx;
rect.top = m_control[i].scale[2] * cy;
rect.bottom = m_control[i].scale[3] * cy;
break;
}
}
}
pWnd->MoveWindow(rect);//設定控制項大小
}
hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);
}
GetClientRect(&m_rect);//將變化後的對話方塊大小設為舊大小
}
// TODO: 在此處添加訊息處理常式代碼
}
其實網上有很多這種代碼,但是很多都沒有儲存比值,導致多次變化後其位置會改變,但是代碼還有不足之處是一些字型控制項等不能改變大小,我還在調一些東西,學會了後面發。