VC++实现绘图操作,说白了也就是对API熟练操作了,下面介绍几种绘图
1. 绘制线条
具体实现代码如下:
// 鼠标左键按下时的处理函数 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 originP=point; CEditView::OnLButtonDown(nFlags, point); } // 鼠标左键弹起时的处理函数,Point为弹起时鼠标的点坐标 void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //#pragma region 1.利用SDK全局函数实现画线功能 //// 首先获得窗口的设备描述表 //HDC hdc; //hdc=::GetDC(m_hWnd); //// 移动到线条的起点 //MoveToEx(hdc,originP.x,originP.y,NULL); //// 画线 //LineTo(hdc,point.x,point.y); //// 释放设备描述表 //::ReleaseDC(m_hWnd,hdc); //#pragma endregion //#pragma region 2. 利用MFC的CDC类实现画线功能 //CDC* mfcDC=GetDC(); //mfcDC->MoveTo(originP); //mfcDC->LineTo(point); //ReleaseDC(mfcDC); //#pragma endregion //#pragma region 3. 利用MFC的CClientDC类实现画线功能 //CClientDC dc(this); //dc.MoveTo(originP); //dc.LineTo(point); //#pragma endregion //#pragma region 4. 利用MFC的CWindowDC类实现画线功能 //CWindowDC wdc(this); //wdc.MoveTo(originP); //wdc.LineTo(point); //#pragma endregion #pragma region 5. 在桌面窗口中绘制彩色线 // 指定画笔GDI对象 CPen pen(PS_SOLID,1,RGB(255,0,0)); // 获得桌面设备描述符 CWindowDC wdc(GetDesktopWindow()); // 使用SelectObject函数来实现把GDI对象选入设备描述表中 // SelectObject函数返回指向先前被选对象的指针 CPen* pOldPen =wdc.SelectObject(&pen); wdc.MoveTo(originP); wdc.LineTo(point); // 把先前的GDI对象选入设备描述表,以便恢复到先前的状态 wdc.SelectObject(pOldPen); #pragma endregion CEditView::OnLButtonUp(nFlags, point); }
2. 使用画刷绘制一块区域
实现代码:
// CDrawRegionView 消息处理程序 // 鼠标左键按下消息处理函数 void CDrawRegionView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 originPoint=point; CTreeView::OnLButtonDown(nFlags, point); } // 鼠标左键弹起消息处理函数 void CDrawRegionView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 #pragma region 1. 简单画刷 //// 创建一个红色画刷 //CBrush brush(RGB(255,0,0)); //// 创建并获得设备描述表 //CClientDC dc(this); //// 利用红色画刷填充鼠标拖拽过程中形成的矩形区域 //dc.FillRect(CRect(originPoint,point),&brush); #pragma endregion #pragma region 2. 位图画刷 // 创建位图对象 CBitmap bitmap; // 加载位图资源 bitmap.LoadBitmapW(IDB_BITMAP1); // 创建位图画刷 CBrush bitmapBrush(&bitmap); // 创建并获得设备描述表 CClientDC dc2(this); // 利用位图画刷填充鼠标拖拽过程中形成的矩形区域 dc2.FillRect(CRect(originPoint,point),&bitmapBrush); #pragma endregion #pragma region 3. 透明画刷 // 创建并获得设备描述表 CClientDC dc3(this); // 创建一个空画刷 CBrush *pBrush =CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); // 将空画刷选入设备描述表中 CBrush *oldBrush =dc3.SelectObject(pBrush); // 绘制一个矩形 dc3.Rectangle(CRect(originPoint,point)); // 恢复先前的画刷 dc3.SelectObject(oldBrush); #pragma endregion CTreeView::OnLButtonUp(nFlags, point); }
3. 绘制连续的线条
实现代码:
void CDrawContinuousLineView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 originPt =point; isBeginDraw=true; CEditView::OnLButtonDown(nFlags, point); } void CDrawContinuousLineView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 isBeginDraw=false; CEditView::OnLButtonUp(nFlags, point); } // 鼠标移动消息的处理函数 void CDrawContinuousLineView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CClientDC dc(this); // 创建一个红色,宽度为1的实现画笔 CPen pen(PS_SOLID,1,RGB(255,0,0)); // 把创建的画笔选入设备描述表中 CPen* oldPen =dc.SelectObject(&pen); if(isBeginDraw==true) { dc.MoveTo(originPt); dc.LineTo(point); // 修改线段的起点 originPt=point; } // 恢复设备描述表 dc.SelectObject(oldPen); CEditView::OnMouseMove(nFlags, point); }
完整的实现源码下载:C++实现绘图