.h文件
#pragma once
#include "afxwin.h"
class CMyCombox :
public CComboBox
{
public:
CMyCombox();
~CMyCombox();
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
void OnNcPaint(CDC* pDC);
virtual int CompareItem(LPCOMPAREITEMSTRUCT /*lpCompareItemStruct*/);
virtual void PreSubclassWindow();
//字体
CString m_btnText;
//颜色
COLORREF textColor;
//大小
int textSize;
};
.cpp文件
#include "StdAfx.h"
#include "MyCombox.h"
CMyCombox::CMyCombox(){
textSize = 20;
COMBOBOXINFO si;
::GetComboBoxInfo(this->GetSafeHwnd(), &si);
int iiii = 0;
}
CMyCombox::~CMyCombox(){
}
void CMyCombox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){
// TODO: 添加您的代码以绘制指定项
CString strDrawText;
if (lpDrawItemStruct->itemID == -1)
{
GetLBText(lpDrawItemStruct->itemID, strDrawText);
}else{
strDrawText = "请选择";
}
TEXTMETRIC TextMetr;
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
if (pDC){
pDC->GetTextMetrics(&TextMetr);
CRect rcClient;
GetClientRect(&rcClient);
if ((lpDrawItemStruct->itemState & ODS_SELECTED) &&
(lpDrawItemStruct->itemAction&(ODA_DRAWENTIRE | ODA_SELECT)))
{
pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(101, 160, 251));
pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
pDC->SetTextColor(RGB(255, 255, 255));
pDC->TextOut(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, strDrawText);
}
else if (lpDrawItemStruct->itemAction&(ODA_SELECT | ODA_DRAWENTIRE))
{
pDC->FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255, 255, 255));
pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
pDC->TextOut(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top, strDrawText);
}
ReleaseDC(pDC);
}
}
void CMyCombox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct){
// TODO: 添加您的代码以确定指定项的大小
lpMeasureItemStruct->itemHeight = 40;
}
BEGIN_MESSAGE_MAP(CMyCombox, CComboBox)
ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyCombox::OnPaint() {
CPaintDC dc(this);
OnNcPaint(&dc);
}
void CMyCombox::OnNcPaint(CDC* pDC){
// TODO: 在此处添加消息处理程序代码
//绘制客户区
CDC dMemDC;
dMemDC.CreateCompatibleDC(pDC);
dMemDC.SetMapMode(pDC->GetMapMode());
//画动作
CBitmap mNewBmp;
CRect rc;
GetClientRect(&rc);
mNewBmp.CreateCompatibleBitmap(pDC, rc.right - rc.left, rc.bottom - rc.top);
CBitmap* pOldBmp = dMemDC.SelectObject(&mNewBmp);
CPen pen(PS_SOLID, 1, RGB(200, 200, 200));
CPen *pOldPen = dMemDC.SelectObject(&pen);
CBrush bkBrush;
bkBrush.CreateSolidBrush(RGB(255, 255, 255));
dMemDC.SelectObject(&bkBrush);
CPoint pt(10, 10);
dMemDC.Rectangle(rc);//画整个客户区域
CRect rcEnd(rc);//按钮区域
rcEnd.left = rc.right - 20;
//画右边的三角形按钮
CBrush bkBrushRect;
bkBrushRect.CreateSolidBrush(RGB(21, 123, 237));
dMemDC.SelectObject(&bkBrushRect);
dMemDC.Rectangle(rcEnd);
//画三角形
CRgn rgn;
CPoint ptAngle[3];
int angleSideWidth = 8;//三角形边长
//第一个点的坐标
ptAngle[0].x = rcEnd.left + rcEnd.Width() / 2 - angleSideWidth / 2;
ptAngle[0].y = rcEnd.top + rcEnd.Height() / 2 - 2;
//第二个点的坐标
ptAngle[1].x = ptAngle[0].x + angleSideWidth;
ptAngle[1].y = ptAngle[0].y;
//第三个点的坐标
ptAngle[2].x = rcEnd.left + rcEnd.Width() / 2;
ptAngle[2].y = ptAngle[0].y + 5;
CBrush brushAngle;
rgn.CreatePolygonRgn(ptAngle, 3, ALTERNATE); //创建区域??
brushAngle.CreateSolidBrush(RGB(255, 255, 255)); //创建画刷
dMemDC.FillRgn(&rgn, &brushAngle); //填充区域
//dMemDC.DrawFrameControl( &rcEnd,DFC_SCROLL,DFCS_SCROLLDOWN|DFCS_FLAT|DFCS_MONO );
pDC->BitBlt(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, &dMemDC,
rc.left, rc.top, SRCCOPY);
//绘制按钮文本 定义一个CRect用于绘制文本
CRect textRect;
//拷贝矩形区域
textRect.CopyRect(rc);
//获得字符串尺寸m_btnText textColor
CString btnCaption = _T("ceshi");
CFont font;
font.CreateFont(textSize, 0, 0, 0, 700, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, _T("宋体"));
pDC->SelectObject(&font);
//调整文本位置 居中
textRect.top += (textRect.Height() - textSize) / 2;
//设置文本背景透明
pDC->SetBkMode(TRANSPARENT);
//设置文本颜色
pDC->SetTextColor(RGB(0,0,0));
//绘制文本内容
pDC->DrawText(btnCaption, &textRect, DT_RIGHT | DT_CENTER | DT_BOTTOM);
//恢复
dMemDC.SelectObject(pOldBmp);
dMemDC.SelectObject(pOldPen);
pOldPen->DeleteObject();
pOldBmp->DeleteObject();
dMemDC.DeleteDC();
bkBrush.DeleteObject();
bkBrushRect.DeleteObject();
brushAngle.DeleteObject();
// 不为绘图消息调用 CComboBox::OnNcPaint()
}
int CMyCombox::CompareItem(LPCOMPAREITEMSTRUCT /*lpCompareItemStruct*/)
{
// TODO: 添加您的代码以确定指定项的排序顺序
// 返回 -1 表示项 1 排在项 2 之前
// 返回 0 表示项 1 和项 2 顺序相同
// 返回 1 表示项 1 排在项 2 之后
return 1;
}
void CMyCombox::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
ModifyStyle(0, BS_OWNERDRAW);
CComboBox::PreSubclassWindow();
}
Dlg.h中声明 //下拉框
CMyCombox m_Combox;
再在Dlg.cpp中创建
m_Combox.Create(WS_VISIBLE, CRect(200, 200, 400, 400), this, 1212);
m_Combox.AddString(_T("ceshi"));
m_Combox.AddString(_T("ceshi"));
m_Combox.SetCurSel(1);
函数相关参数可以查阅微软MFC学习