如何修改自绘下拉列表ComboBox的行(项)高度?
修改自绘ComboBox下拉项行高度的解决方案
核心结论
完全可以修改自绘ComboBox的下拉项行高度,通过系统消息或自绘消息处理即可实现,无需替换为ListView控件。
具体实现方法
方法1:发送CB_SETITEMHEIGHT消息
在ComboBox初始化完成后,直接发送该消息指定下拉项的统一高度。参数中WPARAM设为-1表示设置所有下拉项的高度,LPARAM传入你需要的像素高度(比如文本高度+位图高度+预留边距,示例中设为84像素):
// hwndComboBox 是你的ComboBox控件句柄 SendMessage(hwndComboBox, CB_SETITEMHEIGHT, (WPARAM)-1, (LPARAM)84);
如果需要同时调整ComboBox编辑区域的高度,将WPARAM设为0即可单独设置编辑框高度。
方法2:处理WM_MEASUREITEM消息(自绘控件标准流程)
当ComboBox设置了CBS_OWNERDRAWFIXED(固定行高)或CBS_OWNERDRAWVARIABLE(可变行高)样式时,系统会发送WM_MEASUREITEM消息请求行高参数。在窗口过程中处理该消息:
case WM_MEASUREITEM: { MEASUREITEMSTRUCT* pMeasureInfo = (MEASUREITEMSTRUCT*)lParam; // 确认是ComboBox控件的测量请求 if (pMeasureInfo->CtlType == ODT_COMBOBOX) { // 设置行高为文本+位图+边距的总高度,示例为84像素 pMeasureInfo->itemHeight = 84; return TRUE; // 告知系统已处理该消息 } break; }
注意:ComboBox创建时必须包含CBS_OWNERDRAWFIXED和CBS_HASSTRINGS样式(后者用于保留文本存储功能)。
自绘时的位置适配
在处理WM_DRAWITEM消息绘制文本和位图时,需根据设置的行高调整绘制坐标,确保内容完整显示:
case WM_DRAWITEM: { DRAWITEMSTRUCT* pDrawInfo = (DRAWITEMSTRUCT*)lParam; if (pDrawInfo->CtlType == ODT_COMBOBOX) { // 绘制背景 FillRect(pDrawInfo->hDC, &pDrawInfo->rcItem, (HBRUSH)(COLOR_WINDOW + 1)); // 绘制文本(顶部预留2像素边距) RECT textRect = pDrawInfo->rcItem; textRect.top += 2; textRect.bottom = textRect.top + 16; // 假设文本高度为16像素 DrawText(pDrawInfo->hDC, itemText, -1, &textRect, DT_LEFT | DT_VCENTER); // 绘制位图(文本下方预留2像素边距,位图尺寸256x64) RECT bmpRect = pDrawInfo->rcItem; bmpRect.top = textRect.bottom + 2; bmpRect.left += 2; bmpRect.right = bmpRect.left + 256; bmpRect.bottom = bmpRect.top + 64; // 此处替换为你的位图绘制逻辑(如BitBlt或StretchBlt) BitBlt(pDrawInfo->hDC, bmpRect.left, bmpRect.top, 256, 64, hBitmapDC, 0, 0, SRCCOPY); // 绘制选中状态的焦点框 if (pDrawInfo->itemState & ODS_SELECTED) { DrawFocusRect(pDrawInfo->hDC, &pDrawInfo->rcItem); } return TRUE; } break; }
内容的提问来源于stack exchange,提问作者David La
相关产品推荐
相关产品推荐

