MFC带灰色Tip注释文本的编辑框CTipEdit

        MFC的编辑框CEdit是没有注释文本功能的,而现实中常常需要编辑框里有灰色的默认展示文本,当鼠标点击进入文本框时,注释信息自动消失,这时可以正常输入想要的文本。

        而当清空编辑框里面的文本时,又想要展示灰色的注释文本,我在网上找了一些文章,发现没有现成的功能函数,都是比较麻烦的。

        这里就重写了一个继承CEdit的编辑框类,其效果如下图:

MFC带灰色Tip注释文本的编辑框CTipEdit_第1张图片MFC带灰色Tip注释文本的编辑框CTipEdit_第2张图片MFC带灰色Tip注释文本的编辑框CTipEdit_第3张图片MFC带灰色Tip注释文本的编辑框CTipEdit_第4张图片

新的编辑框类代码如下:

// TipEdit.h头文件
#pragma once


// CTipEdit

class CTipEdit : public CEdit
{
	DECLARE_DYNAMIC(CTipEdit)

public:
	CTipEdit();
	virtual ~CTipEdit();

public:
	void SetTipText(CString sTip);		// 设置Tip注释信息
	void InsertTipText(CString sTip);	// 插入一行Tip注释信息
	void DeleteTip();					// 删除Tip注释信息
	CString GetTip() { return m_strTip; }// 获取Tip注释信息
	CString GetEditText();				// 获取编辑框文本,注释信息返回空文本
private:
	CString m_strTip;

protected:
	DECLARE_MESSAGE_MAP()
	afx_msg void OnEnKillfocus();
	afx_msg void OnEnSetfocus();
	afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);

    // 这里可有可无,主要是响应回车和空格按键的
	virtual BOOL PreTranslateMessage(MSG* pMsg);
};


// TipEdit.cpp : 实现文件
//
#include "TipEdit.h"

// CTipEdit
IMPLEMENT_DYNAMIC(CTipEdit, CEdit)

CTipEdit::CTipEdit()
{
	m_strTip = L"";
}

CTipEdit::~CTipEdit()
{
}

void CTipEdit::SetTipText(CString sTip)
{
	m_strTip = sTip;
	SetWindowText(m_strTip);
}

void CTipEdit::InsertTipText(CString sTip)
{
	if (!m_strTip.IsEmpty())
	{
		m_strTip += L"\r\n";
	}
	m_strTip += sTip;
	SetWindowText(m_strTip);
}

void CTipEdit::DeleteTip()
{
	m_strTip = L"";
	SetWindowText(m_strTip);
}

CString CTipEdit::GetEditText()
{
	CString str;
	GetWindowText(str);
	if (str == m_strTip)
	{
		str = _T("");
	}
	return str;
}

void CTipEdit::OnEnKillfocus()
{
	CString str;
	GetWindowText(str);
	if (str == _T(""))
	{
		SetWindowText(m_strTip);
	}
}

void TcEditEx::OnEnSetfocus()
{
	CString str;
	GetWindowText(str);
	if (str == m_strTip)
	{
		SetWindowText(_T(""));
	}
}

HBRUSH CTipEdit::CtlColor(CDC * pDC, UINT nCtlColor)
{
	CString str;
	GetWindowText(str);
	if (str == m_strTip)
	{
		pDC->SetTextColor(RGB(192, 192, 192));
		return (HBRUSH)GetStockObject(WHITE_BRUSH);
	}

	// TODO:  如果不应调用父级的处理程序,则返回非 null 画笔

	return NULL;
}

BOOL CTipEdit::PreTranslateMessage(MSG* pMsg)
{
	if (WM_KEYDOWN == pMsg->message)
	{
        // 这里只是简单的将换行与空格加到文本的最后,可以考虑加到光标位置后面
		if (VK_RETURN == pMsg->wParam)
		{
			CString sEditMsg = L"";
			GetWindowTextW(sEditMsg);
			sEditMsg += L"\r\n";
			SetWindowTextW(sEditMsg);

			int nLength = sEditMsg.GetLength();
			SetSel(nLength, nLength, FALSE);
			SetFocus();
			return TRUE;
		}
		else if (VK_SPACE == pMsg->wParam)
		{
			CString sEditMsg = L"";
			GetWindowTextW(sEditMsg);
			sEditMsg += L" ";
			SetWindowTextW(sEditMsg);
			int nLength = sEditMsg.GetLength();
			SetSel(nLength, nLength, FALSE);
			SetFocus();
			return TRUE;
		}
	}
	return CWnd::PreTranslateMessage(pMsg);
}


BEGIN_MESSAGE_MAP(CTipEdit, CEdit)
	ON_CONTROL_REFLECT(EN_KILLFOCUS, &CTipEdit::OnEnKillfocus)
	ON_CONTROL_REFLECT(EN_SETFOCUS, &CTipEdit::OnEnSetfocus)
	ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

你可能感兴趣的:(MFC,C++,mfc,c++)