我是使用DRAWITEMSTRUCT与MEASUREITEMSTRUCT这两个结构来实现组合框的自绘。当我选中组合框中编辑框中的文本后,然后下拉组合框,就会发现编辑框的文本变成乱码了,而且列表框中的选择项的高亮状态不正确。代码如下:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        LPMEASUREITEMSTRUCT pMeasureStruct;
        LPDRAWITEMSTRUCT   pDrawItemStruct;
LOGFONT lf;
static HWND hwndCombox;
switch (message)
{
case WM_CREATE:
hwndCombox=CreateWindow(_T("combobox"),_T("组合框"),
WS_CHILD|WS_VISIBLE|WS_BORDER|CBS_OWNERDRAWVARIABLE|CBS_AUTOHSCROLL|CBS_SORT|CBS_DROPDOWN ,
50,50,300,300,hWnd,(HMENU)ID_COMBO,hInst,NULL);
SendMessage(hwndCombox,CB_ADDSTRING,0,(LPARAM)_T("王冬苏"));
SendMessage(hwndCombox,CB_ADDSTRING,0,(LPARAM)_T("黄振宇"));
SendMessage(hwndCombox,CB_ADDSTRING,0,(LPARAM)_T("高清常"));

break;
case WM_MEASUREITEM:
pMeasureStruct=(LPMEASUREITEMSTRUCT)lParam;
if(pMeasureStruct->CtlType==ODT_COMBOBOX)
{
if(pMeasureStruct->CtlID==ID_COMBO)
{

pMeasureStruct->itemHeight=30;
}
}
break;

case WM_DRAWITEM:
pDrawItemStruct=(LPDRAWITEMSTRUCT)lParam;
if(pDrawItemStruct->CtlID==ID_COMBO)
{

switch(pDrawItemStruct->itemAction)
{
case ODA_DRAWENTIRE:
case ODA_SELECT:
if(pDrawItemStruct->itemState & ODS_SELECTED)
{
  
FillRect(pDrawItemStruct->hDC,&pDrawItemStruct->rcItem,GetSysColorBrush(COLOR_HIGHLIGHT));
SetTextColor(pDrawItemStruct->hDC,RGB(255,0,0));
SetBkColor(pDrawItemStruct->hDC,GetSysColor(COLOR_HIGHLIGHT));

}
else
{
FillRect(pDrawItemStruct->hDC,&pDrawItemStruct->rcItem,CreateSolidBrush(RGB(255,255,255)));
}
break;

}


ZeroMemory(&lf,sizeof(LOGFONT));
lf.lfCharSet=GB2312_CHARSET;
lf.lfClipPrecision=CLIP_DEFAULT_PRECIS;
lf.lfWeight=400;
lf.lfQuality=DEFAULT_QUALITY;
lf.lfItalic=1;
lf.lfWidth=15;
lf.lfHeight=-25;
lf.lfPitchAndFamily=FIXED_PITCH|FF_MODERN;
_tcscpy(lf.lfFaceName,_T("宋体"));

HFONT hfont=CreateFontIndirect(&lf);
HFONT hOldfont=(HFONT)SelectObject(pDrawItemStruct->hDC,hfont);

DrawText(pDrawItemStruct->hDC,(LPCTSTR)pDrawItemStruct->itemData,-1,&pDrawItemStruct->rcItem,DT_SINGLELINE|DT_EXPANDTABS|DT_LEFT);

SelectObject(pDrawItemStruct->hDC,hOldfont);
DeleteObject(hfont);
}
break;

case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

解决方案 »

  1.   

    无须判断itemAction,直接根据itemState来决定如何绘制。
    各种状态都要用背景色填充矩形。
    应判断itemData是否有效,如果其值为-1,则不要调用DrawText。
      

  2.   

    那个itemData指向了项目的文本呀,怎么判断它是否指向了真实数据呢?
      

  3.   

    组合框中的编辑框默认是空的,此时itemData为-1。
      

  4.   

    应该是判断DRAWITEMSTRUCT结构中的成员itemID是否为-1,而不是itemData.但是itemID成员好像不会等于-1的样子。
      

  5.   

    只响应WM_MEASUREITEM与WM_DRAWITEM可以实现自绘编辑框吗?有没有示例代码?