VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
11 dc.DrawText(str,&rect,DT_LEFT); 12 if(m_nIndex>sz.cx) 13 {
14 m_ nWidth =0;
15 dc.SetTextColor(RGB(0,255,0)); 16 dc.TextOut(0,50,str); 17 }
———————————————————————————————————————
代码中6~7行定义rect的top和left分别为50和0(即左上角),是因为在开始的OnDraw()函数中我们输出文本时,是在(0,50)的位置输出的,因此,为了看到颜色渐变的效果,也要将变色的文本在同一位置上输出。矩形rect 的右下角(right)是随着timer事件不断变化的,但有一点可以肯定,它的bottom始终不变,始终是文本输出的左上角的y值加上文本的高度。
第11行代码利用DrawText函数来实现卡拉OK逐步变色的效果。我们在OnDraw中输出了一次IDS_MYSTRING标识的字符串,在OnTimer中,将文字颜色设置为另一种颜色,然后用DrawText函数在原来的位置再输出一次字符串,开始在一个小矩形上输出,每调用一次OnTimer,矩形的宽度变大一点,所得到的效果就是文字在一点一点的变色,模拟了卡拉OK的逐渐变色的效果。
5.5.3.3 剪切区和路径层
在DC中有一个剪切区的概念,在剪切区中的内容将被保护起来,不被后来的绘制操作破坏。您可以做一个这样的实验:我们在OnDraw()函数中随便输出一条文本,然后同样在OnDraw()函数中在输出文本代码的后面编写输出网格的代码,如下:
//在屏幕的(20,20)位置输出一行文本
CString str=”Hello World!”; pDC->TextOut(20,20,str); //绘制网格
for (int i=0;i<=300;i+=10) {
pDC->MoveTo(0,i); pDC->LineTo(300,i); pDC->MoveTo(i,0); pDC->LineTo(i,300); }
这时运行程序,会发现先输出的文字被后绘制的网格穿过。那么,如果我们不希望这样一来的结果,该怎样来避免呢?有的读者大概已经想到了用剪切区。我们可以用剪切区保护文字不被网格穿过。产生剪切区有两种方法: 一. 由CRgn 来产生剪切区:
CSize sz=pDC->GetTextExtent(str); //得到字符串的大小信息 CRgn rn;
rn.CreateRectRgn(20,20,sz.cx,sz.cy); //产生一个区域覆盖输出的字符串 pDC->SelectClipRgn(&rn,RGN_DIFF); //根据区域产生剪切区 二. 由Path(路径层)来产生剪切区:
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
在设备描述表中还有一个路径层的概念,在BeginPath()函数和EndPath()函数之间DC上的笔所经过的路线定义了一条路径层,可以通过路径来产生剪切区。需要特别强调的是:路径层和区域不同,一个DC只对应一条路径层。
CSize sz=pDC->GetTextExtent(str); //得到字符串的大小信息 pDC->BeginPath(); //开始记录一条路径层
pDC->Rectangle(0,50,sz.cx,sz.cy); //DC上笔所经过的路线写入路径层 pDC->EndPath(); //结束记录路径层 pDC->SelectClipPath(RGN_DIFF); //由路径层产生剪切区
上一小节讲过的模拟卡拉OK的程序,用剪切区也可以实现,请读者课后参照以上程序,自己动手编制。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章(7)在线全文阅读。
相关推荐: