在VC++中如何通过消息映射机制,用Win32 SDK,CDC类,CClientDC类,CWindowDC类实现绘图操作
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call default
//MessageBox("MainFrame Clicked!");
m_bDraw = TRUE;
m_ptOrigin = point;
m_ptOld = point;
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
//1.利用SDK全局函数实现画线功能
/*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);*/
//2.利用MFC的CDC类实现画线功能
/*CDC* pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);*/
//3.利用MFC的CClientDC类实现画线功能
/*CClientDC dc(this); //用this只能在客户区画线
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
//4.利用MFC的CWindowDC类实现画线功能
/*CWindowDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
//5.在桌面窗口中画线
/*CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
//6.绘制彩色线条
/*CPen pen(PS_DOT,1,RGB(255,0,0));
CClientDC dc(this);
CPen* pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);*/
//7.使用画刷绘图(简单画刷)
/*CBrush brush(RGB(255,0,0)); //创建一个红色画刷
CClientDC dc(this); //创建并获得设备描述表
dc.FillRect(CRect(m_ptOrigin,point),&brush);*/ //利用红色画刷填充鼠标拖拽过程中形成的矩形区域
//8.位图画刷
/*CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
CBrush brush(&bitmap);
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);*/
//9.透明画刷
/*CClientDC dc(this); //创建并获得设备描述表
//dc.Rectangle(CRect(m_ptOrigin,point)); //设备描述表中有一个默认的白色画刷
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //创建一个空画刷,把画刷句柄转换为画刷对象
CBrush *pOldBrush = dc.SelectObject(pBrush); //将空画刷选入设备描述表
dc.Rectangle(CRect(m_ptOrigin,point)); //绘制一个矩形
dc.SelectObject(pOldBrush); //恢复先前的画刷?*/
//CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));这种调用方式之所以可行是因为GetStockObject()是一个静态函数。
m_bDraw = FALSE;
CView::OnLButtonUp(nFlags, point);
}
//10.绘制连续线条
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this);
// dc.SetROP2(/*R2_MERGENOTPEN*/ R2_BLACK); //设置绘图模式的函数
CPen pen(PS_SOLID,1,RGB(255,0,0)); //创建一个红色的,宽度为1的实线画笔
CPen *pOldPen = dc.SelectObject(&pen); //把创建的画笔选入设备描述表
if(TRUE==m_bDraw)
{
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.LineTo(m_ptOld);//用来绘制带边线的扇形
//m_ptOrigin = point;// 修改线段的起点,没有这行代码时就可以绘制扇形了
m_ptOld = point;//用来绘制带边线的扇形
}
dc.SelectObject(pOldPen); //恢复设备描述表
//懂了:当我们使用默认的画笔,画刷时,不需要用dc.SelectObject(&pen)把创建的画刷画笔选入设备描述表
//而只有在我们不使用默认的,而是自己创建了一个的时候才要调用dc.SelectObject(&pen)把创建的画刷画笔选入设备描述表,
//而在用过以后,要把原来的画刷画笔选回原来的,恢复设备描述表。
CView::OnMouseMove(nFlags, point);
}