如何在运行时将组合框更改为ownerdraw?

时间:2012-09-17 00:25:54

标签: windows winapi visual-c++ gdi+ gdi

我想在运行时将组合框控件更改为owner-draw。在资源脚本中,控件被布置为标准控件。

我已经尝试将样式位设置为CBS_OWNERDRAW | CBS_HASSTRINGS但不知怎的,这没有帮助。

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

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

有人知道这个伎俩吗?

1 个答案:

答案 0 :(得分:3)

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

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