1. 程式人生 > >在MFC中怎麼樣讓控制元件的大小隨著主窗體大小改變而改變

在MFC中怎麼樣讓控制元件的大小隨著主窗體大小改變而改變

轉載:https://blog.csdn.net/business122/article/details/11611421 MFC 控制元件隨著視窗大小變化 VC++

剛接觸MFC不久,對MFC的許多函式和功能還不是很瞭解。所以,在仿照書本開發一個仿QQ的通訊程式的時候,就碰到了一個怎麼樣使控制元件隨著窗體變化的問題。好了,廢話不多說,直接上主窗體圖:

現在,要實現的功能如下:

使控制元件CLISTBOX類物件視窗(IDC_QQLISTBOX)以及兩個CBUTTON類物件(IDC_MAIL)、(IDC_WEB)隨著主窗體的變化而自動變化。

具體操作步驟:

1、在主對話方塊類class CQQDlg : public CDialog中新增物件CRect m_rect,用來記錄當前對話方塊的大小。並在初始化函式OnInitialDialog()中獲取該大小GetClientRect (&m_rect);值得注意的是,初始化函式中的這一步並不是必須的,而且如果是在主窗體生成前使用此函式,還可能會報錯,故建議不要這個操作。

2、使用Ctrl+W快捷鍵彈出MFC ClassWizard窗體,選擇主窗體ID,並在Message Map選項中選擇WM_SIZE,點選確定,成功添加了OnSize()函式。

它的作用在於系統會自動檢測窗體的變化情況,一旦發生變化,立即自動呼叫該函式。如下圖所示:

3、定義OnSize()函式,程式碼如下:

void CQQDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

/ / nType==1不可以省略,否則由最小化恢復為正常狀態下的時候會出錯

//nType是一個列舉型別,主要是指定所請求的不同的調整大小。這個引數可以是下列值之一:SIZE_MAXIMIZEDSIZE_MINIMIZEDSIZE_RESTORED

SIZE_MAXHIDESIZE_MAXSHOW 其原型可以在msdn上檢視


if(nType==1) return; //最小化則什麼都不做
CWnd *pWnd;
pWnd = GetDlgItem(IDC_QQLIST); //獲取控制元件控制代碼
ChangeSize(pWnd,cx,cy); //呼叫changesize()函式
pWnd = GetDlgItem(IDC_WEB); //獲取控制元件控制代碼
ChangeSize(pWnd,cx,cy);//呼叫changesize()函式

//ChangeSize(pWnd,cx,cy)是一個自定義的函式,需要在類的protect屬性中進行新增宣告afx_msg void ChangeSize(CWnd * pWnd, int cx, int cy);
pWnd = GetDlgItem(IDC_MAIL);
ChangeSize(pWnd,cx,cy);
GetClientRect(&m_rect); //將變化後的對話方塊設定為舊大小
}
void CQQDlg::ChangeSize(CWnd * pWnd, int cx, int cy)
{
if (pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect); //獲取控制元件變化前的大小
ScreenToClient(&rect);//將控制元件大小轉換為在對話方塊中的區域座標
rect.left=rect.left*cx/m_rect.Width();//調整控制元件大小 ,cx/m_rect.Width()為對話方塊在橫向的變化比例
rect.right=rect.right*cx/m_rect.Width(); //cx儲存的是變化後的寬度,cy儲存的是變化後的高度
rect.top=rect.top*cy/m_rect.Height(); //m_rect.height()表示的是變化前主窗體的高度
rect.bottom=rect.bottom*cy/m_rect.Height();
pWnd->MoveWindow(rect);//設定控制元件大小
}
}

注意:GetWindowRect()與GetClientRect(),ScreenToClient()與ClientToScreen()之間的區別

1、GetWindowRect() 是獲得視窗在螢幕座標系下的RECT座標,包括非客戶區(標題欄和下面的其它邊框)和客戶區(矩形區域),從而得到視窗的大小和相對螢幕左上角(0,0)的座標。

2、GetClientRect() 取得視窗客戶區(不包括非客戶區)在客戶區座標系下的RECT座標,可以得到視窗的大小,而不能得到相對螢幕的位置,因為這個矩陣是在客戶區座標系下(相對於視窗客戶區的左上角)的

3、ScreenToClient():把螢幕座標系下的RECT座標轉換為客戶區座標系下的RECT座標。

4、 ClientToScreen():把客戶區下Rect座標系轉化為螢幕座標系下的座標

對GetWindowRect取得的矩陣ScreenToClient後,矩陣的大小沒有變小,left,top是視窗的左上角的座標,相對視窗客戶區左上角。   

對GetClientRect取得的矩陣ClientToScreen後,矩陣的大小也沒有變大,新得到的矩陣是視窗客戶區在螢幕座標系上的RECT。

參考資料:

http://www.cnblogs.com/madhenry/archive/2011/04/25/2027694.html

http://blog.csdn.net/chw1989/article/details/7488711

http://bbs.csdn.net/topics/310002564

            </div>
                </div>
MFC 控制元件隨著視窗大小變化 VC++

剛接觸MFC不久,對MFC的許多函式和功能還不是很瞭解。所以,在仿照書本開發一個仿QQ的通訊程式的時候,就碰到了一個怎麼樣使控制元件隨著窗體變化的問題。好了,廢話不多說,直接上主窗體圖:

現在,要實現的功能如下:

使控制元件CLISTBOX類物件視窗(IDC_QQLISTBOX)以及兩個CBUTTON類物件(IDC_MAIL)、(IDC_WEB)隨著主窗體的變化而自動變化。

具體操作步驟:

1、在主對話方塊類class CQQDlg : public CDialog中新增物件CRect m_rect,用來記錄當前對話方塊的大小。並在初始化函式OnInitialDialog()中獲取該大小GetClientRect (&m_rect);值得注意的是,初始化函式中的這一步並不是必須的,而且如果是在主窗體生成前使用此函式,還可能會報錯,故建議不要這個操作。

2、使用Ctrl+W快捷鍵彈出MFC ClassWizard窗體,選擇主窗體ID,並在Message Map選項中選擇WM_SIZE,點選確定,成功添加了OnSize()函式。它的作用在於系統會自動檢測窗體的變化情況,一旦發生變化,立即自動呼叫該函式。如下圖所示:

3、定義OnSize()函式,程式碼如下:

void CQQDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

/ / nType==1不可以省略,否則由最小化恢復為正常狀態下的時候會出錯

//nType是一個列舉型別,主要是指定所請求的不同的調整大小。這個引數可以是下列值之一:SIZE_MAXIMIZEDSIZE_MINIMIZEDSIZE_RESTORED SIZE_MAXHIDESIZE_MAXSHOW 其原型可以在msdn上檢視


if(nType==1) return; //最小化則什麼都不做
CWnd *pWnd;
pWnd = GetDlgItem(IDC_QQLIST); //獲取控制元件控制代碼
ChangeSize(pWnd,cx,cy); //呼叫changesize()函式
pWnd = GetDlgItem(IDC_WEB); //獲取控制元件控制代碼
ChangeSize(pWnd,cx,cy);//呼叫changesize()函式

//ChangeSize(pWnd,cx,cy)是一個自定義的函式,需要在類的protect屬性中進行新增宣告afx_msg void ChangeSize(CWnd * pWnd, int cx, int cy);
pWnd = GetDlgItem(IDC_MAIL);
ChangeSize(pWnd,cx,cy);
GetClientRect(&m_rect); //將變化後的對話方塊設定為舊大小
}
void CQQDlg::ChangeSize(CWnd * pWnd, int cx, int cy)
{
if (pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect); //獲取控制元件變化前的大小
ScreenToClient(&rect);//將控制元件大小轉換為在對話方塊中的區域座標
rect.left=rect.left*cx/m_rect.Width();//調整控制元件大小 ,cx/m_rect.Width()為對話方塊在橫向的變化比例
rect.right=rect.right*cx/m_rect.Width(); //cx儲存的是變化後的寬度,cy儲存的是變化後的高度
rect.top=rect.top*cy/m_rect.Height(); //m_rect.height()表示的是變化前主窗體的高度
rect.bottom=rect.bottom*cy/m_rect.Height();
pWnd->MoveWindow(rect);//設定控制元件大小
}
}

注意:GetWindowRect()與GetClientRect(),ScreenToClient()與ClientToScreen()之間的區別

1、GetWindowRect() 是獲得視窗在螢幕座標系下的RECT座標,包括非客戶區(標題欄和下面的其它邊框)和客戶區(矩形區域),從而得到視窗的大小和相對螢幕左上角(0,0)的座標。

2、GetClientRect() 取得視窗客戶區(不包括非客戶區)在客戶區座標系下的RECT座標,可以得到視窗的大小,而不能得到相對螢幕的位置,因為這個矩陣是在客戶區座標系下(相對於視窗客戶區的左上角)的

3、ScreenToClient():把螢幕座標系下的RECT座標轉換為客戶區座標系下的RECT座標。

4、 ClientToScreen():把客戶區下Rect座標系轉化為螢幕座標系下的座標

對GetWindowRect取得的矩陣ScreenToClient後,矩陣的大小沒有變小,left,top是視窗的左上角的座標,相對視窗客戶區左上角。   

對GetClientRect取得的矩陣ClientToScreen後,矩陣的大小也沒有變大,新得到的矩陣是視窗客戶區在螢幕座標系上的RECT。

參考資料:

http://www.cnblogs.com/madhenry/archive/2011/04/25/2027694.html

http://blog.csdn.net/chw1989/article/details/7488711

http://bbs.csdn.net/topics/310002564

            </div>
                </div>

剛接觸MFC不久,對MFC的許多函式和功能還不是很瞭解。所以,在仿照書本開發一個仿QQ的通訊程式的時候,就碰到了一個怎麼樣使控制元件隨著窗體變化的問題。好了,廢話不多說,直接上主窗體圖:

現在,要實現的功能如下:

使控制元件CLISTBOX類物件視窗(IDC_QQLISTBOX)以及兩個CBUTTON類物件(IDC_MAIL)、(IDC_WEB)隨著主窗體的變化而自動變化。

具體操作步驟:

1、在主對話方塊類class CQQDlg : public CDialog中新增物件CRect m_rect,用來記錄當前對話方塊的大小。並在初始化函式OnInitialDialog()中獲取該大小GetClientRect (&m_rect);值得注意的是,初始化函式中的這一步並不是必須的,而且如果是在主窗體生成前使用此函式,還可能會報錯,故建議不要這個操作。

2、使用Ctrl+W快捷鍵彈出MFC ClassWizard窗體,選擇主窗體ID,並在Message Map選項中選擇WM_SIZE,點選確定,成功添加了OnSize()函式。它的作用在於系統會自動檢測窗體的變化情況,一旦發生變化,立即自動呼叫該函式。如下圖所示:

3、定義OnSize()函式,程式碼如下:

void CQQDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

/ / nType==1不可以省略,否則由最小化恢復為正常狀態下的時候會出錯

//nType是一個列舉型別,主要是指定所請求的不同的調整大小。這個引數可以是下列值之一:SIZE_MAXIMIZEDSIZE_MINIMIZEDSIZE_RESTORED SIZE_MAXHIDESIZE_MAXSHOW 其原型可以在msdn上檢視


if(nType==1) return; //最小化則什麼都不做
CWnd *pWnd;
pWnd = GetDlgItem(IDC_QQLIST); //獲取控制元件控制代碼
ChangeSize(pWnd,cx,cy); //呼叫changesize()函式
pWnd = GetDlgItem(IDC_WEB); //獲取控制元件控制代碼
ChangeSize(pWnd,cx,cy);//呼叫changesize()函式

//ChangeSize(pWnd,cx,cy)是一個自定義的函式,需要在類的protect屬性中進行新增宣告afx_msg void ChangeSize(CWnd * pWnd, int cx, int cy);
pWnd = GetDlgItem(IDC_MAIL);
ChangeSize(pWnd,cx,cy);
GetClientRect(&m_rect); //將變化後的對話方塊設定為舊大小
}
void CQQDlg::ChangeSize(CWnd * pWnd, int cx, int cy)
{
if (pWnd)
{
CRect rect;
pWnd->GetWindowRect(&rect); //獲取控制元件變化前的大小
ScreenToClient(&rect);//將控制元件大小轉換為在對話方塊中的區域座標
rect.left=rect.left*cx/m_rect.Width();//調整控制元件大小 ,cx/m_rect.Width()為對話方塊在橫向的變化比例
rect.right=rect.right*cx/m_rect.Width(); //cx儲存的是變化後的寬度,cy儲存的是變化後的高度
rect.top=rect.top*cy/m_rect.Height(); //m_rect.height()表示的是變化前主窗體的高度
rect.bottom=rect.bottom*cy/m_rect.Height();
pWnd->MoveWindow(rect);//設定控制元件大小
}
}

注意:GetWindowRect()與GetClientRect(),ScreenToClient()與ClientToScreen()之間的區別

1、GetWindowRect() 是獲得視窗在螢幕座標系下的RECT座標,包括非客戶區(標題欄和下面的其它邊框)和客戶區(矩形區域),從而得到視窗的大小和相對螢幕左上角(0,0)的座標。

2、GetClientRect() 取得視窗客戶區(不包括非客戶區)在客戶區座標系下的RECT座標,可以得到視窗的大小,而不能得到相對螢幕的位置,因為這個矩陣是在客戶區座標系下(相對於視窗客戶區的左上角)的

3、ScreenToClient():把螢幕座標系下的RECT座標轉換為客戶區座標系下的RECT座標。

4、 ClientToScreen():把客戶區下Rect座標系轉化為螢幕座標系下的座標

對GetWindowRect取得的矩陣ScreenToClient後,矩陣的大小沒有變小,left,top是視窗的左上角的座標,相對視窗客戶區左上角。   

對GetClientRect取得的矩陣ClientToScreen後,矩陣的大小也沒有變大,新得到的矩陣是視窗客戶區在螢幕座標系上的RECT。

參考資料:

http://www.cnblogs.com/madhenry/archive/2011/04/25/2027694.html

http://blog.csdn.net/chw1989/article/details/7488711

http://bbs.csdn.net/topics/310002564