【MFC】编辑框设置固定文字显示(部分文字不可编辑)

思路

1.刚开始想做这个内容的时候,第一想法就是派生CEdit的子类,在子类中处理控件的 EN_UPDATE 事件–就是在当中判断输入的文字是否修改了你的固定文本,如果修改了则重新处理文本恢复固定文本内容在设置回编辑框。
但这个方法有个问题,子控件处理EN_UPDATE事件后,父窗口就无法获取到该消息(如果父窗口不需要处理该消息的话可选择该方法)。
2.因为我这边父窗口需要处理该消息,且两个内容不能合并(也不推荐合并,要不然 该子类只能对于这个父窗口唯一使用)。
3.所以我就在想不可编辑的话,从编辑入手截取编辑消息做处理。
对文本编辑无非就:删除 增加
而对于删除增加文本的内容是靠,鼠标光标位置确定的,所以在删除增加文本的时候判断鼠标光标位置去判断是否可以编辑

代码实现

1.继承CEdit 重写子类
2.重写EN_UPDATE 事件方法:

//.h
afx_msg void OnEnUpdate();
//.cpp
//控件重写 EN_UPDATE  事件的方法
BEGIN_MESSAGE_MAP(子类, CEdit)
	ON_CONTROL_REFLECT(EN_UPDATE, &子类::OnEnUpdate)
END_MESSAGE_MAP()
//。。。
void 子类::OnEnUpdate()
{
//在这里就可以使用获取字符串然后对字符串进行处理啦
//只要文本内容被修改后都会触发此事件可以设置一个标记去判断是否修改
}

3.截取编辑消息方法
(1)鼠标键盘的回退格删除消息/左移右移鼠标光标消息(这几个都是键盘消息一起处理)
(2)鼠标点击移动光标事件

//.h
//捕获按键消息
 void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
 //左击事件
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 //左双击事件
 afx_msg void OnLButtonDblClk(UINT nFlags,CPoint point);
 //保存无法编辑文本内容
 CString  m_Text;
//.cpp
void 子类::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	if (VK_BACK == nChar || VK_LEFT == nChar || VK_RIGHT == nChar)
	{
		CString strText;
		GetWindowText(strText);
		//是否包含不可编辑文本
		if (strText.Find(m_Text) != -1)
		{
			int nStart;
			int nEnd;
			GetSel(nStart, nEnd);
			//相等就是未选择文本时
			if (nStart == nEnd)
			{
				int limLength = m_Text.GetLength();
				int curLength = strText.GetLength();
				if (nStart == limLength)	//说明现在光标所在位置为不可编辑文本的末尾,不可删除,不可移动光标进去,直接return
					if (VK_LEFT == nChar || VK_BACK == nChar)
						return;	
						//光标位置在补课编辑文本内容中,移动光标到文本尾端
					else if (nStart < limLength)
						SetSel(curLength, curLength);
			}
		}
		else
		{
			SetWindowText(m_Text);
			return;
		}
	}
	
	CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
void 子类::OnLButtonDown(UINT nFlags, CPoint point)
{
	//先执行左击事件(使其他可编辑文本能正常编辑)然后判断左击事件后光标是否在不可编辑文本中
	__super::OnLButtonDown(nFlags, point);
	int nStart;
	int nEnd;
	GetSel(nStart, nEnd);
	if (nStart == nEnd)
	{
		CString strText;
		GetWindowText(strText);
		int limLength = m_Text.GetLength();
		int curLength = strText.GetLength();
		if (nStart < limLength)
			SetSel(curLength, curLength);
	}
}

void 子类::OnLButtonDblClk(UINT nFlags, CPoint point)
{
//先执行默认双击事件(使其他可编辑文本能正常编辑),再去判断鼠标光标位置
	__super::OnLButtonDblClk(nFlags, point);
	int nStart;
	int nEnd;
	GetSel(nStart, nEnd);
	CString strText;
	GetWindowText(strText);
	int limLength = m_Text.GetLength();
	int curLength = strText.GetLength();
	if (nStart < limLength || nEnd < limLength)
		SetSel(curLength, curLength);
}
MFC(Microsoft Foundation Classes)中,编辑框(CEdit)的文字颜色可以通过修改控件的样式或者使用消息处理函数来改变。具体来说,有以下几种方式可以实现: 1. 使用`SetTextColor`函数:这个函数用于设置控件中文字的颜色。它接受一个`COLORREF`类型的参数,该参数定义了所需的颜色。例如,如果你想要设置编辑框文字颜色为红色,可以这样调用函数: ```cpp m_EditControl.SetTextColor(RGB(255, 0, 0)); ``` 其中`m_EditControl`是编辑框控件的成员变量。 2. 消息处理:通过处理`WM_CTLCOLOREDIT`消息,可以在编辑框接收到消息时自定义文字和背景颜色。这个消息在编辑框即将绘制文字时发送给父窗口,父窗口可以返回一个画刷(HBRUSH)来设置背景色,或者直接调用`SetTextColor`设置文字颜色。以下是一个处理该消息的示例代码: ```cpp HBRUSH CYourDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (nCtlColor == CTLCOLOR_EDIT) { pDC->SetTextColor(RGB(0, 0, 255)); // 设置文字颜色为蓝色 pDC->SetBkColor(RGB(255, 255, 255)); // 设置背景颜色为白色 return (HBRUSH)GetStockObject(NULL_BRUSH); } return hbr; } ``` 在上面的示例中,`CTLCOLOR_EDIT`是处理编辑框控件的消息,`pDC`是设备上下文指针,用于绘制,`pWnd`是接收消息的编辑框控件指针。 3. 使用`CEdit::SetBkColor`和`CEdit::SetTextColor`:这两个成员函数分别用于设置编辑框的背景色和文字色。这需要在你的`CEdit`派生类中使用,或者通过获取编辑框控件的指针来调用。 ```cpp m_EditControl.SetBkColor(RGB(255, 255, 255)); // 设置背景颜色为白色 m_EditControl.SetTextColor(RGB(0, 255, 0)); // 设置文字颜色为绿色 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值