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