第四章 简单绘图

原理

使用响应OnLButtonDown函数和OnLButtonUp函数实现的
OnLButtonDown函数如下:

void CDraw2View::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    m_ptOrigin = point;
    CView::OnLButtonDown(nFlags, point);
}

方式

1 利用SDK全局函数

void CDraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    //为了进行绘图操作,先定义一个HDC类型变量hdc
    HDC hdc;
    //保存窗口
    hdc  = ::GetDC(m_hWnd);
    //画线操作
    //第一个参数是设备描述表的句柄
    //第二个和第三个是起点坐标
    MoveToEx(hdc, m_ptOrigin.x,m_ptOrigin.y,NULL);
    LineTo(hdc,point.x,point.y);
    //绘图结束后,释放设备描述表的资源
    ::ReleaseDC(m_hWnd,hdc);

    CView::OnLButtonUp(nFlags, point);
}

2 利用MFC的CDC类实现画线功能

void CDraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
    //得到对象
    CDC* pDc = GetDC();
    pDc->MoveTo(m_ptOrigin);
    pDc->LineTo(point);
    ReleaseDC(pDc);

    CView::OnLButtonUp(nFlags, point);
}

3 利用MFC的CClientDC类实现画线

void CDraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
    CClientDC dc(this);
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);

    CView::OnLButtonUp(nFlags, point);
}

4 利用MFC的CWindowDC类实现画线功能

void CDraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
    CWindowDC dc(this);
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);

    CView::OnLButtonUp(nFlags, point);
}

5 在桌面窗口画线

void CDraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
    //改变参数
    CWindowDC dc(GetDesktopWindow());
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);

    CView::OnLButtonUp(nFlags, point);
}

画线条基本是三步,创建设备描述表资源或者声明对象,确定起点,确定终点

6 绘制彩色线条

void CDraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
    //参数10代表画线宽度
    //第三个参数代表颜色
    CPen pen(PS_SOLID,10,RGB(255,0,0));
    CClientDC dc(this);
    CPen *pOldPen = dc.SelectObject(&pen);
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);   
    dc.SelectObject(pOldPen);

    CView::OnLButtonUp(nFlags, point);
}

7 使用笔刷绘图

简单的画刷

void CDraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
    CBrush brush(RGB(255,0,0));
    CClientDC dc(this);
    dc.FillRect(CRect(m_ptOrigin,point),&brush);

    CView::OnLButtonUp(nFlags, point);
}

位图画刷

void CDraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
    //创建位图对象
    CBitmap bitmap;
    //加载位图资源
    bitmap.LoadBitmap(IDB_BITMAP1);
    //创建位图画刷
    CBrush brush(&bitmap);
    //创建并获得设备描述表
    CClientDC dc(this);
    dc.FillRect(CRect(m_ptOrigin,point),&brush);

    CView::OnLButtonUp(nFlags, point);
}

绘制连续线条


//添加变量
private:
    BOOL m_bDraw;
//构造函数时初始化
m_bDraw = false;
//在OnLButtonDown中
m_bDraw = true;
//在OnLButtonUp中
m_bDraw = false;

//重点是添加事件OnMouseMove,这样,就会绘出鼠标移动的轨迹了,即线条

    CClientDC dc(this);
    //CPen pen(PS_SOLID,1,RGB(255,0,0));
    //CPen *pOldPen=dc.SelectObject(&pen);

    if(m_bDraw==TRUE)
    {
        //dc.SetROP2(R2_BLACK);
        dc.MoveTo(m_ptOrigin);
        dc.LineTo(point);
        m_ptOrigin=point;
    }

绘制扇形图案

//在OnLButtonDown中添加
m_ptOld = point;


void CDraw2View::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    /*CClientDC dc(this);
    if (m_bDraw == TRUE)
    {
        dc.MoveTo(m_ptOrigin);
        dc.LineTo(point);
        m_ptOrigin=point;
    }*/


    CClientDC dc(this);
    CPen pen(PS_SOLID,1,RGB(255,0,0));
    CPen *pOldPen = dc.SelectObject(&pen);
    if (m_bDraw == TRUE)
    {
        dc.MoveTo(m_ptOrigin);
        dc.LineTo(point);
        dc.LineTo(m_ptOld);
        m_ptOld = point;
        /*m_ptOrigin = point;*/
    }
    dc.SelectObject(pOldPen);

    CView::OnMouseMove(nFlags, point);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值