我使用以下代码创建静态控件:
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()
后致电SetWindowLongW()
,因为在SetWindowLong的文档中,它说:
某些窗口数据被缓存,因此在调用SetWindowPos函数之前,使用SetWindowLong所做的更改不会生效。具体来说,如果更改任何框架样式,则必须使用SWP_FRAMECHANGED标志调用SetWindowPos,以便正确更新缓存。
而且,在SetWindowPos的文档中,它说:
如果使用SetWindowLong更改了某些窗口数据,则必须调用SetWindowPos才能使更改生效。对uFlags使用以下组合:SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED。
即使更改了SetWindowLongW()
和SetWindowPos()
,我的静态控件的样式也不会改变。
我做错了什么,或者我错过了什么?
答案 0 :(得分:1)
SS_SUNKEN
在扩展样式(WS_EX_STATICEDGE
)窗口中有效地设置了GWL_EXSTYLE
,因此您可以适当地更新GWL_EXSTYLE
并重新定位,就像您当前所做的那样。
答案 1 :(得分:0)
尽管SS_SUNKEN
确实会影响静态控件的框架,但它并不是笔记所指的“框架样式”之一。
该注释指的是影响所有窗口的通用框架样式,如WS_BORDER
或WS_EX_CLIENTEDGE
- 需要在更改时重新计算窗口的非客户区域的样式。
许多系统控件在创建时缓存其样式,即使您通过SetWindowLong
更改样式,也不会更新缓存。我想这就是这里发生的事情 - 如果你不用SS_SUNKEN
创建静态控件,你就不能在以后添加它。您最好的选择是简单地使用新样式销毁和重新创建控件。