1、CDC类
CWnd *pPicWnd;
CDC *pPicDC;
CPen CurvePen(PS_SOLID, 0, cr);
CPen *OldPen;
pPicWnd=GetDlgItem(IDC_STATIC_PICTURE);//获得位移图片窗体句柄
pPicDC=pPicWnd->GetDC();//获得图片设备环境
OldPen = pPicDC->SelectObject(&CurvePen);
pPicDC->MoveTo(DataCoor);
pPicDC->LineTo(DataCoor);
pPicDC->SelectObject(OldPen);
2、CFont类
CFont类使用步骤:
(1)生成CFont类的对象:CFont myfont;
(2)创建字体:
Myfont.CreateFont(int nHeight, int nWidth……………);
(3)把字体选入设备环境:pDC->SelectObject(&myfont)
CFont MyFont;
MyFont.CreateFont(20,0,0,0,0,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,DEFAULT_PITCH+FF_DONTCARE,"Times New Roman");
CFont *pOldFont;
pPicWnd=GetDlgItem(IDC_STATIC_PICTURE2);//获得位移图片窗体句柄
pPicWnd->GetClientRect(&CoorRect);//获得图片窗体矩形
pPicDC=pPicWnd->GetDC();//获得图片设备环境
pPicDC->SetTextAlign(TA_RIGHT); // 设置文本对齐方式,指定点在中间
pOldFont=pPicDC->SelectObject(&MyFont); // 选择字体风格,并将原有的字体风格存于pOldFont
pPicDC->SetTextColor(RGB(250,250,100)); //设置文字颜色
pPicDC->SetBkMode(TRANSPARENT);//设置文本背景透明,否则后边有一片白色区域
CString Tim;
Tim.Format("%u",FftTim);//把double数据转换成无符号整型
pPicDC->TextOut(CoorRect.left+300,CoorRect.top,Tim);
创建字体的另一种方法例子如下:
CFont myfont;
CFont *oldFont;
LOGFONT font;
memset(&font,0,sizeof(LOGFONT));//为结构体赋初值,默认值
font.lfHeight=50;//字体高度
font.lfWeight=600;
font.lfItalic=TRUE;
strcpy(font.lfFaceName,"Arial");
myfont.CreateFontIndirect(&font);//创建新字体
CClientDC dc(this);//创建设备描述表
oldFont=dc.SelectObject(&myfont);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);//获取字体信息
CString str;
str.Format("新的字体高度为%d",tm.tmHeight);
dc.TextOut(10,20,"新字体");//用新字体输出
dc.SelectObject(oldFont);//恢复设备环境中的旧字体
dc.SetTextColor(RGB(0,0,255));
dc.TextOut(10,100,str);//用旧字体输出
3、CDC和CPaintDC的区别
CDC:建立一个单文档的MFC应用程序,在View类的OnDraw函数中加入画 的函数,如下:
void CCDCDemoView::OnDraw(CDC* pDC)
{
CCDCDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->Rectangle(30,10,130,110);//在屏幕上画一个正方形
pDC->TextOut(10,120,"边长为100个像素的正方形");//正方形下输出文字
}
然后在ClassWizard中给View类加入WMLBOTTONDOWN的消息,在消息响应函数中加入画圆的代码,如下:
void CCDCDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();//使用GetDC函数申请CDC类的指针
pDC->Ellipse(280,10,380,110);//画直径为100个像素的圆
pDC->TextOut(220,120,"单击左键,显示直径为100个像素的圆");
ReleaseDC(pDC);//释放CDC类的指针
CView::OnLButtonDown(nFlags, point);
}
这样程序运行以后会先画一个矩形,点击鼠标出现一个圆,但是当用户区域窗口刷新时,即用户窗口移动、大小改变、窗口被下拉菜单覆盖等,用户区域都要刷新,当用户区域的内容需要刷新时,系统向应用程序消息队列发送WM_PAINT消息,通知窗口执行刷新处理,在本例中系统会自动调用OnDraw函数,所以正方形会始终在窗口中,而OnLButtonDown函数在窗口刷新时,不会被调用,所以窗口刷新以后圆没有了,只有单击左键,圆才会出来。
CPaintDC:系统重绘时发送WM_PAINT消息,调用OnPaint()函数,CPaintDC类一般用于OnPaint()函数中,当窗口重绘时,发送WM_PAINT消息,调用OnPaint函数就“自动”重绘了窗口的内容。例如,给View类田间WM_PAINT消息响应函数OnPaint,在函数中实现窗体左上角画矩形,右下角画圆,这样窗体大小改变的时候矩形和圆都会重绘。OnPaint函数中系统自定义了CPaintDC类的对象dc,其中参数this表明该类代表当前的设备描述表
OnPaint和OnDraw的区别:首先必须明确一点只有OnPaint函数才是相应WM_PAINT消息的函数,如果在View类中没有OnPaint函数,那么窗体刷新重绘时,会通过在MFC的底层代码里的OnPaint函数中调用OnDraw函数,如果View类有OnPaint函数,而且这个OnPaint函数不调用OnDraw函数,那么在View类中的OnDraw函数是永远不会被调用的。通常,OnPaint函数里边主要写输出到显示设备代码,而在OnDraw函数里写输出到打印机等设备代码。
4、CClientDC类
CClientDC类是CDC类中最常用类,可以在任何需要的时候创建一个CClientDC类,CClientDC类的析构函数将自动调用ReleaseDC()自动释放设备描述表。另外,使用CClientDC时,绘图点(0,0)指客户区的左上角。例如,在View类中加入WM_LBUTTODOWN消息的响应函数,在函数中加入如下代码:
//画窗体的对角线
CClientDC dc(this);
CRect rc;
GetClientRect(&rc);
dc.MoveTo(0,0);
dc.LineTo(rc.right,rc.bottom);
dc.MoveTo(rc.right,0);
dc.LineTo(0,rc.bottom);
则点击鼠标左键时就会画出窗口的对角线。
CClientDC dc(this)表示生成一个CClientDC类的对象dc,但是要注意的是在生成对象dc时,要传给CClientDC类的构造器一个this指针,this指针在这里代表窗口类(CMainWnd类)对象的指针。
5、CWindowDC类
与CClientDC类类似,CWindowDC类可以在任何地方使用,也可以自动释放设备描述表,与CClientDC不同的是CWindowDC可以再整个应用程序的窗口上画图,绘图点(0,0)是指整个窗口的左上角。如下代码即可实现在整个窗口画对角线:
//画整个窗体的对角线
CRect rc;
CFrameWnd *pFrm = GetTopLevelFrame();//获得主框架窗口指针
pFrm->GetWindowRect(&rc);
CWindowDC dc(pFrm);
int l,t,r,b;
l = rc.left;
t = rc.top;
r = rc.right;
b = rc.bottom;
rc.right = r-l;
rc.bottom = b-t;
dc.MoveTo(0,0);
dc.LineTo(rc.right,rc.bottom);
dc.MoveTo(rc.right,0);
dc.LineTo(0,rc.bottom);
6、CPen、CBrush
CPen使用步骤:
(1)CPen mypen;//定义画笔对象
(2)mypen.CreatePen(PS_SOLID,3,RGB(255,0,0));//创建画笔
(3)pDC->SelectObject(&mypen);//把画笔选入设备环境
CBrush使用:画刷在画封闭曲线时用于填充颜色。
(1)生成CBrush类对象,在构造器中设置画刷的特征,与CPen不同的是CBrush构造器本身就可以创建CBrush对象及其所需的全部信息,CBrush类有3个构造器比较常用,如下:
CBrush (COLORREF crColor); //创建实心颜色刷
CBrush (int nIndex,COLORREF crColor); //创建阴影线刷
CBrush (CBitmap * pBitmap); //创建纹理刷
其中nIndex为阴影线的类型,比如自左下角至右上角的45度斜线填充、十字交叉线填充、水平线填充等,具体参数查看MSDN。
//创建一个互相交叉的45度线填充的红色画刷
CBrush myBrush(HS_DIAGCROSS,RBG(255,0,0));
(2)用CDC类的SelectObject函数,把画刷选入设备环境
pDC->SelectObject(&myBrush);