(全)MoveWindow and SetWindowPos

來源:互聯網
上載者:User

 

MoveWindow只能設定視窗的大小和位置;SetWindowPos擁有MoveWindow的全部功能之外,還可以設定視窗的層疊關係(如,把指定的視窗放在所有視窗的最上層--always   on   top就可以用這個函數、或者把指定的視窗放在另一個視窗的下層,等等)。 沒有什麼優缺點可言,只是功能上的大小有別。你完全可以不用MoveWindow,而只用SetWindowPos;但是,在只要設定視窗大小或位置的情況下,你也完全可以使用MoveWindow.

void   MoveWindow(   int   x,   int   y,   int   nWidth,   int   nHeight,   BOOL   bRepaint   =   TRUE   );  
void   MoveWindow(   LPCRECT   lpRect,   BOOL   bRepaint   =   TRUE   );  
參數  
x指定了CWnd的左邊的新位置。  
y指定了CWnd的頂部的新位置。  
nWidth指定了CWnd的新寬度。  
nHeight指定了CWnd的新高度。  
bRepaint指定了是否要重畫CWnd。如果為TRUE,則CWnd象通常那樣在OnPaint訊息處理函數中接收到一條WM_PAINT訊息。如果這個參數為FALSE,則不會發生任何類型的重畫操作。這應用於客戶區、非客戶區(包括標題條和捲軸)和由於CWnd移動而露出的父視窗的任何部分。當這個參數為FALSE的時候,應用程式必須明確地使CWnd和父視窗中必須重畫的部分無效或重畫。lpRectCRect對象或RECT結構,指定了新的大小和位置。說明這個函數改變視窗的位置和大小。對於頂層的CWnd對象,x和y參數是相對於螢幕的左上方的。對於子物件,它們是相對於父視窗客戶區的左上方的。  
MoveWindow函數發送一條WM_GETMINMAXINFO訊息。處理這個訊息時,CWnd得到一個改變最大和最小的視窗預設值的機會。如果傳遞給MoveWindow成員函數的參數超過了這些值,則在WM_GETMINMAXINFO處理函數中可以用最小或最大值來代替這些值。   
    
    
    
   BOOL   SetWindowPos(   const   CWnd*   pWndInsertAfter,   int   x,   int   y,   int   cx,   int   cy,UINT   nFlags   );  
傳回值如果函數成功,則返回非零值;否則返回0。  
參數pWndInsertAfter標識了在Z軸次序上位於這個CWnd對象之前的CWnd對象。這個參數可以是指向CWnd對象的指標,也可以是指向下列值的指標:l   wndBottom       將視窗放在Z軸次序的底部。如果這個CWnd是一個頂層視窗,則視窗將失去它的頂層狀態;系統將這個視窗放在其它所有視窗的底部。l   wndTop       將視窗放在Z軸次序的頂部。l   wndTopMost       將視窗放在所有非頂層視窗的上面。這個視窗將保持它的頂層位置,即使它失去了活動狀態。wndNoTopMost       將視窗重新置放到所有非頂層視窗的頂部(這意味著在所有的頂層視窗之下)。這個標誌對那些已經是非頂層視窗的視窗沒有作用。有關這個函數以及這些參數的使用規則參見說明部分。x指定了視窗左邊的新位置。y指定了視窗頂部的新位置。cx指定了視窗的新寬度。cy指定了視窗的新高度。nFlags指定了大小和位置選項。這個參數可以是下列值的組合:l   SWP_DRAWFRAME       圍繞視窗畫出邊框(在建立視窗的時候定義)。l   SWP_FRAMECHANGED       向視窗發送一條WM_NCCALCSIZE訊息,即使視窗的大小不會改變。如果沒有指定這個標誌,則僅當視窗的大小發生變化時才發送WM_NCCALCSIZE訊息。l   SWP_HIDEWINDOW       隱藏視窗。SWP_NOACTIVATE       不啟用視窗。如果沒有設定這個標誌,則視窗將被啟用並移動到頂層或非頂層視窗組(依賴於pWndInsertAfter參數的設定)的頂部。l   SWP_NOCOPYBITS       廢棄這個客戶區的內容。如果沒有指定這個參數,則客戶區的有效內容將被儲存,並在視窗的大小或位置改變以後被拷貝回客戶區。l   SWP_NOMOVE       保持當前的位置(忽略x和y參數)。l   SWP_NOOWNERZORDER       不改變擁有者視窗在Z軸次序上的位置。l   SWP_NOREDRAW       不重畫變化。如果設定了這個標誌,則不發生任何種類的變化。這適用於客戶區、非客戶區(包括標題和捲軸)以及被移動視窗覆蓋的父視窗的任何部分。當這個標誌被設定的時候,應用程式必須明確地無效或重畫要重畫的視窗和父視窗的任何部分。l   SWP_NOREPOSITION       與SWP_NOOWNERZORDER相同。l   SWP_NOSENDCHANGING       防止視窗接收WM_WINDOWPOSCHANGING訊息。l   SWP_NOSIZE       保持當前的大小(忽略cx和cy參數)。l   SWP_NOZORDER       保持當前的次序(忽略pWndInsertAfter)。l   SWP_SHOWWINDOW       顯示視窗。  
   
調用這個成員函數以改變子視窗、快顯視窗和頂層視窗的大小、位置和Z軸次序。視窗在螢幕上按照它們的Z軸次序排序。在Z軸次序上處於頂端的視窗將程式在所有其它視窗的頂部。子視窗的所有座標都是客戶座標(相對於父視窗客戶區的左上方)。視窗可以被移動到Z軸次序的頂部,既可以通過將pWndInsertAfter參數設為&wndTopMost,並確保沒有設定SWP_NOZORDER標誌,也可以通過設定視窗的Z軸次序使它位於所有現存的頂層視窗上方。當一個非頂層視窗被設為頂層視窗時,它擁有的視窗也被設為頂層的。它的擁有者不發生變化。如果頂層視窗被重新置放到Z軸次序的底部(&wndBottom)或任何非頂層視窗之後,則它將不再是頂層視窗。當頂層視窗被變為非頂層視窗時,它所有的擁有者和它擁有的所有視窗都被變為非頂層視窗。如果既沒有指定SWP_NOACTIVE標誌也沒有指定SWP_NOZORDER標誌(這意味著應用程式要求視窗被同時啟用並放入指定的Z軸次序),則pWndInsertAfter參數中指定的值將只在下列環境下適用:l   在pWndInsertAfter參數中既沒有指定&wndTopMost也沒有指定&wndNoTopMost。  
這個視窗不是使用中視窗。應用程式不能啟用一個非使用中視窗但同時又不把它帶到Z軸次序的頂部。應用程式可以沒有任何限制地改變使用中視窗的Z軸次序。非頂層視窗可能擁有一個頂層視窗,但是反之則不成立。任何被頂層視窗擁有的視窗(例如對話方塊)都將自己變為頂層視窗,以確保所有被擁有的視窗位於它們的擁有者上方。在Windows   3.1或更新的版本中,可以將視窗移動到Z軸次序的頂部,並通過設定它們的WS_EX_TOPMOST風格而將之鎖定在那裡。這種頂層視窗即使在失去活動狀態以後也會保持頂層位置。例如,選擇WinHelp的Always   On   Top命令會使說明視窗變為頂層,並且在你返回應用程式之後它還保持可見。要建立一個頂層視窗,應在調用SetWindowPos的時候將pWndInsertAfter參數設為&wndTopMost,或者在建立視窗的時候設定WS_EX_TOPMOST風格。如果Z軸次序中包含了任何具有WS_EX_TOPMOST風格的視窗,則用&wndTopMost移動的視窗將被放到所有非頂層視窗的頂部,但是位於任何頂層視窗的下面。當應用程式啟用一個不具有WS_EX_TOPMOST風格的非使用中視窗時,該視窗將被移動到所有非頂層視窗的上方,但是位於所有頂層視窗的下方。如果在調用SetWindowPos的時候pWndInsertAfter參數被設為&wndBottom,並且CWnd是一個頂層視窗,則該視窗失去頂層狀態(WS_EX_BOTTOM風格被清除),並且系統將視窗放在Z軸次序的底部。

MoveWindow

函數功能:該函數改變指定視窗的位置和尺寸。對於頂層視窗,位置和尺寸是相對於螢幕的左上方的:對於子視窗,位置和尺寸是相對於父視窗客戶區的左上方座標的。

     函數原型:BOOL MoveWindow(HWND hWnd.int x.int y,int nWidth,int nHeight,BOOL BRePaint);

     參數:

     hWnd:視窗控制代碼。

     x:指定視窗的新位置的左邊界。

     Y:指定視窗的新位置的頂部邊界。

     nWidth:指定視窗的新的寬度。

     nHaight:指定視窗的新的高度。

     bRepaint:確定視窗是否被重新整理。如果該參數為TRUE,視窗接收一個WM_PAINT訊息;如果參數為FALSE,不發生任何重新整理動作。它適用於客戶區,非客戶區(包括標題列和捲軸),及由於移動子視窗而露出的父視窗的地區。如果參數為FALSE,應用程式就必須明確地使視窗無效或重畫該視窗和需要重新整理的父視窗。

     傳回值:如果函數成功,傳回值為非零;如果函數失敗,傳回值為零。若想獲得更多錯誤資訊,請調用GetLastError函數。

     備忘:如果bRepaint為TRUE,系統在視窗移動後立即給視窗過程發送WM_PAINT訊息(即由MoveWindow函數調用 UPdateWindow函數)。如果bRepaint 為FALSE,系統將WM_PAINT訊息放在該視窗的訊息佇列中。訊息迴圈只有在派遣完訊息佇列中的其他訊息時才派遣WM_PAINT訊息。

     MoveWindow給視窗發送WM_WfNOWPOSCHANGING,WM_WINDOWPOSCHANGED,WM_MOVE,WM_SIZE和WM_NCCALCSIZE訊息,

     速查:Windows NT:3.1以上版本:Windows:95以上版本;Windows CE:1.0以上版本:標頭檔:winuser.h;庫檔案:user32.lib。

 

我收集和學習別人的文章,我對這些文章的作者或譯者表示感謝

改變控制項的大小和位置

用CWnd類的函數MoveWindow()或SetWindowPos()可以改變控制項的大小和位置。

void MoveWindow(int x,int y,int nWidth,int nHeight);
void MoveWindow(LPCRECT lpRect);
第一種用法需給出控制項新的座標和寬度、高度;
第二種用法給出存放位置的CRect對象;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_EDIT1 );    //擷取控制項指標,IDC_EDIT1為控制項ID號
pWnd->MoveWindow( CRect(0,0,100,100) );    //在視窗左上方顯示一個寬100、高100的編輯控制項

SetWindowPos()函數使用更靈活,多用於只修改控制項位置而大小不變或只修改大小而位置不變的情況:
BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);
第一個參數我不會用,一般設為NULL;
x、y控制項位置;cx、cy控制項寬度和高度;
nFlags常用取值:
SWP_NOZORDER:忽略第一個參數;
SWP_NOMOVE:忽略x、y,維持位置不變;
SWP_NOSIZE:忽略cx、cy,維持大小不變;
例:
CWnd *pWnd;
pWnd = GetDlgItem( IDC_BUTTON1 );    //擷取控制項指標,IDC_BUTTON1為控制項ID號
pWnd->SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );    //把按鈕移到視窗的(50,80)處
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );    //把編輯控制項的大小設為(100,80),位置不變
pWnd = GetDlgItem( IDC_EDIT1 );
pWnd->SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );    //編輯控制項的大小和位置都改變
以上方法也適用於各種視窗

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/godyxfcode/archive/2007/04/20/1573295.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.