我是靠谱客的博主 喜悦冥王星,最近开发中收集的这篇文章主要介绍MFC 自定义按钮实现文字和图片同时显示效果,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

添加类CImgButton,继承自CBitmapButton。选择CImgButton类的property,通过重载DrawItem(不是Message下的WM_DRAWITEM,其响应函数OnDrawItem不会被调用。),实现在bitmap上写入文字的功能。
.h文件代码

#pragma once
#include <afxext.h>
class CImgButton :
	public CBitmapButton
{
	//DECLARE_DYNAMIC(CImgButton)

public:
	CImgButton();
	virtual ~CImgButton();

protected:
	//DECLARE_MESSAGE_MAP()
	public:
	
public:
	COLORREF TextColor;
	void SetTextColor(COLORREF crColor);	
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};

.cpp文件代码

#include "stdafx.h"
#include "ImgButton.h"


CImgButton::CImgButton()
{
}


CImgButton::~CImgButton()
{
}

// BEGIN_MESSAGE_MAP(CImgButton, CBitmapButton)
// END_MESSAGE_MAP()

void CImgButton::SetTextColor(COLORREF crColor)
{
	TextColor = crColor;
}

void CImgButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	CRect rect = lpDrawItemStruct->rcItem;
	CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	int nSaveDC = pDC->SaveDC();
	UINT state = lpDrawItemStruct->itemState;
	TCHAR strText[MAX_PATH + 1];
	::GetWindowText(m_hWnd, strText, MAX_PATH);

	CBitmapButton::DrawItem(lpDrawItemStruct);

	pDC->SetTextColor(TextColor);
	if (strText != NULL)
	{
		CFont *hFont = GetFont();
		CFont *hOldFont = pDC->SelectObject(hFont);
		CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
		CPoint pt(rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);
		if (state & ODS_SELECTED)
		{
			pt.Offset(1, 1);
		}
		int nMode = pDC->SetBkMode(TRANSPARENT);
		if (state & ODS_DISABLED)
		{
			pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
		}
		else
		{
			pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
		}
		pDC->SelectObject(hOldFont);
		pDC->SetBkMode(nMode);
	}

	pDC->RestoreDC(nSaveDC);
}

最后在调用验证效果:
1)在dialog中拖入一个button,设置ownerdraw。
2)装载需要的位图资源。
3)对话框头文件中

 #include "ImgButton.h" 
 .......
 .......
 CImgButton m_cImgBtn;
 .......

4)对话框cpp中进行初始化

m_cImgBtn.SubclassDlgItem(IDC_BUTTON5, this);
m_cImgBtn.LoadBitmaps(IDB_BTNLONGU, IDB_BTNLONGD, IDB_BTNLONGU);
m_cImgBtn.SizeToContent();  
m_cImgBtn.SetTextColor(RGB(0,0,0));

最后

以上就是喜悦冥王星为你收集整理的MFC 自定义按钮实现文字和图片同时显示效果的全部内容,希望文章能够帮你解决MFC 自定义按钮实现文字和图片同时显示效果所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部