一、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");
}

  运行结果:

  9.MFC绘图

   (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);
}
View Code

相关文章:

  • 2021-06-07
  • 2021-09-26
  • 2021-10-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-21
  • 2022-02-10
猜你喜欢
  • 2021-09-26
  • 2021-07-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-04
相关资源
相似解决方案