函式原型
BOOL SetWindowPos(HWND hWnd, const CWnd* pWndInsertAfter, int x, int y,int cx, int cy, UINT nFlags);
函式參數
hWnd
視窗句柄。
hWndlnsertAfter
在z序中的位於被置位的視窗前的視窗句柄。該參數必須為一個視窗句柄,或下列值之一:
HWND_BOTTOM:將視窗置於Z序的底部。如果參數hWnd標識了一個頂層視窗,則視窗失去頂級位置,並且被置在其他視窗的底部。
HWND_NOTOPMOST:將視窗置於所有非頂層視窗之上(即在所有頂層視窗之後)。如果視窗已經是非頂層視窗則該標誌不起作用。
HWND_TOP:將視窗置於Z序的頂部。
HWND_TOPMOST:將視窗置於所有非頂層視窗之上。即使視窗未被激活視窗也將保持頂級位置。
查看該參數的使用方法,請看說明部分。
x
以客戶坐標指定視窗新位置的左邊界。
Y
以客戶坐標指定視窗新位置的頂邊界。
cx
以像素指定視窗的新的寬度。
cy
以像素指定視窗的新的高度。
uFlags
視窗尺寸和定位的標誌。該參數可以是下列值的組合:
SWP_ASYNCWINDOWPOS:如果調用進程不擁有視窗,系統會向擁有視窗的執行緒發出需求。這就防止調用執行緒在其他執行緒處理需求的時候發生死鎖。
SWP_DEFERERASE:防止產生WM_SYNCPAINT訊息。
SWP_DRAWFRAME:在視窗周圍畫一個框線(定義在視窗類描述中)。
SWP_FRAMECHANGED:給視窗傳送WM_NCCALCSIZE訊息,即使視窗尺寸沒有改變也會傳送該訊息。如果未指定這個標誌,只有在改變了視窗尺寸時才傳送WM_NCCALCSIZE。
SWP_HIDEWINDOW;隱藏視窗。
SWP_NOACTIVATE:不激活視窗。如果未設定標誌,則視窗被激活,並被設定到其他最高級視窗或非最高級組的頂部(根據參數hWndlnsertAfter設定)。
SWP_NOCOPYBITS:清除客戶區的所有內容。如果未設定該標誌,客戶區的有效內容被保存並且在視窗尺寸更新和重定位後拷貝回客戶區。
SWP_NOMOVE:維持當前位置(忽略X和Y參數)。
SWP_NOOWNERZORDER:不改變z序中的所有者視窗的位置。
SWP_NOREDRAW:不重畫改變的內容。如果設定了這個標誌,則不發生任何重畫動作。適用於客戶區和非客戶區(包括標題欄和滾動條)和任何由於窗回移動而露出的父視窗的所有部分。如果設定了這個標誌,應用程式必須明確地使視窗無效並區重畫視窗的任何部分和父視窗需要重畫的部分。
SWP_NOREPOSITION:與SWP_NOOWNERZORDER標誌相同。
SWP_NOSENDCHANGING:防止視窗接收WM_WINDOWPOSCHANGING訊息。
SWP_NOSIZE:維持當前尺寸(忽略cx和Cy參數)。
SWP_NOZORDER:維持當前Z序(忽略hWndlnsertAfter參數)。
SWP_SHOWWINDOW:顯示視窗。
返回值
如果函式成功,返回值為非零;如果函式失敗,返回值為零。若想獲得更多錯誤訊息,請調用GetLastError函式。
VB例子
加入本函式的聲明Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
新建個控制項 Check1
'完整代碼如下:
Private Sub Check1_Click()
Dim Q
If Check1.Value = 1 Then
Q = SetWindowPos(Me.hWnd, -1, 0, 0, 0, 0, 3)
Else
Q = SetWindowPos(Me.hWnd, -2, 0, 0, 0, 0, 3)
End If
End Sub
Private Sub Form_Load()
Check1.Caption = "點擊視窗置前"
End Sub
VC原型
BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy,UINT nFlags);
VC6中的使用例子
BOOL CDesktopADDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 設定此對話框的圖示。當 應用程式主視窗不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設定大圖示
SetIcon(m_hIcon, FALSE); // 設定小圖示
// TODO: 在此添加額外的初始化代碼
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
int dx = 600;
int dy = 400;
SetWindowPos(&wndBottom,cx-dx,cy-dy,dx,dy,SWP_NOACTIVATE); //設定廣告視窗浮動於右下角
return TRUE; // 除非將焦點設定到控制項,否則返回 TRUE
}
c#引用與參數說明
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
uint uFlags
);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
static readonly IntPtr HWND_TOP = new IntPtr(0);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_NOZORDER = 0x0004;
const UInt32 SWP_NOREDRAW = 0x0008;
const UInt32 SWP_NOACTIVATE = 0x0010;
const UInt32 SWP_FRAMECHANGED = 0x0020;
const UInt32 SWP_SHOWWINDOW = 0x0040;
const UInt32 SWP_HIDEWINDOW = 0x0080;
const UInt32 SWP_NOCOPYBITS = 0x0100;
const UInt32 SWP_NOOWNERZORDER = 0x0200;
const UInt32 SWP_NOSENDCHANGING = 0x0400;
const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;