MFC框架程序----实现八

画图使用
void CMFCDCView::OnDrawCdc()
{
 // TODO: Add your command handler code here
 CDC dc;
 dc.CreateDC("DISPLAY",NULL,NULL,NULL);
 dc.TextOut(50,50,"Hello CDC");
 dc.DeleteDC();

}

void CMFCDCView::OnDrawWindowdc()
{
 // TODO: Add your command handler code here
 CWindowDC dc(AfxGetMainWnd());
 dc.TextOut(0,0,"Hello CWindowDC");
}


void CMFCDCView::OnDrawClientdc()
{
 // TODO: Add your command handler code here
 CClientDC dc(this);
 dc.TextOut(0,0,"Hello CClientDC");

}

void CMFCDCView::OnPaint()
{
 CPaintDC dc(this); // device context for painting
    dc.TextOut(0,100,"Hello CPaintDC"); 
 if (m_hMetaFile)
 {
  dc.PlayMetaFile(m_hMetaFile);
 }
}

void CMFCDCView::OnDrawMetafiledc()
{
 // TODO: Add your command handler code here
 CMetaFileDC dcMeta;
 //创建
 dcMeta.Create("c:\\meta.dat");
    //添加绘制命令
 dcMeta.TextOut(100,200,"Hello Meta");
 dcMeta.MoveTo(200,200);
 dcMeta.LineTo(400,200);
 //...
 //关闭
 m_hMetaFile=dcMeta.Close();
    //显示
 CClientDC dc(this);
 dc.PlayMetaFile(m_hMetaFile);
 //销毁
 //DeleteMetaFile(hMetaFile);
 
}

画线
void CMFCDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 //记录鼠标按下的位置
    m_ptBegin=point;
 CView::OnLButtonDown(nFlags, point);
}

void CMFCDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 
    CClientDC dc(this);
 CBrush *pOldBrush=(CBrush*)dc.SelectObject(
  CBrush::FromHandle((HBRUSH)
  dc.SelectStockObject(NULL_BRUSH)));
  
 
 switch(m_nDrawType)
 {
 case 1://直线
  dc.MoveTo(m_ptBegin);
     dc.LineTo(point);
  break;
 case 2://矩形
  dc.Rectangle(m_ptBegin.x,m_ptBegin.y,
   point.x,point.y);
  break;
    case 3://椭圆
  dc.Ellipse(m_ptBegin.x,m_ptBegin.y,
   point.x,point.y);
  break;

 }
 dc.SelectObject(pOldBrush);
 CView::OnLButtonUp(nFlags, point);
}

void CMFCDrawView::OnDrawLine()
{
 // TODO: Add your command handler code here
 m_nDrawType=1;
}

void CMFCDrawView::OnDrawRect()
{
 // TODO: Add your command handler code here
 m_nDrawType=2;
}

void CMFCDrawView::OnDrawEllipic()
{
 // TODO: Add your command handler code here
 m_nDrawType=3;
}

画图对象的使用

void CMFCGdiObjectView::OnDrawPen()
{
 // TODO: Add your command handler code here
 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();
}

void CMFCGdiObjectView::OnDrawBrush()
{
 // TODO: Add your command handler code here
 CClientDC dc(this);
 //创建画刷
 CBitmap bmp;
 bmp.LoadBitmap(IDB_BITMAP2);
 CBrush brush(&bmp);
 //CBrush brush(HS_BDIAGONAL,RGB(0,0,255));
 //将画刷选入当前设备
 CBrush *pOldBrush=(CBrush*)
         dc.SelectObject(&brush);
 //使用画刷
 dc.Rectangle(200,50,300,300);
 //将原来的画刷选入
 dc.SelectObject(pOldBrush);
 //删除画刷
 brush.DeleteObject();

}

void CMFCGdiObjectView::OnDrawFont()
{
 // TODO: Add your command handler code here
 CClientDC dc(this);
 //创建字体
 CFont font;
 font.CreatePointFont(500,"黑体");
 //选入到dc
 CFont *pOldFont=(CFont *)dc.SelectObject(&font);
 //使用
 dc.TextOut(200,200,"Hello CFont");
 //选出
 dc.SelectObject(pOldFont);
 //删除
 font.DeleteObject();
}

void CMFCGdiObjectView::OnDrawBitmap()
{
 // TODO: Add your command handler code here
 CClientDC dc(this);
 //从指定路径加载位图
    HBITMAP hBmp=(HBITMAP)
  LoadImage(NULL,"F:\\6582c1c0.bmp",
  IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
 CBitmap bmp;
 //将句柄附加到对象上
 bmp.Attach(hBmp);
 //加载位图资源
 //bmp.LoadBitmap(IDB_BITMAP3);
 //创建和当前dc兼容的dc
 CDC dcBmp;//兼容dc
 dcBmp.CreateCompatibleDC(&dc);
    //将位图选入到兼容dc,dcBmp
 dcBmp.SelectObject(&bmp);
    //从兼容dc拷贝位图到当前dc
 //dc.BitBlt(0,0,300,200,&dcBmp,0,0,SRCCOPY);
 //位图可以根据给定的位置伸缩
    dc.StretchBlt(0,0,800,600,&dcBmp,0,0,428,247,
  SRCCOPY);

}

void CMFCGdiObjectView::OnDrawPalette()
{
 // TODO: Add your command handler code here
 
 LOGPALETTE *pLogPalette=NULL;
 //计算调色板所占内存空间大小
 int nLen=
  sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*256;
 //分配内存空间
    pLogPalette=(LOGPALETTE *)malloc(nLen);
 //赋值
    pLogPalette->palVersion=0x300;
 pLogPalette->palNumEntries=256;
    for (int i=0;i<256;i++)
    {
      pLogPalette->palPalEntry[i].peBlue=i;
      pLogPalette->palPalEntry[i].peGreen=0;
      pLogPalette->palPalEntry[i].peRed=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);

 

}

void CMFCGdiObjectView::OnDrawRgn()
{
 // TODO: Add your command handler code here
 //构造基本的几何图形
 CRgn rgn1;
    rgn1.CreateEllipticRgn(200,200,500,500);
 CRgn rgn2;
    rgn2.CreateEllipticRgn(300,200,600,500);
 //将两个图形进行几何运算
    rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR   );
    //绘图图形
 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);
}

一 MFC绘图
   1 MFC绘图相关类
     CDC-绘图设备类
     CreateDC(
     LPCTSTR lpszDriverName, //设备驱动的名称
     LPCTSTR lpszDeviceName, //设备的名称
     LPCTSTR lpszOutput, //电脑与设备连接的接口名称
     const void* lpInitData //设备的参数
     );

     CWindowDC-封装了整个窗口的DC,包括标题、边框和客户区。
     CClientDC-封装了窗口的客户区DC
     CPaintDC-封装了窗口的客户区DC,只能用在WM_PAINT消息处理
              函数中。
     CMetaFileDC-封装了Windows图元文件的处理。
     CGdiObject-绘图对象类
     CPen-画笔

     CBrush-画刷

     CFont-字体

     CBitmap-位图

     CPalette-调色板
     为什么使用调色板?
     调色板使用步骤:
     1 创建调色板
       1.1 结构
typedef struct tagLOGPALETTE {
    WORD         palVersion; //系统版本号,0x300
    WORD         palNumEntries;//颜色的数量
    PALETTEENTRY palPalEntry[1];//颜色表数组
} LOGPALETTE;
       typedef struct tagPALETTEENTRY { // pe
    BYTE peRed;
    BYTE peGreen;
    BYTE peBlue;
    BYTE peFlags;
} PALETTEENTRY;
 
       CPalette::CreatePalette
     2 将调色板选到当前dc
       CDC::SelectPalette
     3 加载调色板
       CDC::RealizePalette  
     4 使用调色板(使用的是准备好的颜色)
        PALETTEINDEX
     5 选出调色板
        CDC::SelectPalette
 
     CRgn-区域(构造一个不规则的区域)
     1 作用:基于基本的几何图形,构建复杂的几何图形
     2 使用
       1 使用一系列的CreateXXX函数创建基本的图形
       2 使用CombineRgn将两个图形进行几何运算
       3 绘制/填充几何图形
         CDC::FillRgn-填充
         CDC::FrameRgn-填充边框
       4 可以使用CRgn创建不规则窗体
         CWnd::SetWindowRgn   
   2 MFC绘图的实现

posted @ 2012-12-18 13:35  中国男孩  阅读(300)  评论(0编辑  收藏  举报