MoveWindow只能設(shè)置窗口的大小和位置;SetWindowPos擁有MoveWindow的全部功能之外,還可以設(shè)置窗口的層疊關(guān)系(如,把指定的窗口放在所有窗口的最上層--alwaysontop就可以用這個函數(shù)、或者把指定的窗口放在另一個窗口的下層,等等)。沒有什么優(yōu)缺點可言,只是功能上的大小有別。你完全可以不用MoveWindow,而只用SetWindowPos;但是,在只要設(shè)置窗口大小或位置的情況下,你也完全可以使用MoveWindow.
void MoveWindow(intx,inty,intnWidth,intnHeight,BOOLbRepaint=TRUE);
voidMoveWindow(LPCRECTlpRect,BOOLbRepaint=TRUE);
參數(shù)
x指定了CWnd的左邊的新位置。
y指定了CWnd的頂部的新位置。
nWidth指定了CWnd的新寬度。
nHeight指定了CWnd的新高度。
bRepaint指定了是否要重畫CWnd。如果為TRUE,則CWnd象通常那樣在OnPaint消息處理函數(shù)中接收到一條WM_PAINT消息。如果這個參數(shù)為FALSE,則不會發(fā)生任何類型的重畫操作。這應(yīng)用于客戶區(qū)、非客戶區(qū)(包括標題條和滾動條)和由于CWnd移動而露出的父窗口的任何部分。當這個參數(shù)為FALSE的時候,應(yīng)用程序必須明確地使CWnd和父窗口中必須重畫的部分無效或重畫。lpRectCRect對象或RECT結(jié)構(gòu),指定了新的大小和位置。說明這個函數(shù)改變窗口的位置和大小。對于頂層的CWnd對象,x和y參數(shù)是相對于屏幕的左上角的。對于子對象,它們是相對于父窗口客戶區(qū)的左上角的。
MoveWindow函數(shù)發(fā)送一條WM_GETMINMAXINFO消息。處理這個消息時,CWnd得到一個改變最大和最小的窗口缺省值的機會。如果傳遞給MoveWindow成員函數(shù)的參數(shù)超過了這些值,則在WM_GETMINMAXINFO處理函數(shù)中可以用最小或最大值來代替這些值。
BOOL SetWindowPos(constCWnd*pWndInsertAfter,intx,inty,intcx,intcy,UINTnFlags);
返回值如果函數(shù)成功,則返回非零值;否則返回0。
參數(shù)pWndInsertAfter標識了在Z軸次序上位于這個CWnd對象之前的CWnd對象。這個參數(shù)可以是指向CWnd對象的指針,也可以是指向下列值的指針:lwndBottom將窗口放在Z軸次序的底部。如果這個CWnd是一個頂層窗口,則窗口將失去它的頂層狀態(tài);系統(tǒng)將這個窗口放在其它所有窗口的底部。lwndTop將窗口放在Z軸次序的頂部。lwndTopMost將窗口放在所有非頂層窗口的上面。這個窗口將保持它的頂層位置,即使它失去了活動狀態(tài)。wndNoTopMost將窗口重新定位到所有非頂層窗口的頂部(這意味著在所有的頂層窗口之下)。這個標志對那些已經(jīng)是非頂層窗口的窗口沒有作用。有關(guān)這個函數(shù)以及這些參數(shù)的使用規(guī)則參見說明部分。x指定了窗口左邊的新位置。y指定了窗口頂部的新位置。cx指定了窗口的新寬度。cy指定了窗口的新高度。nFlags指定了大小和位置選項。這個參數(shù)可以是下列值的組合:lSWP_DRAWFRAME圍繞窗口畫出邊框(在創(chuàng)建窗口的時候定義)。lSWP_FRAMECHANGED向窗口發(fā)送一條WM_NCCALCSIZE消息,即使窗口的大小不會改變。如果沒有指定這個標志,則僅當窗口的大小發(fā)生變化時才發(fā)送WM_NCCALCSIZE消息。lSWP_HIDEWINDOW隱藏窗口。SWP_NOACTIVATE不激活窗口。如果沒有設(shè)置這個標志,則窗口將被激活并移動到頂層或非頂層窗口組(依賴于pWndInsertAfter參數(shù)的設(shè)置)的頂部。lSWP_NOCOPYBITS廢棄這個客戶區(qū)的內(nèi)容。如果沒有指定這個參數(shù),則客戶區(qū)的有效內(nèi)容將被保存,并在窗口的大小或位置改變以后被拷貝回客戶區(qū)。lSWP_NOMOVE保持當前的位置(忽略x和y參數(shù))。lSWP_NOOWNERZORDER不改變擁有者窗口在Z軸次序上的位置。lSWP_NOREDRAW不重畫變化。如果設(shè)置了這個標志,則不發(fā)生任何種類的變化。這適用于客戶區(qū)、非客戶區(qū)(包括標題和滾動條)以及被移動窗口覆蓋的父窗口的任何部分。當這個標志被設(shè)置的時候,應(yīng)用程序必須明確地無效或重畫要重畫的窗口和父窗口的任何部分。lSWP_NOREPOSITION與SWP_NOOWNERZORDER相同。lSWP_NOSENDCHANGING防止窗口接收WM_WINDOWPOSCHANGING消息。lSWP_NOSIZE保持當前的大小(忽略cx和cy參數(shù))。lSWP_NOZORDER保持當前的次序(忽略pWndInsertAfter)。lSWP_SHOWWINDOW顯示窗口。
調(diào)用這個成員函數(shù)以改變子窗口、彈出窗口和頂層窗口的大小、位置和Z軸次序。窗口在屏幕上按照它們的Z軸次序排序。在Z軸次序上處于頂端的窗口將程序在所有其它窗口的頂部。子窗口的所有坐標都是客戶坐標(相對于父窗口客戶區(qū)的左上角)。窗口可以被移動到Z軸次序的頂部,既可以通過將pWndInsertAfter參數(shù)設(shè)為&wndTopMost,并確保沒有設(shè)置SWP_NOZORDER標志,也可以通過設(shè)置窗口的Z軸次序使它位于所有現(xiàn)存的頂層窗口上方。當一個非頂層窗口被設(shè)為頂層窗口時,它擁有的窗口也被設(shè)為頂層的。它的擁有者不發(fā)生變化。如果頂層窗口被重新定位到Z軸次序的底部(&wndBottom)或任何非頂層窗口之后,則它將不再是頂層窗口。當頂層窗口被變?yōu)榉琼攲哟翱跁r,它所有的擁有者和它擁有的所有窗口都被變?yōu)榉琼攲哟翱?。如果既沒有指定SWP_NOACTIVE標志也沒有指定SWP_NOZORDER標志(這意味著應(yīng)用程序要求窗口被同時激活并放入指定的Z軸次序),則pWndInsertAfter參數(shù)中指定的值將只在下列環(huán)境下適用:l在pWndInsertAfter參數(shù)中既沒有指定&wndTopMost也沒有指定&wndNoTopMost。
這個窗口不是活動窗口。應(yīng)用程序不能激活一個非活動窗口但同時又不把它帶到Z軸次序的頂部。應(yīng)用程序可以沒有任何限制地改變活動窗口的Z軸次序。非頂層窗口可能擁有一個頂層窗口,但是反之則不成立。任何被頂層窗口擁有的窗口(例如對話框)都將自己變?yōu)轫攲哟翱冢源_保所有被擁有的窗口位于它們的擁有者上方。在Windows3.1或更新的版本中,可以將窗口移動到Z軸次序的頂部,并通過設(shè)置它們的WS_EX_TOPMOST風格而將之鎖定在那里。這種頂層窗口即使在失去活動狀態(tài)以后也會保持頂層位置。例如,選擇WinHelp的AlwaysOnTop命令會使幫助窗口變?yōu)轫攲樱⑶以谀惴祷貞?yīng)用程序之后它還保持可見。要創(chuàng)建一個頂層窗口,應(yīng)在調(diào)用SetWindowPos的時候?qū)WndInsertAfter參數(shù)設(shè)為&wndTopMost,或者在創(chuàng)建窗口的時候設(shè)置WS_EX_TOPMOST風格。如果Z軸次序中包含了任何具有WS_EX_TOPMOST風格的窗口,則用&wndTopMost移動的窗口將被放到所有非頂層窗口的頂部,但是位于任何頂層窗口的下面。當應(yīng)用程序激活一個不具有WS_EX_TOPMOST風格的非活動窗口時,該窗口將被移動到所有非頂層窗口的上方,但是位于所有頂層窗口的下方。如果在調(diào)用SetWindowPos的時候pWndInsertAfter參數(shù)被設(shè)為&wndBottom,并且CWnd是一個頂層窗口,則該窗口失去頂層狀態(tài)(WS_EX_BOTTOM風格被清除),并且系統(tǒng)將窗口放在Z軸次序的底部。
MoveWindow
函數(shù)功能:該函數(shù)改變指定窗口的位置和尺寸。對于頂層窗口,位置和尺寸是相對于屏幕的左上角的:對于子窗口,位置和尺寸是相對于父窗口客戶區(qū)的左上角坐標的。 我收集和學習別人的文章,我對這些文章的作者或譯者表示感謝 改變控件的大小和位置 用CWnd類的函數(shù)MoveWindow()或SetWindowPos()可以改變控件的大小和位置。 void MoveWindow(int x,int y,int nWidth,int nHeight); SetWindowPos()函數(shù)使用更靈活,多用于只修改控件位置而大小不變或只修改大小而位置不變的情況: |
愛華網(wǎng)



