一、MFC绘图
1.相关问题
WIN32 - HDC
MFC - CDC类对象
2.相关类
(1)CDC类 - 父类CObject,封装了关于绘图的各种API函数,还封装了成员变量m_hDC(保存绘图设备句柄)
(2)CDC类的子类
CClientDC - 封装了在客户区中绘图的绘图设备,::GetDC
CWindowDC - 封装了在整个窗口中绘图的绘图设备,::GetWindowDC
CPaintDC - 封装了在WM_PAINT消息中绘图的绘图设备,::BeginPaint
相关代码:在视图中处理菜单消息,绘图
void CT23_MFCCDCView::OnClient() { CClientDC dc(this); dc.TextOutW(0, 0, L"MFCCDCView::OnClient");//里面其实调的WIN32函数 //WIN32实现 //::TextOut(dc.m_hDC, 100, 100, L"MFCCDCView::OnClient", strlen("MFCCDCView::OnClient")); } void CT23_MFCCDCView::OnWindow() { CWindowDC dc(AfxGetApp()->m_pMainWnd); dc.TextOutW(10, 330, L"MFCCDCView::OnWindow");//里面其实调的WIN32函数 //WIN32实现 //::TextOut(dc.m_hDC, 0, 330, L"MFCCDCView::OnClient", strlen("MFCCDCView::OnClient")); } void CT23_MFCCDCView::OnPaint() { CPaintDC dc(this); dc.TextOutW(0, 0, L"MFCCDCView::OnPaint"); }
运行结果:
(3)CGDIObjecct - 父类CObject,封装了了成员变量m_hObject(保存了相应GDI绘图对象句柄)
(4)CGDIObject的子类
CPen - 封装了画笔的使用
CBrush - 封装画刷的使用
CFont - 封装了字体的使用
CBitmap - 封装了位图的使用
CRgn - 封装了关于复合(不规则)图形的绘制
a.将简单基本图像通过运算,构建一个复杂的集合运算
b.使用
利用一些列CRgn::CreateXXX,创建基本图形
利用CRgn::CombineRgn将基本图形通过指明的运算进行组合
填充复合图形
相关代码:在视图中处理菜单消息,绘图
void CT24_MFCGDIView::OnBmp() { CClientDC dc(this); CBitmap bmp; bmp.LoadBitmapW(IDB_BITMAP1); //CDC memdc; //memdc.CreateCompatibleDC(&dc); //CBitmap *oldBmp = memdc.SelectObject(&bmp); //dc.BitBlt(100, 100, 48, 48, &memdc, 0, 0, SRCCOPY); //memdc.SelectObject(oldBmp); //bmp.DeleteObject(); //memdc.DeleteDC(); //WIN32实现 HDC memdc = ::CreateCompatibleDC(dc.m_hDC); HGDIOBJ oldBmp = ::SelectObject(memdc, bmp.m_hObject); ::BitBlt(dc.m_hDC, 100, 100, 48, 48, memdc, 0, 0, SRCCOPY); ::SelectObject(memdc, oldBmp); ::DeleteObject(bmp.m_hObject); ::DeleteObject(memdc); } void CT24_MFCGDIView::OnBrush() { CClientDC dc(this); //CBrush brush( RGB(0, 255, 0) ); //实心画刷 CBrush brush(HS_CROSS, RGB(0, 255, 0)); //虚线画刷 CBrush *oldBrush = dc.SelectObject(&brush); dc.Rectangle(50, 50, 250, 250); dc.SelectObject(oldBrush); brush.DeleteObject(); //WIN32实现 //HGDIOBJ hOldBrush = ::SelectObject(dc.m_hDC, brush.m_hObject); //Rectangle(dc.m_hDC, 100, 100, 300, 300); //::SelectObject(dc.m_hDC, hOldBrush); //brush.DeleteObject(); } void CT24_MFCGDIView::OnFont() { CClientDC dc(this); CFont font; font.CreatePointFont(300, L"黑体"); CFont *oldFont = dc.SelectObject(&font); dc.TextOutW(100, 100, L"用黑体字体画"); dc.SelectObject(oldFont); font.DeleteObject(); } void CT24_MFCGDIView::OnPen() { CClientDC dc( this ); CPen pen( PS_SOLID, 10, RGB(255,0,0) ); CPen *oldPen = dc.SelectObject(&pen); dc.Rectangle(50, 50, 250, 250); dc.SelectObject(oldPen); pen.DeleteObject(); //WIN32实现 //HGDIOBJ hOldPen = ::SelectObject(dc.m_hDC, pen.m_hObject); //Rectangle(dc.m_hDC, 100, 100, 300, 300); //::SelectObject(dc.m_hDC, hOldPen); //::DeleteObject(pen.m_hObject); } void CT24_MFCGDIView::OnRgn() { CRgn rgn1; rgn1.CreateEllipticRgn(50, 50, 250, 250); CRgn rgn2; rgn2.CreateEllipticRgn(150, 150, 350, 350); //rgn1.CombineRgn(&rgn1, &rgn2, RGN_AND); //rgn1此时代表复合图形 //rgn1.CombineRgn(&rgn1, &rgn2, RGN_OR); rgn1.CombineRgn(&rgn1, &rgn2, RGN_XOR); CBrush brush(RGB(0,255,0)); CClientDC dc(this); dc.FillRgn(&rgn1, &brush); }