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);
}
本文详细介绍了如何使用MFC和GDI在Windows应用中响应鼠标事件进行图形绘制,包括画线和画曲线的方法,以及如何在不同情况下选择合适的绘图设备和画刷来实现更丰富的绘图效果。
507

被折叠的 条评论
为什么被折叠?



