15,979
社区成员
发帖
与我相关
我的任务
分享
.h
class XComboBox : public CComboBox
{
private:
CFont font;
public:
XComboBox();
private:
int GetWidth(const char*);
public:
void Test();
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lp);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lp);
};
.cpp
#include "XComboBox.h"
XComboBox::XComboBox()
{
font.CreatePointFont(11 * 10, "宋体");
}
void XComboBox::Test()
{
AddString("如果");
AddString("这一行这么长");
AddString("还不够的话");
AddString("啊啊啊啊啊啊啊啊啊,这么多啊");
AddString("够不够");
}
int XComboBox::GetWidth(const char* src)
{
CDC* dc = GetDC();
dc->SelectObject(font);
CSize sz = dc->GetTextExtent(src);
ReleaseDC(dc);
return sz.cx;
}
void XComboBox::DrawItem(LPDRAWITEMSTRUCT lp)
{
CDC* dc = CDC::FromHandle(lp->hDC);
CRect rc = lp->rcItem;
dc->FillSolidRect(&rc,RGB(215,240,215));
if(lp->itemState & ODS_SELECTED)
dc->FillSolidRect(&rc,RGB(255,0,0));
dc->SetBkMode(TRANSPARENT);
dc->SelectObject(font);
char str[50];
CComboBox::GetLBText(lp->itemID,str);
int cx = GetWidth(str);
if(cx > rc.Width())
dc->DrawText(str,&rc,DT_LEFT|DT_WORDBREAK);
else
dc->DrawText(str,&rc,DT_SINGLELINE|DT_VCENTER|DT_LEFT);
}
void XComboBox::MeasureItem(LPMEASUREITEMSTRUCT lp)
{
if(lp->itemID >= 0)
{
char str[50];
CComboBox::GetLBText(lp->itemID,str);
int cx = GetWidth(str);
CRect rc;
GetClientRect(rc);
if(cx > rc.Width())
lp->itemHeight = 15 * 2;
else
lp->itemHeight = 22;
}
else
lp->itemHeight = 22;
}
xxdlg.h
XComboBox cbx;
xxdlg.cpp
cbx.Create(WS_VISIBLE|WS_CHILD|CBS_OWNERDRAWVARIABLE|CBS_HASSTRINGS|CBS_DROPDOWNLIST,CRect(0,40,150,200),this,9999);
cbx.Test();
void XComboBox::DrawItem(LPDRAWITEMSTRUCT lp)
{
CDC* dc = CDC::FromHandle(lp->hDC);
CRect rc = lp->rcItem;
dc->FillSolidRect(&rc,RGB(215,240,215));
if(lp->itemState & ODS_SELECTED)
dc->FillSolidRect(&rc,RGB(255,0,0));
dc->SetBkMode(TRANSPARENT);
CFont font;
font.CreatePointFont(11 * 10, "宋体");
dc->SelectObject(font);
char str[50];
CComboBox::GetLBText(lp->itemID,str);
CSize sz = dc->GetTextExtent(str);
if(sz.cx > rc.Width()) // 多行
dc->DrawText(str,&rc,DT_LEFT|DT_WORDBREAK);
else // 单行
dc->DrawText(str,&rc,DT_SINGLELINE|DT_VCENTER|DT_LEFT);
}
void XComboBox::MeasureItem(LPMEASUREITEMSTRUCT lp)
{
lp->itemHeight = 25; // 这个根据需求可以改
}