【问题标题】:How to change combobox to ownerdraw at runtime?如何在运行时将组合框更改为所有者绘制?
【发布时间】:2012-09-09 05:33:48
【问题描述】:

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

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

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

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

有人知道诀窍吗?

【问题讨论】:

  • 一个组合框由 2 个窗口控件、一个按钮和一个列表框组成 .. 现在,您是在处理 NM_MEASUREITEM、NM_DRAWITEM 等 .. 为子类化后的所有者绘制的控件,还是只是试图处理 WM_PAINT ?
  • 很好奇,你为什么要在运行时改变这个?为什么不在 .rc 文件中包含 ownerdraw 样式?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2018-03-26
    • 2011-01-15
    相关资源
    最近更新 更多