《VC++深入详解–学习笔记》(5)文本编程
Filed Under (VC++ 学习笔记) by panmaoru on 09-12-2009
本章简单介绍了一些关于文本编程的知识,其中比较重要的几个概念:插入符,窗口重绘,字符输入,定时器。
5.1 插入符
插入符Caret用来提示用户当前相应的位置。如果想要在程序中创建插入符,可以用CWnd类的CreateSolidCaret函数来完成,函数原型如下。
Void CreateSolidCaret(int nWidth,int nHeight);//两个参数分别表示插入符的宽度和高度
在一个MFC的单文档应用程序中,对文本的操作通常在View类中实现,要在View窗口创建之后再创建一个插入符,需要使用OnCreate函数。插入符的宽度通常为当前设备表述表中字符的平均宽度的1/8,高度和字符高度相同。
int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
return 0;
}
5.2窗口重绘
View类窗口产生和重绘时都要调用OnDraw函数。
5.3字符输入
1.消息捕获
字符输入属于WM_CHAR消息,可以通过捕获WM_CHAR消息来获取键盘输入信息。
2.应该在插入符的位置输出键盘输入信息,输入之前需要先设定插入符位置,输出的时候相应修改插入符位置,以便下次输入输出,在View类区域的任何位置点击鼠标,设定插入符位置。
void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
SetCaretPos(point);
//SetCaretPos(m_ptSecond);一个类中同时只能有一个插入符
m_strLine.Empty();
CView::OnLButtonDown(nFlags, point);
}
3.回车与退行,字体
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this); //设置字体
CFont font;
font.CreatePointFont(200,"华文楷体",NULL);
CFont *pOldFont=dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d==nChar)//回车
{
m_strLine.Empty();
m_ptOrigin.y+=tm.tmHeight;
}
else if(0x08==nChar)//退行
{
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 cs=dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x=m_ptOrigin.x+cs.cx;
pt.y=m_ptOrigin.y;
SetCaretPos(pt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
dc.SelectObject(pOldFont);
CView::OnChar(nChar, nRepCnt, nFlags);
}
5.4定时器Timer
CWnd类的SetTimer成员函数可以设置定时器,该函数的声明形式如下表示:
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer) (HWND, UINT, UINT, DWORD) );
添加一个WM_Timer函数
void CTextView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
MessageBox("。。。");
CView::OnTimer(nIDEvent);
}
并在View类的OnCreate函数内设置一个定时器SetTimer
SetTimer(1,1,NULL);
运行,开启声音,彷如机关枪扫射的感觉,没几秒钟,程序就自动卡死了。
