深入浅出话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++实现绘图

posted @   Learning hard  阅读(3180)  评论(0编辑  收藏  举报
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示