我是使用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;
}
{
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;
}
各种状态都要用背景色填充矩形。
应判断itemData是否有效,如果其值为-1,则不要调用DrawText。