- CDC类
-
CDC类是CObject类的直接派生类,为和设备上下文互操作提供成员函数,也提供成员变量为了和与一个窗口的用户区相关的设备上下文一起工作。
-
CClientDC类是CDC的派生类,封装了代表窗口中用户区的设备上下文的操作;CWindowDC封装了整个窗口的设备上下文操作。
-
-
OnDraw() 函数在每次窗口重绘的时候都被调用一次。所以要显示一直存在的图形或文字应该在这个函数中输出。
-
利用路径层概念输出一串字符,显示在网格之上。
-
代码
1 CString str = "瓦卡挖矿挖矿挖矿挖";
2 pDC->TextOut(50, 50, str);
3
4 CSize cs = pDC->GetTextExtent(str);
5 pDC->BeginPath();
6 pDC->Rectangle(50, 50,50+cs.cx, 50+cs.cy);
7 pDC->EndPath();
8 pDC->SelectClipPath(RGN_DIFF);
9 for(int i=0; i<300; i+=10){
10 pDC->MoveTo(0, i);
11 pDC->LineTo(300, i);
12
13 pDC->MoveTo(i, 0);
14 pDC->LineTo(i, 300);
15 }其中CSize CDC::GetTextExtent(const string& str)是获得字符串str的相关信息。CSize中的cx,cy代表宽度和高度。要注意这个函数与BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics)的区别,后者是获得当前字体的信息。CDC::SelectClipPaht()的作用是将现在的路径层和当前的剪切域进行互操作。剪切区域的概念,可以理解为一个绘图的区域。
-
实现文字输入输出,以及回车退格的处理。
-
代码
1 CClientDC dc(this);
2 TEXTMETRIC tm;
3 dc.GetTextMetrics(&tm);
4 if(0x0d == nChar){
5 ptOrigin.y += tm.tmHeight;
6 SetCaretPos(ptOrigin);
7 strLine.Empty();
8 }else if(0x08 == nChar){
9 COLORREF color = dc.SetTextColor(dc.GetBkColor());
10 dc.TextOut(ptOrigin.x, ptOrigin.y, strLine);
11 strLine = strLine.Left(strLine.GetLength()-1);
12 dc.SetTextColor(color);
13 }else
14 strLine += nChar;
15 CSize sz = dc.GetTextExtent(strLine);
16
17 CPoint pt;
18 pt.x = this->ptOrigin.x + sz.cx;
19 pt.y = this->ptOrigin.y;
20
21 SetCaretPos(pt);
22 dc.TextOut(ptOrigin.x, ptOrigin.y, strLine); -
实现类似卡拉OK的字幕变色
-
代码
m_nWidth += 5;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CRect rec;
rec.left = 350;
rec.top = 350;
rec.right = rec.left+m_nWidth;
rec.bottom = rec.top + tm.tmHeight;
CString str;
str.LoadString(IDS_MYSTRING);
dc.SetTextColor(RGB(255,12,14));
dc.DrawText(str, rec, DT_CENTER);
CSize sz = dc.GetTextExtent(str);
if(m_nWidth > sz.cx){
m_nWidth = 0;
dc.SetTextColor(RGB(0,0,255));
dc.TextOut(350,350,str);
}在这段代码中值得注意的是CDC::DrawText(); 这个函数在一个给定的矩形区域内输出字符串,并且还有一个输出格式可以修改。这段代码是在OnTimer(UINT_PTR nIDEvent)函数中的,这个函数实际上是WM_TIMER消息的响应函数。在MFC中定时器是由UINT_PTR SetTimer( UINT_PTR nIDEvent, UINT nElapse, void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD) ); 设定的,第一个参数是指定一个定时器的标识,第二个参数nElapse设定一个时间间隔,单位是毫秒;第三个参数是指定一个回调函数,一般使用默认值,即指定为NULL,将消息加入到wnd的消队列中。使用BOOL KillTimer( UINT_PTR nIDEvent ); 去除一个由nIDEvent指定的定时器。
-
这节课主要学习了文本编程,并且学习了定时器的使用,这个定时器貌似在做小游戏的时候很有用。
PS:这是我第一次尝试着使用博客来记录自己的学习过程,是一个不错的尝试,不过就是速度很慢,写了这麽一点就用了将近三个小时,不过效果确实不错。今天算是给自己开了一个好头吧!加油!