2013-07-27 52 views
1

normal static controlsunken static control'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()之後,我的靜態控件的樣式也不會改變。

我在做什麼錯,或者我錯過了什麼?

回答

0

即使SS_SUNKEN確實會影響一個靜態控制的框架,它不是的「邊框樣式」該注意的是指一個。

該註釋涉及影響所有窗口的通用框架樣式,如WS_BORDERWS_EX_CLIENTEDGE - 更改時需要重新計算窗口非客戶區域的樣式。

許多系統控制在創建緩存自己的風格,即使你通過SetWindowLong改變樣式不更新緩存。我猜想這就是發生在這裏的事情 - 如果你沒有用SS_SUNKEN創建靜態控件,你不能在以後添加它。你最好的選擇是簡單地用新風格銷燬和重新創建控制。

+0

+1。只有在創作時纔會諮詢「SS_SUNKEN」。動態更改它不起作用。如果你想動態改變效果,那麼不要使用'SS_SUNKEN'。相反,使用'WS_EX_STATICEDGE'。 –

0

SS_SUNKEN有效地設置在擴展樣式WS_EX_STATICEDGEGWL_EXSTYLE)窗口長,所以你可以適當地更新GWL_EXSTYLE和重新定位爲目前工作。

相關問題