VS2019 MFC IP Address Control 控件继承CIPAddressCtrl类重绘

这个博客介绍了如何创建一个CMyIPAddressCtrl类,该类继承自CIPAddressCtrl,并提供了自定义背景颜色、字体颜色和鼠标交互状态的功能。作者详细展示了类的声明和实现,包括OnCtlColor、OnMouseMove和OnMouseLeave等消息处理函数,用于改变控件在鼠标悬停和离开时的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMyIPAddressCtrl.h继承类h头文件

#include"MacroDefinition.h"
#pragma once
class CMyIPAddressCtrl:public CIPAddressCtrl
{
	DECLARE_DYNAMIC(CMyIPAddressCtrl)
public:
	CMyIPAddressCtrl();
	virtual ~CMyIPAddressCtrl();
	CBrush   m_NrBkBrush;
	CBrush   m_SlBkBrush;
	BOOL     m_SelectedFlag;
	CFont*   p_Font;

	COLORREF m_SlTextCtrl;
	COLORREF m_UnSlTextCtrl;
	COLORREF m_SlTextBkCtrl;
	COLORREF m_UnSlTextBkCtrl;
	CFont    m_Text;
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg  HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
	void     SetTextNrBackColor(COLORREF eTextNrBkCtrl);
	void     SetTextSlBackColor(COLORREF eTextSlBkCtrl);
	void     SetTextNrColor(COLORREF eNrTextCtrl);
	void     SetTextSlColor(COLORREF eSlTextColor);
	void     SetIPAddressCtrlBackColorNormal(COLORREF iPAddressBkCtrlNormal);
	void     SetIPAddressCtrlBackColorSelect(COLORREF iPAddressBkCtrlSelect);
	bool     SetTextFont(LONG nHeight, bool bBold, bool bItalic, bool bunderline ,const CString& sFaceName);
	bool     SetTextFont(CFont *m_cfont);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnMouseLeave();
};

 CMyIPAddressCtrl.CPP实现文件

#include "pch.h"
#include "CMyIPAddressCtrl.h"

IMPLEMENT_DYNAMIC(CMyIPAddressCtrl, CIPAddressCtrl);
CMyIPAddressCtrl::CMyIPAddressCtrl()
{
	m_SelectedFlag = FALSE;
	SetIPAddressCtrlBackColorNormal(RGB(150,130,50));
	SetIPAddressCtrlBackColorSelect(RGB(0,0,255));
	SetTextNrBackColor(RGB(150, 130, 50));
	SetTextSlBackColor(RGB(0, 0, 255));
	SetTextNrColor(RGB(0, 0, 255));
	SetTextSlColor(RGB(255, 0, 0));
	p_Font = NULL;
	p_Font = new CFont;
}

CMyIPAddressCtrl::~CMyIPAddressCtrl()
{
	p_Font->Detach();
	p_Font->DeleteObject();
	p_Font = NULL;
	m_NrBkBrush.DeleteObject();
	m_SlBkBrush.DeleteObject();
}
BEGIN_MESSAGE_MAP(CMyIPAddressCtrl, CIPAddressCtrl)
	ON_WM_CTLCOLOR()
	ON_WM_MOUSEMOVE()
	ON_WM_MOUSELEAVE()
END_MESSAGE_MAP()

HBRUSH CMyIPAddressCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	pDC->SetBkMode(TRANSPARENT);
	if (m_SelectedFlag==FALSE)
	{	pDC->SetTextColor(m_UnSlTextCtrl);
		pDC->SetBkColor(m_UnSlTextBkCtrl);
		return(HBRUSH)m_NrBkBrush;
	}
	else
	{
		pDC->SetTextColor(m_SlTextCtrl);
		pDC->SetBkColor(m_SlTextBkCtrl);
		return(HBRUSH)m_SlBkBrush;
	}
}
void CMyIPAddressCtrl::SetTextNrBackColor(COLORREF eTextNrBkCtrl)
{
	m_UnSlTextBkCtrl = eTextNrBkCtrl;
}

void CMyIPAddressCtrl::SetTextSlBackColor(COLORREF eTextSlBkCtrl)
{
	m_SlTextBkCtrl = eTextSlBkCtrl;
}

void CMyIPAddressCtrl::SetTextNrColor(COLORREF eNrTextCtrl)
{
	m_UnSlTextCtrl = eNrTextCtrl;
}

void CMyIPAddressCtrl::SetTextSlColor(COLORREF eSlTextColor)
{
	m_SlTextCtrl = eSlTextColor;
}

void CMyIPAddressCtrl::SetIPAddressCtrlBackColorNormal(COLORREF iPAddressBkCtrlNormal)
{
	m_NrBkBrush, Detach();
	m_NrBkBrush.CreateSolidBrush(iPAddressBkCtrlNormal);
}

void CMyIPAddressCtrl::SetIPAddressCtrlBackColorSelect(COLORREF iPAddressBkCtrlSelect)
{
	m_SlBkBrush.Detach();
	m_SlBkBrush.CreateSolidBrush(iPAddressBkCtrlSelect);
}
bool CMyIPAddressCtrl::SetTextFont(LONG nHeight, bool bBold, bool bItalic,bool bunderline, const CString& sFaceName)
{
	p_Font->CreateFontW(nHeight, 0, 0, 0, bBold, bItalic, bunderline, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, sFaceName);
	return this->SetTextFont(p_Font);
}
bool CMyIPAddressCtrl::SetTextFont(CFont *m_cfont)
{
	this->SetFont(m_cfont, TRUE);
	return true;
}

void CMyIPAddressCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
	TRACKMOUSEEVENT		csTME;
	if (!m_SelectedFlag)
	{
		m_SelectedFlag = TRUE;
		Invalidate();
		csTME.cbSize = sizeof(csTME);
		csTME.dwFlags = TME_LEAVE;
		csTME.hwndTrack = m_hWnd;
		csTME.dwHoverTime = 1;
		::_TrackMouseEvent(&csTME);
	}
	CIPAddressCtrl::OnMouseMove(nFlags, point);
}

void CMyIPAddressCtrl::OnMouseLeave()
{
	if (m_SelectedFlag)
	{
		m_SelectedFlag = FALSE;
		Invalidate();
	}
	CIPAddressCtrl::OnMouseLeave();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值