MFC一一SetWindowPos與MoveWindow的用法區別
阿新 • • 發佈:2019-01-06
兩者用途:均表示改變控制元件的大小和位置
分別介紹:
(1)、SetWindowPos:改變一個子視窗,彈出式視窗或頂層視窗的尺寸,位置和Z序。
nFlags常用取值: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. );
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的位置能夠保持自適應。