1. 程式人生 > >MFC一一SetWindowPos與MoveWindow的用法區別

MFC一一SetWindowPos與MoveWindow的用法區別

兩者用途:均表示改變控制元件的大小和位置

分別介紹:

(1)、SetWindowPos:改變一個子視窗,彈出式視窗或頂層視窗的尺寸,位置和Z序。

BOOL SetWindowPos(
	const CWnd* pWndInsertAfter,
	int x,       //Specifies the new position of the left side of the window.
	int y,       //Specifies the new position of the top of the window.
	int cx,      //Specifies the new width of the window.
	int cy,      //Specifies the new height of the window.
	UINT nFlags  //Specifies sizing and positioning options.
	);
nFlags常用取值: 
SWP_NOZORDER:忽略第一個引數; 
SWP_NOMOVE:忽略x、y,維持位置不變; 

SWP_NOSIZE:忽略cx、cy,維持大小不變; 

CWnd *pWnd; 
pWnd = GetDlgItem( IDC_BUTTON_OPEN );    //獲取控制元件指標,IDC_BUTTON1為控制元件ID號 
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );    //把按鈕移到視窗的(50,80)處,大小不變 
pWnd = GetDlgItem( IDC_EDIT_HTMLPATH ); 
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );    //把編輯控制元件的大小設為(100,80),位置不變 
pWnd = GetDlgItem( IDC_EDIT_PARSEHTML ); 
pWnd->SetWindowPos( NULL,50,80,100,80,SWP_NOZORDER );    //編輯控制元件的大小和位置都改變 

(2)、MoveWindow:功能是改變指定視窗的位置和大小。對子視窗來說,位置和大小取決於父視窗客戶區的左上角;對於Owned視窗,位置和大小取決於螢幕左上角。

void MoveWindow(
	int x,       //Specifies the new position of the left side of the CWnd.
	int y,       //Specifies the new position of the top of the CWnd.
	int nWidth,  //Specifies the new width of the CWnd.
	int nHeight, //Specifies the new height of the CWnd.
	BOOL bRepaint = TRUE 
	);
void MoveWindow(
	LPCRECT lpRect, //The CRect object or RECT structure that specifies the new size and position.
	BOOL bRepaint = TRUE 
	);

       bRepaint指定了是否要重畫CWnd。如果為TRUE,則CWnd象通常那樣在OnPaint訊息處理函式中接收到一條WM_PAINT訊息。如果這個引數為FALSE,則不會發生任何型別的重畫操作。這應用於客戶區、非客戶區(包括標題條和滾動條)和由於CWnd移動而露出的父視窗的任何部分。當這個引數為FALSE的時候,應用程式必須明確地使CWnd和父視窗中必須重畫的部分無效或重畫。

void CDialogQual::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);
	CWnd *pWnd = GetDlgItem(IDC_PROGRESS_PARSEHTML);
	if(pWnd && pWnd->GetSafeHwnd())
	{
		pWnd->MoveWindow(5,18,cx-200,18);
	}
	pWnd = GetDlgItem(IDC_EDIT_HTMLPATH);
	if(pWnd && pWnd->GetSafeHwnd())
	{
		pWnd->MoveWindow(5,40,cx-280,25);
	}
	pWnd = GetDlgItem(IDC_BUTTON_OPEN);
	if(pWnd && pWnd->GetSafeHwnd())
	{
		pWnd->MoveWindow(cx-274,40,80,25);
	}
	pWnd = GetDlgItem(IDC_LIST_PARSE);
	if(pWnd && pWnd->GetSafeHwnd())
	{
		pWnd->MoveWindow(5,70,cx-200,120);
	}
	pWnd = GetDlgItem(IDC_CHECK_SHOWLOG);
	if(pWnd && pWnd->GetSafeHwnd())
	{
		CRect rect;
		pWnd->GetClientRect(&rect);
		pWnd->MoveWindow(5,192,rect.Width(),rect.Height());
	}
	pWnd = GetDlgItem(IDC_EDIT_PARSEHTML);
	if(pWnd && pWnd->GetSafeHwnd())
	{
		pWnd->MoveWindow(5,205,cx-200,cy-205);
	}
	pWnd = GetDlgItem(IDC_STATIC_PARSE);
	if(pWnd && pWnd->GetSafeHwnd())
	{
		pWnd->MoveWindow(0,0,cx-190,cy);
	}
}
      上述程式碼在OnSize中執行,主要用於鎖定控制元件的位置與大小,這樣當控制元件隨著Dialog最大化變化的時候,控制元件相對於Dialog的位置能夠保持自適應。