跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

Visual C++ MFC 基础图形绘制实战:点线面与投影

Visual C++ MFC 环境下利用 GDI 接口实现基础图形绘制。通过 MFC AppWizard 创建单文档项目,在 OnDraw 函数中调用 CDC 对象方法。演示了点(SetPixel)、线(MoveTo/LineTo/Polyline)、面(Rectangle/Ellipse)及复杂形状(Polygon)的绘制逻辑。重点讲解了画笔与画刷的资源管理,以及视图坐标中心化的处理方法,为后续三维投影映射奠定基础。

深海蔚蓝发布于 2026/3/23更新于 2026/6/2222 浏览
Visual C++ MFC 基础图形绘制实战:点线面与投影

项目目标

搭建一个基于 MFC 的单文档绘图环境,能够显示基本的几何图形和文字。我们将使用 MFC 封装的 GDI 函数来绘制点、线、矩形、椭圆等元素,模拟行政区域、道路、河流及建筑轮廓,并尝试用叶片数据构建二维投影模型。

环境准备

本教程基于 Visual C++ 6.0 进行开发。虽然版本较老,但其 MFC 框架对于理解 Windows 图形设备接口(GDI)的工作原理依然非常经典。

创建 MFC 项目

启动 VC++ 6.0,新建项目时选择 MFC AppWizard(exe),模板选 Single Document。默认设置即可生成基础框架。编译运行后,你会看到一个标准的窗口框架,接下来我们要在这个框架上'画画'。

绘制点要素

在视图中绘制点,最直接的方法是使用 SetPixel。为了突出显示行政中心,我们可以用循环绘制一组邻近的点形成实心方块。注意,直接操作像素效率较低,但在教学演示中足够直观。

void CExp_01View::DrawPoints(CDC *pDC) {
    // 绘制四个不同颜色的实心方块作为行政中心
    for(int i=0; i<10; ++i) {
        for (int j=0; j<10; ++j) {
            pDC->SetPixel(200+j, 150+i, RGB(255,0,0));     // 红色
            pDC->SetPixel(600+j, 150+i, RGB(0,255,0));     // 绿色
            pDC->SetPixel(350+j, 300+i, RGB(0,0,255));     // 蓝色
            pDC->SetPixel(800+j, 400+i, RGB(,,)); 
        }
    }
}
200
100
100
// 灰色

在 OnDraw 中调用此函数即可看到效果。

绘制线要素

线条是地图的基础。主干道可以用 MoveTo 和 LineTo 连接;支路可以用像素循环模拟虚线;边界则适合用 Polyline 处理折线。绘制河流时,需要创建自定义画笔(HPEN),并在绘制完成后记得恢复旧画笔并删除新对象,防止资源泄漏。

void CExp_01View::DrawLines(CDC *pDC) {
    // 实线主干道
    pDC->MoveTo(50,250); 
    POINT p1; p1.x=700; p1.y=250; 
    pDC->LineTo(p1); 
    
    // 虚线支路
    for(int i=0;i<300;i=i+5) {
        pDC->SetPixel(500,270+i,RGB(255,0,0));
        pDC->SetPixel(520,270+i,RGB(255,0,0));
    }
    
    // 折线边界
    POINT p[10];
    // ... 省略部分坐标定义 ...
    pDC->Polyline(p,10);
    
    // 曲线河流
    HPEN hPen = CreatePen(PS_SOLID, 3, RGB(0,0,255));
    HPEN hOldPen = (HPEN)pDC->SelectObject(hPen);
    POINT n[6];
    // ... 省略贝塞尔控制点 ...
    pDC->PolyBezierTo(n,6);
    pDC->SelectObject(hOldPen);
    DeleteObject(hPen);
}

绘制面要素

填充区域通常涉及矩形、圆角矩形和椭圆。这里的关键是管理好画笔和画刷(Brush)。创建完笔刷后,要将其选入 DC,绘制完毕后再还原,最后释放内存。

void CExp_01View::DrawPolygons(CDC *pDC) {
    // 矩形建筑
    pDC->Rectangle(70,120,140,190);
    pDC->TextOut(70,200,_T("第一实验楼"));
    
    // 圆角操场
    pDC->RoundRect(230,450,450,580,30,30);
    
    // 湖泊(带填充)
    HPEN hPen = CreatePen(PS_SOLID, 3, RGB(0,0,200));
    HBRUSH hBrush = CreateSolidBrush(RGB(50,50,200));
    HPEN hOldPen = (HPEN)pDC->SelectObject(hPen);
    HBRUSH hOldBrush = (HBRUSH)pDC->SelectObject(hBrush);
    
    CRect l; l.left=130;l.top=30; l.right=250;l.bottom=100;
    pDC->Ellipse(l);
    
    pDC->SelectObject(hOldPen);
    DeleteObject(hPen);
    pDC->SelectObject(hOldBrush);
    DeleteObject(hBrush);
}

绘制简易叶片图形

为了让图形适应窗口大小,我们需要获取客户区中心点。使用 Polygon 函数可以高效地描绘树叶轮廓,配合叶脉线条增加立体感。

void CExp_01View::DrawLeaf(CDC *pDC, const CPoint &center) {
    CPen leafPen(PS_SOLID, 2, RGB(34, 139, 34));
    CPen veinPen(PS_SOLID, 1, RGB(0, 100, 0));
    CBrush leafBrush(RGB(124, 252, 0));
    
    CPen* pOldPen = pDC->SelectObject(&leafPen);
    CBrush* pOldBrush = pDC->SelectObject(&leafBrush);
    
    CPoint pts[7];
    pts[0] = CPoint(center.x, center.y - 40);
    // ... 其他顶点 ...
    pts[6] = pts[0]; // 闭合
    
    pDC->Polygon(pts, 7);
    
    // 绘制叶脉
    pDC->SelectObject(&veinPen);
    pDC->MoveTo(center.x, center.y - 40);
    pDC->LineTo(center.x, center.y + 30);
    
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldBrush);
}

在 OnDraw 中计算 rect.CenterPoint() 传入即可。

小结

本次实践涵盖了 MFC 绘图的核心流程:从项目初始化到 GDI 对象的创建与销毁。掌握了这些基础,后续处理复杂的地理信息投影或三维数据转换会更有底气。记住,资源管理(SelectObject/DeleteObject)是编写稳定绘图代码的关键习惯。

目录

  1. 项目目标
  2. 环境准备
  3. 创建 MFC 项目
  4. 绘制点要素
  5. 绘制线要素
  6. 绘制面要素
  7. 绘制简易叶片图形
  8. 小结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 快速排序核心原理与多版本实现详解
  • 前端基于 IntersectionObserver 的流畅懒加载实现
  • FastGPT 集成 MCP 协议实现工具增强型智能体构建
  • Obsidian接入AI完整配置指南
  • GitHub 7 款 Claude Skills 开源项目:Skill Creator、Superpowers 与 Code Review 实战指南
  • Python-Skill Bridge 实现 Python 与 Virtuoso Skill 无缝连接
  • OpenClaw 2026 主流厂商产品对比与选型指南
  • 网络安全工程师入门指南:技术栈与学习路径
  • VSCode 原生 Copilot 接入 DeepSeek 模型配置实战
  • 机器人 DH 参数模型与正运动学详解
  • 2026 高校论文 AI 率新规与 AIGC 检测要求汇总
  • 大模型量化技术原理:LLM.int8()与GPTQ
  • Ollama Windows 安装与使用:本地运行 Llama、DeepSeek 等大模型
  • Windows 安装原生 Codex CLI 配置 AI 代码助手
  • Unity-MCP 使用指南:利用 AI 驱动游戏开发
  • 零依赖纯前端 AI 辅助病例管理系统:无后端实现诊疗行为核验
  • SpringBoot 减肥食谱管理系统(中):食谱与菜单配置实现
  • OpenClaw 深度调优:5 步让 AI 助手从聊天变实干
  • AI 时代技术民主化:文科生为何成为最大受益者
  • C++流程控制语句详解:顺序、选择与循环结构

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online