MFC-自绘控件(CComboBox篇)
MFC(CComboBox)简单自绘
使用CComboBox实现自绘下拉框,内容包含文字和图形。
注意事项
对话框控件属性Behavior/Owner Draw 设为Variable
代码
// 自绘
void DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC dc;
dc.Attach(lpDIS->hDC);
CRect rect(lpDIS->rcItem);
int nItem = lpDIS->itemID;
COLORREF cLine = GetSysColor(COLOR_WINDOWTEXT);
COLORREF cBack = GetSysColor(COLOR_WINDOW);
if (lpDIS->itemState & ODS_SELECTED)
{
cLine = GetSysColor(COLOR_HIGHLIGHTTEXT);
cBack = GetSysColor(COLOR_HIGHLIGHT);
}
dc.FillSolidRect(rect, cBack);
CPen pen(PS_SOLID, 1, cLine);
CPen* pOldPen = dc.SelectObject(&pen);
CPen pendot(PS_DOT, 1, cLine);
CRect rectx;
CRect recty;
CFont font;
font.CreateFont(
15, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_BOLD, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS,
_T("Arial") // nPitchAndFamily Arial
);
CFont* def_font;
if (nItem == 0)
{
dc.DrawText(_T("无"), rect, DT_VCENTER | DT_SINGLELINE);
dc.MoveTo(rect.left + rect.Width() / 3, rect.top + rect.Height() / 5);
dc.LineTo(rect.left + rect.Width() / 3 * 2, rect.top + rect.Height() / 5);
dc.LineTo(rect.left + rect.Width() / 3 * 2, rect.top + rect.Height() / 5 * 4);
dc.SetTextColor(RGB(255, 0, 0));
def_font = dc.SelectObject(&font);
dc.SetBkMode(TRANSPARENT);
rectx.SetRect(rect.left + rect.Width() / 3, rect.top, rect.right - rect.Width() / 3, rect.top + rect.Height() * 2 / 5);
dc.DrawText(_T("x"), rectx, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rectx.SetRect(rect.left, rect.top + rect.Height() / 5, rect.left + rect.Width() * 4 / 3, rect.top + rect.Height() / 5 * 4);
dc.DrawText(_T("y"), rectx, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
// Done with the font. Delete the font object.
dc.SelectObject(def_font);
font.DeleteObject();
dc.SetTextColor(RGB(0, 0, 0));
}
if (nItem == 1)
{
dc.DrawText(TEXT("线切角"), rect, DT_VCENTER | DT_SINGLELINE);
dc.MoveTo(rect.left + rect.Width() / 3, rect.top + rect.Height() / 5);
dc.LineTo(rect.left + rect.Width() *0.4, rect.top + rect.Height() / 5);
dc.LineTo(rect.left