MFC重绘下拉框

.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学习

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠风丶北枝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值