VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
是这样实现起来很难,所以我们换种方法,将字符串以屏幕背景色输出,将原来屏幕上的一行字覆盖,由于覆盖在上面的字符串颜色和屏幕的颜色相同,因此看起来整行字不见了,然后将字符串的最后一个字符删除,将原来设备描述表中的颜色取回来,再输出字符串,这样给我们的感觉就好象是删掉一个字符。代码如下:
else if(0x08==nChar) {
//将文字颜色设置为背景色,并将原来颜色保留到oldClr中 COLORREF oldClr;
oldClr=dc.SetTextColor(dc.GetBkColor());
//用背景色将字符串再输出一遍,相当于将字符串擦去
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strInput); //将文字颜色设置为正常颜色 dc.SetTextColor(oldClr);
//将字符串最后的一个字符去掉
m_strInput=m_strInput.Left(m_strInput.GetLength()-1); }
代码中的COLORREF类型用于保存RGB颜色值。函数GetBkColor用于获取屏幕的背景色。SetTextColor函数用于设置输出文本的颜色值,该函数原形如下: virtual COLORREF SetTextColor( COLORREF crColor ); 该函数只有一个参数crColor就是用户希望文本输出的颜色,该函数执行成功之后
会返回一个COLORREF类型的颜色值,返回的颜色值就是先前文本的正常颜色,因此,我们之前定义了一个COLORREF oldClr;用来保存当设备描述表选取新的文本颜色时返回的原来的文本颜色。
然后,用背景色将字符串输出一遍,相当于将字符串擦去,用户就看不到了,
输出之后,再将文字颜色设置为先前的正常色,最后,将字符串最后的一个字符去掉。
5) 最后在OnChar函数中处理其他的字符,并且不断调整光标闪烁的位置。由于每输
入一个字符,光标都要往后移动,所以应该再定义一个局部变量CPoint pt,用来记录光标显示的位置,代码如下:
else {
m_strInput+=nChar; }
CSize sz=dc.GetTextExtent(m_strInput); CPoint pt(sz.cx,m_ptOrigin.y); SetCaretPos(pt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strInput); dc.SelectObject(pOldFn);
代码中的GetTextExtent函数是用来获取用当前字体写出来的字符串文本的长度和高度信息。函数原形如下:
CSize GetTextExtent( const CString& str );
参数str就是指定的字符串,该函数最终返回一个CSize类型的值,而我们知道CSize类有两个整型值cx、cy,在这里就分别用于存放字符串的宽度和高度。每当
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
输入一个字符,光标的位置的x坐标值随着字符串的增长向后移动,而y坐标值始终和字符串输出的起始位置的y坐标一样。
上面我们把OnChar函数中的代码分解开来讲,读者看着可能不是很清晰,下面清单5-02中的代码就是OnChar函数中的完整代码。
清单5-02 工程EX05_05中CEX05_05View::OnChar函数的代码 void CEX05_05View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
// TODO: Add your message handler code here and/or call default CClientDC dc(this); CFont newFn;
newFn.CreatePointFont(200,\隶书\ CFont *pOldFn=dc.SelectObject(&newFn); TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight); ShowCaret(); //如果是回车符 if('\\15'==nChar) {
m_ptOrigin.x=0;
m_ptOrigin.y+=tm.tmHeight; m_strInput.Empty(); }
//如果是退格符
else if(0x08==nChar) {
COLORREF oldClr;
oldClr=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strInput); dc.SetTextColor(oldClr);
m_strInput=m_strInput.Left(m_strInput.GetLength()-1); } else {
m_strInput+=nChar; }
//取得字符串文本的长度和高度
CSize sz=dc.GetTextExtent(m_strInput); CPoint pt(sz.cx,m_ptOrigin.y); SetCaretPos(pt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strInput);
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
dc.SelectObject(pOldFn);
CView::OnChar(nChar, nRepCnt, nFlags); }
5.5.3.2 模拟卡拉OK程序
读者对卡拉OK肯定不会陌生,音响里放着音乐,电视屏幕上的文字就会根据音乐的旋律和节奏逐渐的将字的颜色改变成另一种颜色,以便歌者掌握节奏。本例程将简单的模仿这个功能。试想一下,屏幕上有一段文字,你要逐个的将一个一个字符的颜色改变,甚至半个半个的改变字符的颜色,实现起来相当的困难,那么有没有一种更简单的方法呢?有!我们可以利用DrawText函数,与TextOut函数不同的是,该函数用于在一个矩形范围内输出文本,如果文本长度大于矩形宽度,超出的部分将被裁剪掉。利用这个函数,再配合定时器消息,不难达到我们要实现的效果。完整例程请参见光盘中的例子代码EX05_06。下面将详细的讲述程序编制的步骤。 ? 步骤1:新建一个单文档-视图结构的MFC应用程序,工程名为EX05_06或用户自定义。 ? 步骤2:添加一个字符串资源到工程中。
1) 单击工作台的ResourceView标签,使工作台窗口显示的资源面板页面。
2) 展开最顶层的EX05_06 resources结点,之后,会看到一个String Table(字符串
表)文件夹。
3) 展开String Table文件夹旁边的结点会看到该文件夹下有一个和文件夹同名的
String Table表。如图5-05所示。
图5-05 String Table
4) 双击图5-05所示的String Table,在右边的编辑窗口中会出现一个字符串资源表,
如图5-06所示。
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
5) 将该表格的滚动条拉到最底端,见有一个空白表项,双击该表项,会弹出如图5-07
所示的对话框,该对话框用来添加一个字符串资源,我们可以给添加的字符串资源自定义一个ID号,填在对话框上ID后面的文本框中,如IDS_MYSTRING,在下面的Caption一栏中输入该字符串的文本,如“深入学习Visual C++”。
图5-05 字符属性对话框
? 步骤3:在工程的CEX05_06View类中添加成员变量int m_nWidth,用于记录矩形的边界。
该变量一定要在构造函数中初始化为0,否则,该变量的值会是一个不确定的值,这样做,有可能看不出程序最终的运行结果。
? 步骤4:在窗口刚刚产生的时候,应该生成一个定时器.
1) 打开ClassWizard,在工程的CEX05_06View类中加入WM_CREATE消息的处理函数
OnCreate。
2) 在工作台的Class view页面找到OnCreate函数,双击该函数,在右边的代码编辑区
中,填写生成定时器的代码,如下:
int CEX05_06View::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
SetTimer(1,100,NULL); return 0; }
代码SetTimer(1,100,NULL);中的参数解释:
第一个参数是产生的定时器的标识号,一个窗口上可以有多个定时器, 们可以用一个数字来标识产生的是几号定时器。
第二个参数是产生的定时器的时间间隔(毫秒),当规定的时间间隔到来时,系统会向消息队列里发送一个WM_TIMER消息.
第三个参数是一个指向定时器回调函数的指针。当应用程序取到WM_TIMER消息时就会执行这个函数。如果这个参数赋为NULL,取到WM_TIMER消息时就会定义在窗口中的函数.
? 步骤5: 在工作台的Class view页面找到CTestView类的OnDraw()成员函数双击它,
填入代码用于在屏幕上输出我们加入到字符串资源中的文本.我们假定先在屏幕上以红色输出我们自己添加的字符串“深入学习Visual C++”,然后在WM_TIMER消息的处理函数OnTimer中使该文本渐变成蓝色. OnDraw()成员函数代码如下:
CString str1;
str1.LoadString(IDS_MYSTRING);
pDC->SetTextColor(RGB(255,0, 0)); pDC->TextOut(0,50,str1);
上段代码中我们自定义了一个局部变量str1用来存放一个字符串,而这个字符串就是利用LoadString函数把我们先前在资源面板中定义的字符串资源加载进来的.最后,在屏幕上输出.
其中LoadString的作用是装入一个在资源面板中的String Table 中定义的字符串资源,IDS_MYSTRING是这个字符串资源的ID。使用字符串资源的好处是,可以不修改代码而改变字符的内容.
OnDraw是CView 类中的一个虚成员函数,当用户改变了窗口尺寸,或者当窗口恢复了先前被遮盖的部分,应用程序框架都会自动调用OnDraw函数。所以如果在OnDraw函数中加入绘制代码,得到的效果将是绘制的图形在窗口发生改变时还存在。
? 步骤6:打开ClassWizard,在工程的CEX05_06View类中加入WM_TIMER消息的处理函
数OnTimer,在该函数中加入代码以实现文字颜色渐变的效果,代码如清单5-03所示:
清单5-03 CEX05_06View::OnTimer函数代码
——————————————————————————————————————— 1 CString str;
2 str.LoadString(IDS_MYSTRING); 3 CClientDC dc(this);
4 dc.SetTextColor(RGB(0,0,255)); 5 CRect rect; 6 rect.top=50; 7 rect.left=0;
8 CSize sz=dc.GetTextExtent(str); 9 rect.bottom=50+sz.cy; 10 rect.right=m_ nWidth ++;
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章(6)在线全文阅读。
相关推荐: