关于winapi:如何绘制组合框的静态部分

How to draw the static part of the combobox

我有一个自定义绘制的组合框,样式为 CBS_DROPDOWNLISTCBS_OWNERDRAWVARIABLE 我可以绘制下拉列表的项目,但是当用户选择一个项目时,它是在组合框静态部分中绘制的[组合后保持可见的部分选择项目并显示选择],我想给它一个自定义文本,如下图所示

enter

1
2
3
4
5
6
7
8
9
    if(DrawItemStruct.CtlType == ODT_COMBOBOX)//the static part of the combo
        DrawComboText(pDC, DrawItemStruct.itemID, &DrawItemStruct.rcItem);
    else//the rest items
    {
        // Copy the text of the item to a string
        char sItem[256];
        GetString(sItem, DrawItemStruct.itemID);
        biDrawText(pDC, sItem, -1, &DrawItemStruct.rcItem, f | DT_VCENTER | DT_SINGLELINE);
    }

但是当我使用它时,我得到所有项目都有 CtlType == ODT_COMBOBOX,当我调试上面的代码时,它返回静态部分的 ODT_COMBOBOX,而对于下拉列表的项目,它返回 ODT_LISTBOX

我想知道如何解决这个问题,如何检测我正在绘制下拉列表中的静态部分或常规项?

  • 我不清楚。您似乎回答了自己的问题: ODT_COMBOBOX 用于静态控件中的文本。 ODT_LISTBOX 用于列表框项中的文本。那个,或者我不明白你的问题。
  • 那是我从其他源代码中获取的,但 ODT_LISTBOX 从未发送它总是 ODT_COMBOBOX,在我从中复制的源代码中工作正常,我不知道我错过了什么
  • 我通过检查是否 DrawItemStruct.itemID == -1 来处理静态部分
  • @ user1793036:如果在您选择项目时没有从组合中选择项目说项目索引= 2,那么当列表关闭并且在绘制静态部分时,项目ID == 2。


我只是检查 ODS_COMBOBOXEDIT 的状态。如果文档表明为编辑控件设置了此标志,则它适用于下拉列表。

我已经检查过像你一样以正常方式工作的组合框实现。

1
bool bDrawStaticControl = (pDIS->itemState & ODS_COMBOBOXEDIT)!=0;