Windows程序设计__孙鑫C++Lesson5《文本操作》
本节要点:
1.插入符的创建与显示
2.字体和指定字符串的高度、宽度等信息获取
3.CString 类的使用
4.路径层与剪切区概念和使用方法
5.字符的输入与显示
6.卡拉ok字幕效果实现
//****************************************************************************************************
1.插入符的创建并显示
//创建符合字体高度和平均宽度的插入符
TEXTMETRIC tm;
CClientDC dc(this);
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);//创建插入符并显示 tm.tmAveCharWidth/8 经验值
SetCaretPos(m_ptOrigin);//插入符设置在首行
ShowCaret();
//位图插入符
/*CClientDC dc(this);
m_bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&m_bitmap);//创建插入符并显示 tm.tmAveCharWidth/8是经验值
ShowCaret();*/
2.字体和字符串宽度与高度信息获取
字体宽度和高度等信息获取使用GetTextMetrics()函数;输出字符串的长度和宽度信息使用GetTextExtent()函数获取。
字体信息的结构体为TEXTMETRIC,结构中的变量int tmAscent,int tmDescent;的理解如下图所示:
3.CString 构造方法
构造str方法1 CString str("Text Experiment!");
构造str方法2 CString str;str="Text Experiment!";
构造str方法3 str.LoadString(IDS_STRINGTEST);
4.路径层与剪切区
路径层 形成类似一个区域的对象,可以再里里面包含一系列绘图操作,一般用来生产复杂的图元;
剪切区 局限于某一个空间的绘图区域;
演示代码:
//****************************************************************************************************
void CTextView::OnDraw(CDC* pDC)
{
CTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString str("Text Experiment!");//构造str方法1
//构造str方法2 CString str;str="Text Experiment!";
//构造str方法3 str.LoadString(IDS_STRINGTEST)
pDC->TextOut(50,50,str);
CSize cs=pDC->GetTextExtent(str);
pDC->BeginPath();
pDC->Rectangle(50,50,cs.cx+50,cs.cy+50);//矩形圈起输出字符
pDC->EndPath();
pDC->SelectClipPath(RGN_DIFF);//使用剪切区 RGN_DIFF为模式参数
int i;
for(i=0;i<=300;i+=10)
{
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
}
}
//****************************************************************************************************
未使用剪切区,效果如下图:
使用剪切区,效果如下图:
5.字符的输入与显示
(1)保存输入,添加成员变量: CString m_strInput;CPoint m_ptOrigin;
(2)响应WM_CHAR和WM_LBUTTONDOWN消息,在响应函数中添加相应的代码如下:
//****************************************************************************************************
void CTextView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetCaretPos(point);
m_strInput.Empty();
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);
}
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;
CFont font;
font.CreatePointFont(300,"华文行楷",NULL);//创建字体
CFont *pOldFont=dc.SelectObject(&font);
dc.GetTextMetrics(&tm);
//回车换行
if(0x0d==nChar)
{
m_strInput.Empty();
m_ptOrigin.y=m_ptOrigin.y+tm.tmHeight;
SetCaretPos(m_ptOrigin);//插入符转到下一行
}
else
//退格键
if(0x08==nChar)
{
COLORREF cf=dc.SetTextColor(dc.GetBkColor());//背景色输出
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strInput);
m_strInput=m_strInput.Left(m_strInput.GetLength()-1);
dc.SetTextColor(cf);
}
else //普通字符输入
{
m_strInput+=nChar;
}
CSize cs=dc.GetTextExtent(m_strInput);
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_strInput);
dc.SelectObject(pOldFont);
CView::OnChar(nChar, nRepCnt, nFlags);
}
//****************************************************************************************************
输入效果如下图:
6.卡拉ok字幕效果实现
(1)使用函数DrawText()函数的在特定区域画出(矩形区域 )
(2)设定定时器 定时扩充矩形区域的宽度
关于定时器:
函数原型:
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
a.SetTimer(1,100,NULL);使用MFC框架提供的消息响应函数OnTimer();
b. SetTimer(2,90,&TimerProc);使用自定义的回调函数处理WM_TIMER消息
消息响应函数原型及测试代码如下:
void CALLBACK EXPORT TimerProc(
HWND hWnd, // handle of CWnd that called SetTimer
UINT nMsg, // WM_TIMER
UINT nIDEvent , // timer identification
DWORD dwTime // system time
)
{
::MessageBox(hWnd,"Self Defined Function To Deal with WM_TIMER Msg!","Tip",MB_OK);
}
(3)定时输出文字、改变文字颜色
卡拉ok字幕实验代码如下:
//****************************************************************************************************
void CTextView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
KillTimer(2);
//字幕效果演示
CString str("Wellcom ,MFC word edit ! this program is to pratice word processing!");
CClientDC dc(this);
CFont Font;
Font.CreateFont(
50, // nHeight
15, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
"Arial"); //创建字体
CFont *OldFont=dc.SelectObject(&Font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
m_nwidth+=5;
CRect rect;
rect.left=0;
rect.top=200;
rect.bottom=rect.top+tm.tmHeight;
rect.right=m_nwidth;//定义绘图矩形区域
dc.TextOut(0,200,str);
COLORREF cf=dc.SetTextColor(RGB(255,0,0));
dc.DrawText(str,&rect,DT_LEFT);//从左向右输出
rect.top=150;
rect.bottom=rect.top+tm.tmHeight;
dc.DrawText(str,&rect,DT_RIGHT);//从右边开始向右输出
CSize size;
size=dc.GetTextExtent(str);
if(m_nwidth>size.cx) //超出字符串长度则重新输出
{
m_nwidth=0;
dc.SetTextColor(RGB(0,255,0));
dc.TextOut(0,200,str);
}
dc.SetTextColor(cf);
dc.SelectObject(OldFont);
CView::OnTimer(nIDEvent);
}
//****************************************************************************************************
效果如下图:
本节小结:
1.掌握字体信息和指定字符串字体信息的差别
2.掌握插入符、字体的创建和使用
3.掌握字符录入的简单原理
4.掌握Timer及其回调函数的使用