【上位机——MFC】绘图
相关类
CDC类(绘图设备类):封装了各种绘图相关的函数,以及两个非常重要的成员变量m_hDC和m_hAttribDC
CPaintDC类,封装了在WM_PAINT消息中绘图的绘图设备
CClientDC类,封装了在客户区绘图的绘图设备
CGdiObject类(绘图对象类)
封装了各种绘图对象相关的操作,以及一个非常重要的成员变量m_hObject(绘图对象句柄)
CPen类,封装了画笔的操作
CBrush类,封装了画刷的操作
CFont类,封装了字体的操作
CBitmap,封装了位图的操作
代码示例
// MFCDrawView.cpp: CMFCDrawView 类的实现
//#include "pch.h"
#include "framework.h"
// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的
// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS
#include "MFCDraw.h"
#endif#include "MFCDrawDoc.h"
#include "MFCDrawView.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CMFCDrawViewIMPLEMENT_DYNCREATE(CMFCDrawView, CView)BEGIN_MESSAGE_MAP(CMFCDrawView, CView)// 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)ON_WM_PAINT()ON_COMMAND(ID_PEN, &CMFCDrawView::OnPen)ON_COMMAND(ID_BRUSH, &CMFCDrawView::OnBrush)ON_COMMAND(ID_BITMAP, &CMFCDrawView::OnBitmap)ON_COMMAND(ID_FONT, &CMFCDrawView::OnFont)
END_MESSAGE_MAP()// CMFCDrawView 构造/析构CMFCDrawView::CMFCDrawView() noexcept
{// TODO: 在此处添加构造代码}CMFCDrawView::~CMFCDrawView()
{
}BOOL CMFCDrawView::PreCreateWindow(CREATESTRUCT& cs)
{// TODO: 在此处通过修改// CREATESTRUCT cs 来修改窗口类或样式return CView::PreCreateWindow(cs);
}// CMFCDrawView 绘图void CMFCDrawView::OnDraw(CDC* /*pDC*/)
{CMFCDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码
}// CMFCDrawView 打印BOOL CMFCDrawView::OnPreparePrinting(CPrintInfo* pInfo)
{// 默认准备return DoPreparePrinting(pInfo);
}void CMFCDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{// TODO: 添加额外的打印前进行的初始化过程
}void CMFCDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{// TODO: 添加打印后进行的清理过程
}// CMFCDrawView 诊断#ifdef _DEBUG
void CMFCDrawView::AssertValid() const
{CView::AssertValid();
}void CMFCDrawView::Dump(CDumpContext& dc) const
{CView::Dump(dc);
}CMFCDrawDoc* CMFCDrawView::GetDocument() const // 非调试版本是内联的
{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCDrawDoc)));return (CMFCDrawDoc*)m_pDocument;
}
#endif //_DEBUG// CMFCDrawView 消息处理程序void CMFCDrawView::OnPaint()
{CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码// 不为绘图消息调用 CView::OnPaint()//dc.Rectangle(100,100,300,300);}void CMFCDrawView::OnPen()
{// TODO: 在此添加命令处理程序代码CClientDC dc(this);CPen pen(PS_SOLID,2,RGB(255,0,0));CPen* oldPen = dc.SelectObject(&pen);dc.Rectangle(100, 100, 300, 300);dc.SelectObject(oldPen);pen.DeleteObject();}void CMFCDrawView::OnBrush()
{// TODO: 在此添加命令处理程序代码CClientDC dc(this);CBrush brush(RGB(0, 255, 0));CBrush* oldBrush = dc.SelectObject(&brush);dc.Rectangle(100, 100, 300, 300);dc.SelectObject(oldBrush);brush.DeleteObject();}void CMFCDrawView::OnBitmap()
{// TODO: 在此添加命令处理程序代码//添加位图资源(操作资源无需写代码)//创建一个和当前DC相匹配的内存DCCClientDC dc(this);CDC memdc;memdc.CreateCompatibleDC(&dc);//将位图数据送给内存DCCBitmap bmp;bmp.LoadBitmap(IDB_BITMAP1);CBitmap* oldmp = memdc.SelectObject(&bmp);//成像dc.BitBlt(100,100,48,48,&memdc,0,0,SRCCOPY);//将位图数据要回来memdc.SelectObject(oldmp);//销毁位图bmp.DeleteObject();//销毁内存DCmemdc.DeleteDC();}void CMFCDrawView::OnFont()
{// TODO: 在此添加命令处理程序代码CClientDC dc(this);CFont font;font.CreatePointFont(300,_T("黑体"));CFont* oldFont = dc.SelectObject(&font);dc.TextOut(100,100, _T("hello"));dc.SelectObject(oldFont);font.DeleteObject();}