原理
使用响应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);
}