在C语言中,绘制矩形通常依赖于图形库,因为标准C库本身不包含图形绘制功能,以下是几种常见的方法,从简单到复杂,适用于不同的环境和需求。

(图片来源网络,侵删)
使用 EasyX 图形库 (Windows 环境下最简单)
EasyX 是一个专为C/C++设计的轻量级图形库,非常适合初学者和在Windows平台下进行简单的图形编程。
安装 EasyX
- 访问 EasyX 官网 下载并安装。
示例代码
- 这个代码会创建一个窗口,并在窗口中心画一个蓝色的填充矩形和一个红色的空心矩形。
#include <graphics.h> // EasyX 图形库头文件
#include <conio.h> // 用于 _getch() 函数
int main() {
// 1. 初始化图形窗口,设置窗口大小和标题
initgraph(640, 480);
// 2. 设置矩形的颜色和样式
// 设置填充颜色为蓝色
setfillcolor(BLUE);
// 设置边框颜色为红色
setlinecolor(RED);
// 设置线宽为3像素
setlinestyle(PS_SOLID, 3);
// 3. 绘制填充矩形
// 函数原型:void rectangle(int left, int top, int right, int bottom);
// (left, top) 是矩形左上角坐标, (right, bottom) 是右下角坐标
rectangle(200, 150, 440, 330);
// 4. 绘制空心矩形
// 为了对比,我们先改变填充模式
setfillstyle(BS_NULL); // BS_NULL 表示不填充
rectangle(100, 50, 540, 430);
// 5. 在窗口上显示文字
outtextxy(10, 10, "Press any key to close...");
// 6. 等待用户按键
_getch();
// 7. 关闭图形窗口
closegraph();
return 0;
}
代码解释:

(图片来源网络,侵删)
initgraph(width, height): 创建一个指定大小的图形窗口。setfillcolor(color): 设置矩形的填充颜色。setlinecolor(color): 设置矩形边框的颜色。setlinestyle(style, width): 设置边框的线型和宽度。rectangle(left, top, right, bottom): 核心函数,绘制一个矩形,它使用当前设置的线型和颜色来绘制边框,并使用当前设置的填充颜色进行填充。outtextxy(x, y, text): 在指定坐标输出文字。_getch(): 暂停程序,等待用户按任意键。closegraph(): 关闭图形窗口,释放资源。
使用 Win32 GDI (Windows 环境下更底层)
如果你不想安装第三方库,可以使用Windows自带的GDI (Graphics Device Interface) API,这比EasyX复杂,但更底层,功能也更强大。
示例代码
- 这是一个Windows窗口程序,需要包含Windows.h头文件。
#include <windows.h> // Windows API 头文件
// 窗口过程函数的声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 窗口类名
const char* CLASS_NAME = "Sample Window Class";
// 注册窗口类
WNDCLASS wc = { };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
"Draw a Rectangle with Win32", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL) {
return 0;
}
ShowWindow(hwnd, nCmdShow);
// 消息循环
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
// 窗口过程函数,处理所有发送到窗口的消息
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_PAINT: {
// 当窗口需要重绘时,此消息被发送
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 1. 获取设备上下文句柄
// hdc 已经由 BeginPaint 提供
// 2. 创建画笔和画刷
HPEN hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); // 红色实线画笔,宽度为3
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 255)); // 蓝色实心画刷
// 3. 将画笔和画刷选入设备上下文
HBRUSH oldBrush = (HBRUSH)SelectObject(hdc, hBrush);
HPEN oldPen = (HPEN)SelectObject(hdc, hPen);
// 4. 绘制矩形
// 函数原型:BOOL Rectangle(HDC hdc, int left, int top, int right, int bottom);
Rectangle(hdc, 200, 150, 440, 330);
// 5. 恢复旧的画笔和画刷
SelectObject(hdc, oldPen);
SelectObject(hdc, oldBrush);
// 6. 释放资源
DeleteObject(hPen);
DeleteObject(hBrush);
EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY: {
// 当窗口被销毁时,发送此消息
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
代码解释:
- 这是一个完整的Windows GUI程序结构。
WndProc是窗口的“回调函数”,处理各种系统消息。WM_PAINT消息是关键,当窗口需要被绘制(如首次显示、被遮挡后重新显示)时,系统会发送这个消息。BeginPaint/EndPaint: 开始和结束一次绘制操作。HDC(Device Context Handle): 设备上下文句柄,是所有绘图操作的“画布”。CreatePen: 创建一个画笔对象,用于定义线条的颜色、宽度和样式。CreateBrush: 创建一个画刷对象,用于定义填充的样式和颜色。SelectObject: 将创建的画笔或画刷“选入”当前的设备上下文,使其生效。Rectangle: GDI的核心绘图函数,使用当前选入的画笔和画刷来绘制矩形。DeleteObject: 释放GDI对象,防止内存泄漏。
使用第三方跨平台库 (如 SDL)
如果你需要你的程序能在Windows、Linux和macOS上运行,可以考虑使用跨平台库,如SDL (Simple DirectMedia Layer)。

(图片来源网络,侵删)
安装 SDL
- 你需要下载SDL的开发库,并配置你的编译器来链接它。
示例代码
- 这个代码会创建一个窗口,并在上面画一个矩形。
#include <SDL2/SDL.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
// 1. 初始化SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
return 1;
}
// 2. 创建窗口
SDL_Window* window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);
if (window == NULL) {
printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
return 1;
}
// 3. 创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (renderer == NULL) {
printf("Renderer could not be created! SDL_Error: %s\n", SDL_GetError());
return 1;
}
// 4. 主循环
int quit = 0;
SDL_Event e;
while (!quit) {
// 处理事件
while (SDL_PollEvent(&e) != 0) {
if (e.type == SDL_QUIT) {
quit = 1;
}
}
// 清空渲染器为黑色
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 黑色
SDL_RenderClear(renderer);
// 设置矩形的颜色为蓝色
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); // 蓝色
// 5. 绘制矩形
// SDL_Rect 结构体定义了矩形的位置和大小
SDL_Rect fillRect = { 200, 150, 240, 180 }; // x, y, width, height
SDL_RenderFillRect(renderer, &fillRect);
// 设置边框颜色为红色
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 红色
SDL_Rect outlineRect = { 100, 50, 600, 500 }; // x, y, width, height
SDL_RenderDrawRect(renderer, &outlineRect);
// 更新屏幕
SDL_RenderPresent(renderer);
}
// 6. 清理资源
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
代码解释:
SDL_Init: 初始化SDL的子系统,这里是SDL_INIT_VIDEO(视频)。SDL_CreateWindow: 创建一个窗口。SDL_CreateRenderer: 创建一个渲染器,负责在窗口上绘制。SDL_SetRenderDrawColor: 设置后续绘制操作的颜色。SDL_RenderClear: 用当前颜色清空整个屏幕。SDL_Rect: 一个结构体,用于定义矩形的位置 (x,y) 和尺寸 (width,height)。SDL_RenderFillRect: 绘制一个填充矩形。SDL_RenderDrawRect: 绘制一个空心矩形(只画边框)。SDL_RenderPresent: 将渲染器中的内容显示到屏幕上(“翻转缓冲区”)。
总结与选择建议
| 特性 | EasyX | Win32 GDI | SDL |
|---|---|---|---|
| 平台 | 仅 Windows | 仅 Windows | Windows, Linux, macOS |
| 易用性 | 非常简单,API直观 | 复杂,需要理解Windows消息循环 | 中等,概念清晰但配置稍复杂 |
| 依赖 | 需要安装EasyX库 | 无需安装,Windows自带 | 需要安装SDL库和开发文件 |
| 功能 | 适合简单2D图形和游戏 | 功能强大,可用于复杂GUI和图形 | 适合游戏、多媒体和实时图形应用 |
| 推荐场景 | 初学者学习C语言图形编程、Windows下快速原型开发 | 不使用第三方库的Windows桌面应用开发 | 跨平台游戏或图形应用开发 |
对于初学者,如果你在Windows环境下,强烈推荐使用 EasyX,它能让你专注于绘图逻辑本身,而不是复杂的窗口和消息处理。
