MFC第八天

一   MFC绘图
       1.MFC绘图相关类
          CDC----绘图设备类
              createDc
                 CWindowDC--封装了整个窗口的DC,包括标题、边框和客户区。
                 CClientDC--封装了窗口的客户区DC
                 CMetaFileDC--封装了Windows图元文件的处理
                  CPaintDC--封装了客户区DC,只能用在WM_PAINT消息处理          
          CGdiObject--绘图对象类
                  CPen---画笔
                  CBrush---画刷
                  CFont----字体
                  CBitmap--位图
                  CPalette--调色板
                  CRgn--区域(构造一个不规则的区域)
        2.MFC绘图的实现
        利用类向导在View类中添加函数OnDrawCdc()
         CDC dc;
         dc.CreateDC("DISPLAY",NULL,NULL,NULL);
         dc.TextOut(50,50,"hello CDC");
         dc.DeleteDC();
         
         添加函数OnDrawWindowdc()
         CWindowDC dc(AfxGetMainWnd());
         dc.TextOut(0,0,"hello CWindowDC");
         
         OnDrawClientdc()
         CClientDC dc(this);
         dc.TextOut(0,0,"Hello CClientDC");   
      
      
        OnDrawPen()
        CClientDC dc(this)
        CPen pen(PS_SOLID,5,RGB(255,0,0));
        CPen *pOldPen=(CPen*)dc.SelectObject(&pen);
        dc.Rectangle(50,50,150,150);
        dc.SelectObject(pOldPen);
        pen.DeleteObject();
        
        
        OnDrawBrush()
        CClientDC dc(this);
        CBrush brush(RGB(0,0,255));
        CBrush *pOldBrush=(CBrush*)dc.SelectObject(&brush);
        dc.Rectangle(200,50,300,300);
        dc.SelectObject(pOldBrush);
        brush.DeleteObject();
        
        CClientDC dc(this);
        CBitmap bmp;
        bmp.LoadBitmap(IDB_BitMAP2);
        CBrush brush(&bmp);
        
        OnDrawFont()
        CClientDC dc(this);
        CFont font;
        font .CreatePointFont(500,"黑体");
        CFont *pOldFont=(CFont *)dc.SelectObject(&font);
        dc.TextOut(200,200,"Hello CFont") ;
        dc.SelectObject(pOldFont);
        font.DeleteObject();
        
        OnDrawBitmap()
        CClientDC dc(this);
        CBitmap bmp;
        bmp.LoadBitmap(IDB_BITMAP3);
        CDC dcBmp;//兼容dc
        dcBmp.CreateCompatibleDC(&dc);
        //将位图选入到兼容dc
        dcBmp.SelectObject(&bmp);
         dc.BitBlt(0,0,428,247,&dcBmp,0,0,SRCCOPY);
         //位图根据给定的位置伸缩
         //dc.StretchBlt(0,0,800,600,&dcBmp,0,0,428,247,SRCCOPY);
         
         或
         HBITMAP hBmp=LoadImage(NULL,"F:\\6582clc0.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
         //将句柄附加到对象
         bmp.Attach(hBmp);
         
         //调色板
         OnDrawPalette()
         //创建调色板
         LOGPALETTE *pLogPalette=NULL;
         //计算调色板所占内存空间大小
         int nLen=sizeof(LOGPALETTE)+sizeof(PALETIEENTRY)*256;
         //分配内存空间
         pLogPalette=(LOGPALETTE)malloc(nLen);
         pLogPalette->palVersion=0x300;
         pLogPalette->palNumEntries=256;
         for(int i=0;i<256;i++){
         pLogPalette->palPalEntry[i].peBlue=i;
         gPalette->palPalEntry[i].peGreen=0;
         gPalette->palPalEntry[i].peBlue=0;
         }
         //创建调色板
         CPalette pal;
         pal.CreatePalette(pLogPalette);
         free(pLogPalette);
         //在绘图中使用调色板
         CClientDC dc(this);
         CPalette *pOldPalette=dc.SelectPalette(&pal,FALSE);
          //加载调色板
          dc.RealizePalette();
          //使用调色板中的颜色
          CPen pen(PS_SOLID,10,PALETTEINDEX(200));
          CPen *pOldPen=(CPen*)dc.SelectObject(&pen);
          dc.Moveto(100.100);
          dc.LineTo(300.300);
          dc.SelectPalette(pOldPalette,FALSE);
          dc.SelectObject(pOldPen);
          
          CRgn--区域(构造一个不规则的区域)
          1.作用:基于基本的几何图形,构建复杂的几何图形。
          2.使用
              1.使用一系列CreateXXX函数创建基本的图形
              2.使用CombineRgn将两个图形进行几何运算
              3.绘制,填充几何图形
                  CDC::FillRgn--填充
                  CDC::FrameRgn--填充边框
            
            
            //构造基本的几何图形
            CRgn rgn1;
            rgn1.CreateEllipticRgn(200,200,500,500);
            CRgn rgn2;
            rgn2.CreateEllipticRgn(300,200,600,500);
            //将两个图形进行几何运算
            rgn1.CombineRgn(&rgn1,&rgn2,RGN_AND);
            //绘图图形
            CClientDC dc(this);
            CBrush brush(RGB(0,0,255));
            dc.FillRgn(rgn1,&brush);
            //填充边框
            CBrush brushFrame(RGB(255,0,0));
            dc.FrameRgn(&rgn1,&brushFrame,1,5);
            //设置rgn1为框架窗口的区域,创建不规则窗口
            AfxGetMainWnd()->SetWindowRgn(rgn1,TRUE);
             
             
             绘制直线
             添加类的成员变量:CPoint m_ptBegin;
             OnLButtonDown
             m_ptBegin=point;
             OnLButtonUp
             CclientDC dc(this);
             dc.MoveTo(m_ptBegin);
             dc.LineTo(point);
             
             //矩形
             dc.Rectangle(m_ptBegin.x,m_ptBegin.y,point.x,point.y);
             //椭圆 
             dc.Ellipse(m_ptBegin.x,m_ptBegin.y,point.x,point.y);
             
             
             CBrush *pOldBrush=(CBrush*)dc.SelectObject(dc.SelectStockObject(NULL_BRUSH));
             SelectStockObject(NULL_BRUSH)//获取库存对象,空画刷
             CBrush *pOldBrush=(CBrush*)dc.SelectObject(CBrush::FromHandle((HBRUSH)dc.SelectStockObject(NULL_BRUSH)));
             
                       
        
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值