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);
}