MFC经典绘图方法总结

2024-07-23

MFC经典绘图方法总结(通用2篇)

篇1:MFC经典绘图方法总结

MFC经典绘图方法总结

Windows 绘图的实质就是利用 windows提供的图形设备接口GDI(Graphics Device Interface)将图形会制在显示器上。

为了支持GDI绘图,MFC提供了两种重要的类:

设备上下文DC(Device Context)类,用于设置绘图属性和绘制图形;

绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。

CDC类介绍: 在MFC中,CDC是设备上下文类的基类,派生类包括:CClientDC, CPaintDC, CWindowDC, CMetaFileDC类

CClientDC 客户区设备上下文,绘制客户区时

CPaintDC 一般发生在窗口需要重绘时

CWindwDC 可以绘制整个窗口,通常在窗口WM_NCPAINT消息的响应函数CWnd::OnNCPaint()中使用

CMetaFileDC 专门用于图元文件的绘制,图元文件记录一组GDI命令,重建图形输出。

CDC包含m_hDC和 m_hAttribDC二个设备上下文。CDC指导所有对m_hDC的输出GDI调用(SetTextColor)以及对m_hAttribDC的大部分属性GDI调用(GetTextColor)。

CDC对象的重要函数如下:

1、为指定设备创建上下文 virtual BOOL CreateDC(...)比如创建一个为屏幕的设备上下文

CDC dc;

dc.CreateDC(“DISPLAY”, NULL, NULL,NULL);

2、创建内存设备上下文,与指定设备上下文兼容 virtual BOOL CreateCompatibleDC(CDC * pDC)

3、删除CDC对象对应的Windows设备上下文, 通常不调用该函数而是使用析构程序 virtual BOOL DeleteDC();

4、将HDC句柄转化为设备上下文的句柄: CDC *pDC=CDC::FromHandle(hDC)

5、选择GDI对象入选到设备上下文中,一共有五种形式:

CPen * SelectObject(CPen * pPen);

CBrush * SelectObject(CBrush * pBrush);

virtual CFont * SelectObject(CFont * pFont);

CBitmap * SelectObject(CBitmap * pBitmap);

int SelectObject(CRgn * pRgn);

例: Cpen cpen;pen.CreatePen(PS_SOLID, 2, RGB(255,0,0));Cpen *pOldPen=(CPen*)pDC->SelectObject(&pen);//设置新画笔,记录旧画笔

....pDC->SelectObject(pOldPen);//还原

画笔

三种方法创建画笔

1/构造函数:

CPen();

CPen(int nPenStyle, int nWidth, COLORREF crColor);

CPen(...)略

2/CreatePen(int nPenStyle, int nWidth, COLORREF crColor)

3/CreatePenIndirect(LPLOGPEN lpLogpen)

typedef struct tagLOGPEN{

UINT lopnStyle;

POINT lopnWidth;

COLORREF lopnColor;

}LOGPEN, *LPLOGPEN;

例:

LOGPEN lppn;

lppn.lopnColor=RGB(255,0,0);

lppn.lopnStype=PS_DASHDOT;

lgpn.lopnWidth.x=2;

lgpn.lopnWidth.y=2;

CPen pen;pen.CreatePenIndirect(&lppn);

画刷

三种方法创建

1/构造函数:

CBrush();

CBrush(COLROREF crColor);

CBrush(int nIndex, COLORREF crColor);

nIndex 哪种类型的网格, HS_BDIAGONAL HS_CROSS

HS_VERTICAL

HS_HORIZONTAL

2/CreateSolidBrush(COLORREF crColor);

3/CreateHatchBrush(int nIndex , COLORREF crColor);

4/CreateBrushIndirect(const LOGBRUSH* lpLogBrush);

typedef struct tagBRUSH{

UINT lbStyle;

// BS_HATCHED, BS_SOLID , BS_NULL

COLORREF lopnColor;

LONG lbHatch;

//HS_BDIAGONAL HS_VERTICAL

HS_HORIZONTAL

}LOGBRUSH, *LPLOGBURSH;

例:

CRect Rect(0,0,200,200);

CBrush brush(HS_HORIZONTAL,RGB(0,255,0));

CBrush *pOldBursh=pDC->SelectObject(&brush);

pDC->Rectangle(Rect);

pDC->SelectObject(pOldBursh);图形绘制

1.点绘制

//返回RGB值

COLORREF SetPixel(int x, int y, COLORREF crColor);

COLORREF SetPixel(POINT point, COLORREF crColor);

//返回BOOL值,绘制是否成功.BOOL SetPixelV(int x, int y, COLORREF crColor);

BOOL SetPixelV(POINT point, COLORREF crColor);2.直线绘制

//返回CPoint对象的x和y坐标的前一次取值

CPoint MoveTo(int x, int y);

CPoint MoveTo(POINT point);

//返回绘制是否成功

BOOL MoveTo(int x, int y);

BOOL MoveTo(POINT point);

例:

CPen pen;pen.CreatePen(PS_SOLID,2,RGB(0,255,0));

HS_CROSS

CPen* oldPen =(CPen *)pDC->SelectObject(&pen);

CPoint oldPoint=pDC->MoveTo(600,300);

pDC->LineTo(500,500);

3.矩形绘制

1/矩形绘制

BOOL Rectangle(int x1, int y1, int x2, int y2);

BOOL Rectangle(LPRECT lpRect);

例:

pDC->SelectObject(oldPen);

pDC->Rectangle(0,0,600,300);

CRect Rect(0,0,300,200);

CBrush brush(HS_HORIZONTAL,RGB(0,255,0));

CBrush *pOldBursh=pDC->SelectObject(&brush);

pDC->Rectangle(&Rect);

pDC->SelectObject(pOldBursh);

例:

CPen pen;

pen.CreatePen(PS_DASH, 1,RGB(255,0,0));

LOGBRUSH lb;

memset(&lb,0, sizeof(lb));

lb.lbStyle=BS_HATCHED;

lb.lbHatch=HS_DIAGCROSS;

CBrush brush;

brush.CreateBrushIndirect(&lb);

CPen *pOldPen=(CPen *)pDC->SelectObject(& pen);

CBrush *pOldBrush=(CBrush*)pDC->SelectObject(&brush);

pDC->Rectangle(0,0,200,200);

pDC->SelectObject(pOldPen);

pDC->SelectObject(pOldBrush);

2/三维矩形线框绘制

void Draw3dRect(int x, int y, int cx, int cy , COLORREF clrTopLeft, COLORBEF clrBottomRight);

void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORBEF clrBottomRight);

例:

pDC->Draw3dRect(100, 100, 200, 300, RGB(255,0,0), RGB(0,255,0));

3/表示焦点风格矩形

void DrawFocusRect(LPCRECT lpRect);

例:

CRect rt(400,400, 450, 450);

pDC->DrawFocusRect(&rt);

4/绘制拖曳形线框

void DrawDragRect(LPCRECT lpRect , SIZE size LPCRECT lpRectLast, SIZE sizeLast, CBrush* pBrush=NULL , CBrush* pBrushLast=NULL);

5/圆角矩形

void RoundRect(LPCRECT lpRect , POINT point);

//point.x 椭圆宽, point.y 椭圆高

void RoundRect(int x1, int y1, int x2, int y2,int x3, int y3);

例:

pDC->RoundRect(250, 250, 400, 400, 50, 100);

4.椭圆绘制

BOOL Ellipse(LPCRECT lpRect)//椭圆的外接矩形范围

文字绘制

TextOut函数

返回值是BOOL

BOOL TextOut(int x, int y, const CString & str);

virtual BOOL TextOut(int x, int y, LPCSTR lpszString, int nCount);

DrawText函数 返回值是文本高度

int DrawText(LPCSTR lpszString, int nCount, LPRECT lpRect, UNIT nFormat);

int DrawText(const CString& str, LPRECT lpRect, UNIT nFormat);

//DT_BOTTOM DT_LEFT...//注意:如果nFormat 参数指定了DT_CALCRECT标志,由lpRect指定的矩形将会更新,以反映显示文本需要的高度和宽度,但并不绘制显示

文字背景色和前景色

virtual COLORREF SetBKColor(COLORREF crColor);int SetBKMode(int nBKMode);// nBKMode: OPAQUE, TRANSPARENT时,SetBKColor失效

例:

CRect rect;GetClientRect(&rect);pDC->FillSolidRect(rect,RGB(0,0,255));CString strText=L“VC++ BKColor Demo...”;pDC->SetTextColor(RGB(255,255,255));pDC->SetBkColor(RGB(255,0,0));pDC->SetBkMode(TRANSPARENT);pDC->TextOut(10,10,strText);文字字体

设置文字的字体会使用到MFC下的CFont类,然后调用CFont类下的四个成员函数: CreateFont, CreateFontIndirect, CreatePointFont和 CreatePointFontIndirect,详见msdn帮助 例: 1/CreateFont 函数 CFont font;font.CreateFont(25, 0, 1800, 0, FW_BOLD, 1, 1, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH|FF_MODERN, L“Courier New”);CString strText=L“VC++ Font Demo...”;pDC->SetTextColor(RGB(255,0,0));CFont *pOldFont=(CFont*)pDC->SelectObject(&font);pDC->TextOut(210,210, strText);pDC->SelectObject(pOldFont);2/ CreateFontIndirect(const LOGFONT* lpLogFont);typedef struct tagLOGFONT{ //14个成员变量与世隔绝 CreateFont函数类似 }LOGFONT;3/如果只注重字体的高度和字体名时,使用CreatePointFont(int nPointSize, LPCSTR lpszFaceName, CDC* pDC=NULL);

位图显示

A:位图介绍,CBitmap类封装了Windows图形设备接口中的位图,并提供了操作位图的成员函数

1/创建兼容位图,使之与指定设备兼容.BOOL CreateCompatibleBitmap(CDC *pDC, int nWidth, int nHeight);

2/得到位图信息,作用是填充BITMAP结构.int GetBitmap(BITMAP * pBitMap);

3/加载位图资源,加载一个命名的位图资源来初始化位图对象.BOOL LoadBitmap(LPCSTR lpszResourceName);BOOL LoadBitmap(UINT nIDResuource);

B:显示位图,VC++提供 BitBlt, StretchBlt和 TransparentBit(需加入 msimg32.lib库)1/ BOOL BitBlt(int x , int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop);//尺寸不变

2/ BOOL StretchBlt(int x, int y, int nWidth, int nHeight, CDC* pSrcDC,int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop);//支持缩放

/* dwRop一般设置为SRCCOPY */ 3/ BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,HDC hdcSrc, int nXoriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);例:

CBitmap bitmap;bitmap.LoadBitmap(IDB_BITAMBOW);

BITMAP bm;bitmap.GetBitmap(&bm);

CDC MemDC;MemDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap=(CBitmap *)MemDC.SelectObject(&bitmap);

CRect rect(10,10, bm.bmWidth, bm.bmHeight);

TransparentBlt(pDC->GetSafeHdc(), rect.left, rect.top, rect.Width()*5, rect.Height()*5, MemDC.GetSafeHdc(), 0, 0, bm.bmWidth, bm.bmHeight, RGB(0,0,0));//长宽扩大5倍,图片中黑色的部分将作为透明处理

篇2:MFC经典绘图方法总结

pDC->LineTo(100,100)// 从起点(0,0)到终点(100,100)画一条直线、矩形: Crect rect(0,0,100,100);

pDC->Rectangle(&rect);// 画一个长 100,宽 100 的矩形、圆和椭圆:

Crect rect(0,0,100,100);

pDC->Ellipse(&rect);

Crect rect(0,0,50,100);

pDC->Ellipse(&rect);、多边形:

CPoint poly[4];

poly[0]=CPoint(0,0);

poly[1]=CPoint(50,50);

poly[2]=Cpoint(50,100);

poly[3]=Cpoint(0,50);

pDC->Polygon(poly,4);

(二)库存对象

库存对象是由操作系统维护的用于绘制屏幕的常用对象,包括库存画笔、画刷、字体等。使用 SelectStockObject()函数可以直接选择库存对象,修改系统默认值。

例如,在视图中选用画笔和画刷库存对象来画图。

Void Cexam3_3View::OnDraw(CDC*pDC)

{

Cexam3_2Doc*pDoc=GetDocument();

CRect rect;

Rect.SetRect(Cpoint(0,0),Cpoint(200,200));

pDC->SelectStockObject(WHITE_PEN);// 选用白色画笔

pDC->SelectStockObject(GRAY_BRUSH);// 选用灰色画刷

pDC->Rectangle(rect);

pDC->MoveTo(0,0);

pDC->LineTo(200,200);

pDC->MoveTo(0,200);

pDC->LineTo(200,0);

}

(三)创建和使用自定义画刷和画笔、创建 CPen 的的方法:

•定义时直接创建

Cpen MyPen(PS_SOLID,2,RGB(255,0,0));

(2)定义 Cpen 对象,再调用 CreatePen()函数

Cpen pen;

Pen.CreatePen(PS_SOLID,2,RGB(255,0,0));、创建画刷的方法:

(1)创建实心画刷的 CreateSolidBrush()函数

Cbrush bs;

Bs.CreateSolidBrush(RGB(255,0,0));

(2)创建带阴影的画刷的 CreateHatchBrush()函数

Bs.CreateHatchBrush(HS_CROSS,RGB(255,0,0));// 创建一个带十字阴影的红色画刷

(3)创建位图画刷的 CreatePatternBrush()函数

本函数的应用如下:

CbitMap bmp;

Bmp.LoadBitMap(IDB_MYBITMAP);

Cbrush bs;

Bs.CreatePatternBrush(&bmp);

例4_

3、在视图中绘制三个图形,一个用阴影风格的画刷画的椭圆形,一个用深兰色实心画刷画的圆角矩形,一个用浅灰色画刷画的饼形。

void CExam4_3View::OnDraw(CDC* pDC)

{

CExam4_3Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

//设置影象模式

pDC->SetMapMode(MM_ANISOTROPIC);

CPen NewPen,OldPen;

//将画笔选入设备上下文

NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255));

//创建深蓝色实心画刷

pDC->SelectObject(&NewPen);

CBrush NewBrush1,NewBrush2;

//将画刷选入设备上下文

NewBrush1.CreateSolidBrush(RGB(0,0,128));

//绘制圆角矩形

pDC->RoundRect(200,100,330,200,15,15);

//将库存对象浅灰画刷选入设备上下文

pDC->SelectStockObject(LTGRAY_BRUSH);

//绘制饼图

pDC->Pie(350,50,420,150,360,50,400,50);

//创建阴影画刷

NewBrush2.CreateHatchBrush(HS_DIAGCROSS,RGB(125,125,125));

pDC->SelectObject(NewBrush2);

//绘制椭圆

pDC->Ellipse(50,50,150,150);

上一篇:2023年司法考试三国法复习方法下一篇:教学之初体验-新教师教学感受实录