0

我想在运行时将组合框控件更改为所有者绘制。在资源脚本中,控件被布置为标准控件。

我已经尝试将样式位设置为 CBS_OWNERDRAW | CBS_HASSTRINGS 但不知何故这无济于事。

在做子类之前,设置窗口样式..

    // turn to ownerdraw
DWORD dwStyle = ::GetWindowLong(hwnd, GWL_STYLE);
dwStyle |= CBS_OWNERDRAWVARIABLE | CBS_HASSTRINGS;
SetWindowLong(hwnd, GWL_STYLE, dwStyle);

有人知道诀窍吗?

4

1 回答 1

3

并非所有样式都可以在创建窗口后在运行时成功更改 - 例如,即使它是通过样式控制的,您也无法在运行时将换行多行编辑更改为换行多行编辑;您需要创建一个全新的编辑控件,这就是记事本所做的。我怀疑 ownerdraw 是一种类似的样式,需要在 CreateWindow 时设置,之后可能无法修改。

最好的办法是保存您关心的属性 - 控件 ID、大小和位置 - 以及对话框中之前的 HWND。销毁旧控件并创建一个新的相同替换 - 但具有您想要的样式。您最终会得到一个新的 HWND,因此必须确保您的代码从那时起使用它而不是旧的。如果旧控件在您删除它时具有键盘焦点,您也应该给新控件键盘焦点,这样焦点就不会“消失”。最后,使用 SetWindowPos(hwndPrev...) 将新的 HWND 移动到 Z 顺序中的正确位置,以便基于 Z 顺序的制表符和标签与新窗口的工作方式相同老的。

于 2012-09-17T04:16:16.217 回答