'SetWindowLong函數()`函數甚至稱`SetWindowPos()`
創建與下面的代碼靜態控件後不改變窗口樣式:
hWnd = CreateWindowExW(0,
L"STATIC",
Content.c_str(),
SS_LEFT | WS_VISIBLE | WS_CHILD /*| SS_SUNKEN*/,
200,
120,
120,
40,
hWndParent,
NULL,
hInstance,
NULL);
如果我啓用SS_SUNKEN
風格在上面的創建代碼中,創建的靜態控件顯示成功下沉。
但是,我想要做的是改變其創建後的控制風格。
我嘗試這樣做:
void BaseWindowClass::AddStyle(DWORD NewStyle)
{
// NewStyle = 0x00001000 = SS_SUNKEN
LONG oldstyle, changedstyle;
oldstyle=SetWindowLongW(hWnd, GWL_STYLE, changedstyle=GetWindowLongW(hWnd, GWL_STYLE) | NewStyle);
UpdateWindowStyles();
// oldstyle = 0x50000000
// changedstyle = 0x50001000 (everything looks normal)
}
void BaseWindowClass::UpdateWindowStyles()
{
BOOL success;
success=SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
// success = 0x00000001 (non-zero: SetWindowPos sucseeded)
}
文檔:
SetWindowLong()
SetWindowPos()
我打電話SetWindowPos()
因爲SetWindowLong函數的文檔中調用SetWindowLongW()
後,它說:
某些窗口數據被緩存,所以使用SetWindowLong所做的更改將不會採用直到您調用SetWindowPos函數。特別是,如果更改任何框架樣式,則必須使用SWP_FRAMECHANGED標誌調用SetWindowPos,才能正確更新緩存。
而且,SetWindowPos的文檔中,它說:
如果您使用SetWindowLong函數改變某個窗口的數據,你必須調用SetWindowPos使更改生效。爲uFlags使用以下組合:SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED。
即使在更改SetWindowLongW()
和SetWindowPos()
之後,我的靜態控件的樣式也不會改變。
我在做什麼錯,或者我錯過了什麼?
+1。只有在創作時纔會諮詢「SS_SUNKEN」。動態更改它不起作用。如果你想動態改變效果,那麼不要使用'SS_SUNKEN'。相反,使用'WS_EX_STATICEDGE'。 –