深入浅出话VC++(3)——VC++实现绘图操作
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++实现绘图
如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击右下角的【店长推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力


分类:
深入浅出话VC++
标签:
GDI VC++ 绘图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构