当前位置:C++技术网 > 资讯 > 实现在记事本中输入键盘消息

实现在记事本中输入键盘消息

更新时间:2015-07-29 10:17:52浏览次数:1+次

    今天,我们实现一个这样的功能,就是在VC++6.0编译器中,我们在新建的工程下,运行程序,会弹出一个记事本样的窗口,而我们的工作就是在上面输入键盘消息,如图:VC编译器默认实现的窗口

我们就是要在这上面实现键盘消息输出。

    像我们平常打字那样,首先应该有个焦点即插入符,那好我们来实现,在View类中,点击右键选择WM_CREATE消息,然后在View类中编译代码如下:

int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);

	// TODO: Add your specialized creation code here

	CreateSolidCaret(tm.tmAveCharWidth,tm.tmHeight);
	ShowCaret();

	return 0;
}
    其中TEXTMETRIC这个类使用来获取文本信息的,而我们在这获取的就是字体的大小,因为CreateSolidCaret( int nWidth, int nHeight );函数有两个参数就是我们插入符的宽度以及高度,而这可以由我们的TEXTMETRIC来获取。而CClientDC dc(this),是用来获取设备描述表的,设备描述表有很多中获取方式,我个人喜欢这种,对于设备描述表,我当初学习时老百度理解,对此,有不懂设备描述表的同学,可以百度,靠自己去理解,毕竟是自己为自己解开的疑惑更能让我们好好学,好,我们就这样创建了插入符!其实应该在第一个参数后边除8,但为了更清晰,我便没有,来看看实现如何 

    然后我们实现左键点击,即左键点击那里,哪里就有插入符,看代码:
void CTextView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	SetCaretPos(point);
	m_strLine.Empty();
	m_ptOrigin=point;

	CView::OnLButtonDown(nFlags, point);
}

    这个呢,我们只要在View类中点击右键,选择WM_LBUTTONDOWN就Ok了,最后就是输入键盘消息的响应了,同样在View类中,点击右键选择WM_CHAR,编辑代码如下:
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);

	CView::OnChar(nChar, nRepCnt, nFlags);
	if(nChar==0x0d)
	{
		m_strLine.Empty();
		m_ptOrigin.y+=tm.tmHeight;
	}
	else if(nChar==0x08)
	{
		COLORREF clr=dc.SetTextColor(dc.GetBkColor());
		dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
		m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
		dc.SetTextColor(clr);
	}
	else
	{
		m_strLine+=nChar;
	}
	CSize sz=dc.GetTextExtent(m_strLine);
	CPoint pt;
	pt.x=m_ptOrigin.x+sz.cx;
	pt.y=m_ptOrigin.y;
	SetCaretPos(pt);
	dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
}
    首先我们要在View类中添加两个成员变量,分别为CString m_strLine,CPoint m_ptOrigin,我们之所以选择字符串,就是用它来接受我们的键盘输入,将键盘消息存储在字符串中,最后把他输出来就行了,第二个就是我们鼠标点击的焦点,也就是我们输入键盘消息的起始点,然后再View类的构造函数中将其初始化,如下:
CTextView::CTextView()
{
	// TODO: add construction code here
	
	m_strLine="";
	m_ptOrigin=0;

}
    当我们点击鼠标左键改换焦点或按换行键是都应该将m_strLine清空,要不然,会把之前的输入在字符串中的消息也给带进来,第一个if中0x0d是指换行键的ASCII的16进制的表现形式,第二个0x08是删除键的16进制,当我们换行时,只不过就是将插入符向下移动一个字符的高度,难道不是吗?那我们就只要将我们的输入起点也就是输入焦点的坐标m_ptOrigin的纵坐标加上字体的高度,当然要记得清空原来的字符,删除键的实现,其实就是利用了一个技巧,我们获取窗口背景的颜色并将其赋给我们输入的字体,使其与窗口颜色一致,这样我们不就看不见字了?由于删除键每次只能删一个字符,在这里我们利用一个CString的成员变量Left,它返回该字符串的左边多少个值, m_strLine=m_strLine.Left(m_strLine.GetLength()-1);当我们第一次用删除键,Left返回总长度-1个字符给m_strLine,然后我们将其输出不就ok?
    如果不是这两个消息,我们直接在字符数组后面加上我们的键盘消息,当我们输入的时候,插入符应该随着我们的消息输入移动,因此, CSize sz=dc.GetTextExtent(m_strLine);这行代码就是获取我们输入字符串的长度,在输入消息过程中,焦点即起始点的纵坐标不变,横坐标在原来m_ptOrigin.x的基础上加上我们输入的字符长度,就Ok了,SetCaretPos(.....);该函数实现插入符的位置,其位置有后面的参数决定最后输出就OK!

    我们的网站http://www.cjjjs.com.欢迎您来学习交流!!!!!