movepen 不是标准 C 函数
最重要的一点是:movepen 并不是标准 C 语言库(如 stdio.h, stdlib.h 等)中的一个函数。

(图片来源网络,侵删)
它是一个特定于某个图形库或环境的函数,当你看到 movepen 时,几乎可以肯定它来自以下两种情况之一:
- 古老的图形库:最著名的例子是 Borland BGI (Borland Graphics Interface),这个库在 80 年代末到 90 年代初非常流行,用于 Turbo C 和 Borland C++ 等 DOS 时代的编译器。
movepen是这个库的一部分。 - 自定义函数:在某些教学、嵌入式系统或特定的图形应用中,开发者可能会自己定义一个名为
movepen的函数来封装绘图逻辑。
下面,我们将分别对这两种情况进行详细说明。
Borland BGI 中的 movepen
在 BGI 库中,movepen 函数用于移动“画笔”的当前位置,但不画线,它相当于抬笔移动。
函数原型
void far movepen(int x, int y);
far: 这是 BGI 在 DOS 实模式下使用的关键字,用于处理远指针(far pointer),在现代编程中基本可以忽略。x,y: 这是画笔将要移动到的绝对坐标(相对于图形窗口的左上角,通常是 (0, 0))。
功能描述
- 它将当前绘图光标(画笔)的位置从
(current_x, current_y)移动到新的坐标(x, y)。 - 在移动过程中,不会在屏幕上绘制任何像素或线条。
- 这个函数改变了后续绘图操作的起点,如果你调用
movepen(10, 10)然后再调用lineto(50, 50),那么将从点 (10, 10) 到 (50, 50) 画一条线。
相关函数
为了更好地理解 movepen,通常需要了解它的“兄弟”函数 lineto:

(图片来源网络,侵删)
lineto(int x, int y): 从当前画笔位置画一条直线到指定的绝对坐标(x, y),并更新画笔位置。
完整示例 (BGI / Turbo C 环境)
这是一个典型的使用 BGI 库的完整例子,这个代码不能在 Visual Studio、GCC 或 Clang 等现代编译器上直接运行,因为它依赖于 DOS 环境和 BGI 驱动。
#include <graphics.h> // BGI 图形库头文件
#include <conio.h> // 用于 getch()
int main() {
// 初始化图形模式
// DETECT 是一个宏,让系统自动检测合适的图形驱动
int gd = DETECT, gm;
initgraph(&gd, &gm, "C:\\TC\\BGI"); // 指定 BGI 文件路径,根据你的环境修改
// 检查初始化是否成功
if (graphresult() != grOk) {
printf("图形初始化失败!");
return 1;
}
// 1. 移动画笔到绝对坐标 (50, 50)
movepen(50, 50);
// 画笔在 (50, 50),但屏幕上什么都没有。
// 2. 从当前位置 (50, 50) 画一条线到 (150, 150)
lineto(150, 150);
// 屏幕上出现一条从 (50, 50) 到 (150, 150) 的线。
// 3. 再次移动画笔到新的位置 (100, 250)
movepen(100, 250);
// 4. 从新位置 (100, 250) 画一条线到 (250, 250)
lineto(250, 250);
// 屏幕上又出现一条从 (100, 250) 到 (250, 250) 的线。
// 等待用户按任意键
getch();
// 关闭图形模式,返回文本模式
closegraph();
return 0;
}
自定义的 movepen 函数
在现代 C 语言编程中,如果你想要一个类似的功能,通常会自己实现,下面是一个简单的自定义 movepen 函数的例子,它可能在一个基于控制台或简单图形库的程序中使用。
思路
我们可以用一个全局变量来记录当前画笔的坐标。movepen 函数就负责更新这个全局变量。
示例代码
#include <stdio.h>
// --- 全局变量,记录当前画笔位置 ---
int current_pen_x = 0;
int current_pen_y = 0;
// --- 自定义的 movepen 函数 ---
// 功能:更新画笔的当前位置
void movepen(int x, int y) {
printf("移动画笔从 (%d, %d) 到 (%d, %d)\n", current_pen_x, current_pen_y, x, y);
current_pen_x = x;
current_pen_y = y;
}
// --- 一个模拟画线的函数 ---
void my_lineto(int x, int y) {
printf("从 (%d, %d) 画一条线到 (%d, %d)\n", current_pen_x, current_pen_y, x, y);
// 画完后,画笔位置也要更新
current_pen_x = x;
current_pen_y = y;
}
int main() {
// 初始画笔位置在 (0, 0)
// 第一次移动
movepen(10, 20);
// 画一条线
my_lineto(50, 60);
// 再次移动
movepen(100, 100);
// 再画一条线
my_lineto(200, 200);
return 0;
}
输出结果
移动画笔从 (0, 0) 到 (10, 20)
从 (10, 20) 画一条线到 (50, 60)
移动画笔从 (50, 60) 到 (100, 100)
从 (100, 100) 画一条线到 (200, 200)
这个自定义版本没有真正在屏幕上绘图,但它完美地模拟了 movepen 和 lineto 的核心逻辑。
总结与对比
| 特性 | Borland BGI movepen |
自定义 movepen |
|---|---|---|
| 来源 | Borland BGI 图形库 (DOS 时代) | 开发者自己定义 |
| 依赖 | 需要 graphics.h 和 BGI 驱动 |
无特殊依赖,纯 C 代码 |
| 功能 | 在图形窗口中移动绘图光标,不画线 | 更新一个表示画笔位置的状态变量 |
| 坐标 | 屏幕上的绝对像素坐标 | 可以是任意坐标系统 (如逻辑坐标) |
| 适用环境 | 旧式 DOS 编程 (Turbo C 等) | 现代 C/C++ 项目,教学示例 |
| 如何使用 | #include <graphics.h> |
在代码中定义函数和全局变量 |
如果你在阅读或修改一段古老的 C 代码时遇到 movepen,那么它几乎可以肯定是 BGI 库的一部分,如果你想在新的项目中实现类似功能,最好的方式是参考 BGI 的设计思想,自己封装一个函数来管理绘图状态(如当前坐标)。
