MFC学习--单文档文本框的编辑(二)

创建一个MFC的单文档工程,实现利用键盘输入文字功能,并存在光标跟随移动。

学习到对于鼠标消息,字符输入消息的响应。

MFC单文档程序创建后,有四个类,也是四个文件。CMainFrame,CMFC_tets1App,CMFC_tets1Doc,CMFC_tets1View。CMainFrame属于框架类,包括客户区和非客户区,视图类即View类的父窗口,视图就显示在MainFrame的客户区中

CMFC_tets1App 负责:处理消息,将收到的消息分发给相应的对象。CMFC_tets1Doc 文档类。CMFC_tets1View视图类,主要是客户区处理。

1、首先创建光标,在OnCreate()函数中,如果没有,利用WM_CREATE消息创建

<span style="font-size:18px;">int CMFC_tets1View::OnCreate(LPCREATESTRUCT lpCreateStruct) //创建客户区窗口时调用的函数
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	CClientDC dc(this);//创建客户区类型
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);//获取当前字符高度和宽度值,来矫正插入光标的大小
	CreateSolidCaret(tm.tmAveCharWidth / 8, tm.tmHeight);//创建插入符
	ShowCaret();//显示插入符

	SetTimer(1, 100, NULL);//设置定时器消息,1表示定时器标识符,100表示100ms产生一个消息,NULL指的是进入消息队列产生WM_TIMER消息
	// TODO:  在此添加您专用的创建代码

	return 0;
}</span>
2、利用鼠标按下消息,使光标跟随鼠标移动
void CMFC_tets1View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	SetCaretPos(point);//根据鼠标点击显示光标位置
	m_ptOrigin = point;
	m_strLine.Empty();//每次点击改变光标位置时,将用于显示的存储字符串清空

	CView::OnLButtonDown(nFlags, point);
}


3、利用WM_CHAR消息响应键盘输入信息
void CMFC_tets1View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);//获取当前输入字符的高度和宽度
	if (0x0d == nChar)//0x0d表示回车符,点击回车后的一些操作
	{
		m_strLine.Empty();
		m_ptOrigin.y += tm.tmHeight;//将光标下移一个字符
	}
	else if (0x08 == nChar)//0x08退格符,下面使用实现的方法是,先将文本背景色取出,然后将背景色设置为字体颜色,重写字体,即覆盖了原来字体。然后将字体颜色恢复,同时将字符串中减少一个字符,再重写字体,实现删除一个字体功能
	{
		COLORREF clr = dc.SetTextColor(dc.GetBkColor());//将字体色改为背景颜色
		dc.TextOutW(m_ptOrigin.x, m_ptOrigin.y, m_strLine);//重写字体,即覆盖原来的字体
		m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);//获取字符串左边减一字符
		dc.SetTextColor(clr);//重新设置字体颜色
	}
	else
	{
		m_strLine = m_strLine + (TCHAR)nChar;
	}
	CSize cs;
	cs = dc.GetTextExtent(m_strLine);//获取这一行文本的高度和宽度值
	CPoint pt;
	pt.x = m_ptOrigin.x + cs.cx;
	pt.y = m_ptOrigin.y;
	SetCaretPos(pt);//重新设置光标位置,跟随字符输入移动
	dc.TextOutW(m_ptOrigin.x, m_ptOrigin.y, m_strLine);//根据原鼠标点击位置输出字符
	CView::OnChar(nChar, nRepCnt, nFlags);
}




  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值