Draw in MFC

 

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值