VC++深入详解(chapter 4)

来源:互联网 发布:sql替换语句 编辑:程序博客网 时间:2024/06/04 18:49
 Part 1 画图

void CChapter4View::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default


 m_oriPoint = point;

 
 CView::OnLButtonDown(nFlags, point);
}

void CChapter4View::OnLButtonUp(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 /*
 //一 利用SDK全局函数实现画线功能,
 // 1 首先获得窗口的设备描述表
 HDC hdc;
 hdc = ::GetDC(m_hWnd);
 // 2 移动到线条的起点
 MoveToEx(hdc,m_oriPoint.x,m_oriPoint.y,NULL);
    // 3 画线
 LineTo(hdc,point.x,point.y);
    // 4 释放设备描述表
 ::ReleaseDC(m_hWnd,hdc);
 // notice 注意全局函数的使用方法
 */
 /*
 // 二 利用MFC的CDC类实现画线的功能
 // 1 获得设备描述表
 CDC *pDc = GetDC();
    // 2 移动到线条的起点
 pDc->MoveTo(m_oriPoint);
    // 3 画线
 pDc->LineTo(point);
 // 4 释放设备描述表
 ReleaseDC(pDc);
 */
 /*
 // 三 利用MFC的CClientDc类实现画线的功能
 CClientDC dc(this);
 dc.MoveTo(m_oriPoint);
 dc.LineTo(point);
     // 思考为什么没有用到 GetDc和ReleaseDc 思考这两个函数的作用
 //  然后再思考这些东西起作用的时候,与类的构造函数和析构函数的关系
 */

 /*
 // 如何得到父窗口的指针
 CClientDC Dc(GetParent());

 Dc.MoveTo(m_oriPoint);

 Dc.LineTo(point);
 */
 /*
 // 四 利用MFC中的CWindowDC类实现画线功能
 CWindowDC dc(this);
 dc.MoveTo(m_oriPoint);
 dc.LineTo(point);
 */
 //  在桌面窗口中画线 注意是如何获取桌面窗口的句柄
 /*
 CWindowDC dc(GetDesktopWindow());

 dc.MoveTo(m_oriPoint);

 dc.LineTo(point);
 */
 /*
 在才程序中,当构造一个GDI对象后,该对象并不会立即生效,必须选入设备描述表,他才能在以后的绘制中生效

 CPen pen(PS_SOLID,10,RGB(255,0,0));

 CClientDC dc(this);
    SelectObject()函数可以将GDI对象入选到设备描述表中,并且该函数会返回指向先前被选对象的指针,
 这主要是为了在完成绘制操作之后,还原设备表
 CPen *pOldPen = dc.SelectObject(&pen);

 dc.MoveTo(m_oriPoint);

 dc.LineTo(point);

    dc.SelectObject(pOldPen);
 */
 /*
 //  简单画刷
 1 创建一个画刷
 CBrush brush(RGB(255,0,0));
    2 创建一个DC
 CClientDC dc(this);
    3 将创建的画刷选入到设备描述表中
 dc.SelectObject(&brush);
    4 利用画刷画出正方形
 dc.FillRect(CRect(m_oriPoint,point),&brush);

 //  位图画刷
 1 创建一个位图对象
 CBitmap bitmap;
 2 加载位图资源(前提是此资源必须存在)
 bitmap.LoadBitmap(IDB_BITMAP1);
 3 创建一个位图画刷
 CBrush brush(&bitmap);
 4 创建一个DC
 CClientDC dc(this);
 5 将创建之后的位图画刷选入到设备描述表中
 dc.SelectObject(&brush);
 6 画图
 dc.FillRect(CRect(m_oriPoint,point),&brush);
    */
    // 透明画刷
 /* 1 创建一个DC
 CClientDC dc(this);
       2 创建一个透明画刷
 CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
       3 将透明画刷选到设备描述表中
 CBrush *pOldBrush = dc.SelectObject(pBrush);
       4 画正方形
 dc.Rectangle(CRect(m_oriPoint,point));
       5 还原设备描述表中先前的画刷
 dc.SelectObject(pOldBrush);
 */
 CView::OnLButtonUp(nFlags, point);
}

Part 2 画曲线

主要思想是响应鼠标移动函数 WM_MOUSEMOVE

注意其中的设计思想 

设计一个标记

void CChapter4View::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 m_oriPoint = point;


 m_bDraw = TRUE;
 
 CView::OnLButtonDown(nFlags, point);
}

void CChapter4View::OnLButtonUp(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default

    m_bDraw = FALSE;


 CView::OnLButtonUp(nFlags, point);
}

void CChapter4View::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 CClientDC dc(this);

   //dc.SetROP2(R2_BLACK);
    //根据nDrawMode设置的方式重新设定绘图的方式
 CPen pen(PS_SOLID,2,RGB(255,0,0));
 

 CPen *pOldpen = dc.SelectObject(&pen);

 if (TRUE == m_bDraw)
 {
  dc.MoveTo(m_oriPoint);

  dc.LineTo(point);

  m_oriPoint = point;
 }

 dc.SelectObject(pOldpen);
 
 CView::OnMouseMove(nFlags, point);
}

 

原创粉丝点击