Windows程序设计__孙鑫C++Lesson5《文本操作》

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_CHARWM_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及其回调函数的使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值