FillRectangle 并不是 C 语言标准库(如 stdio.h, stdlib.h 等)中的一个原生函数。

它是一个图形函数,存在于各种不同的图形库和框架中,你如何使用它,完全取决于你正在使用的编程环境或库。
下面我将为你介绍最常见的几种情况,从最经典的到现代的。
在 Windows 平台下 (使用 GDI)
如果你在 Windows 平台下进行 C 语言开发,最经典的图形库是 GDI (Graphics Device Interface)。FillRectangle 在这里对应的函数是 FillRect。
核心函数:

FillRect(hDC, &lprc, hbr)
参数说明:
hDC: 设备上下文句柄,你可以把它理解为“画布”的凭证,任何绘图操作都需要它,通常通过BeginPaint或GetDC函数获取。lprc: 一个指向RECT结构体的指针。RECT结构体定义了要填充的矩形区域(左上角 x, y 坐标和右下角 x, y 坐标)。hbr: 画刷句柄,它决定了矩形内部填充的颜色或图案,可以使用CreateSolidBrush来创建一个纯色画刷。
示例代码:
下面的代码会创建一个简单的窗口,并在窗口客户区绘制一个蓝色的填充矩形。
#include <windows.h>
// 窗口过程函数的声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 1. 注册窗口类
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = L"MyFillRectWindow";
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
if (!RegisterClassEx(&wc)) {
MessageBox(NULL, L"Window Registration Failed!", L"Error", MB_ICONERROR);
return 0;
}
// 2. 创建窗口
HWND hWnd = CreateWindowEx(
0,
L"MyFillRectWindow",
L"FillRectangle Demo (GDI)",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, NULL, hInstance, NULL
);
if (hWnd == NULL) {
MessageBox(NULL, L"Window Creation Failed!", L"Error", MB_ICONERROR);
return 0;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 3. 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_PAINT: {
// 当窗口需要重绘时,此消息被发送
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hWnd, &ps);
// 定义要填充的矩形区域 (x1, y1, x2, y2)
RECT rect = { 100, 100, 400, 300 };
// 创建一个蓝色的实心画刷
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 255)); // RGB(蓝, 绿, 红)
// 使用画刷填充矩形
FillRect(hDC, &rect, hBrush);
// 清理资源:删除画刷
DeleteObject(hBrush);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
编译和运行:
将代码保存为 .c 文件(fillrect_demo.c),使用支持 Windows 开发的 C 编译器(如 Visual Studio 的 cl.exe 或 MinGW 的 gcc)进行编译。
在图形库中 (如 Allegro, SDL)
在游戏开发和跨平台图形应用中,开发者通常会选择更高级的图形库,如 Allegro 或 SDL,这些库提供了更现代、更易用的 API。
示例:使用 Allegro 5
Allegro 提供了 al_draw_filled_rectangle 函数。
核心函数:
al_draw_filled_rectangle(x1, y1, x2, y2, color)
参数说明:
x1, y1: 矩形左上角的坐标。x2, y2: 矩形右下角的坐标。color: 一个ALLEGRO_COLOR类型的颜色对象。
示例代码:
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h> // 需要此头文件来绘制图形
int main(int argc, char **argv) {
// 1. 初始化 Allegro
if (!al_init()) {
fprintf(stderr, "Failed to initialize allegro!\n");
return -1;
}
// 2. 创建显示设备(窗口)
ALLEGRO_DISPLAY *display = al_create_display(800, 600);
if (!display) {
fprintf(stderr, "Failed to create display!\n");
return -1;
}
// 3. 初始化附加模块
al_init_primitives_addon(); // 初始化图形绘制模块
// 4. 定义颜色
ALLEGRO_COLOR red = al_map_rgb(255, 0, 0); // 红色
ALLEGRO_COLOR green = al_map_rgb(0, 255, 0); // 绿色
ALLEGRO_COLOR blue = al_map_rgb(0, 0, 255); // 蓝色
// 5. 绘制填充矩形
al_draw_filled_rectangle(50, 50, 250, 200, red); // 红色矩形
al_draw_filled_rectangle(300, 50, 500, 200, green); // 绿色矩形
al_draw_filled_rectangle(175, 250, 375, 400, blue); // 蓝色矩形
// 6. 更新显示,将绘制的内容呈现在屏幕上
al_flip_display();
// 7. 等待5秒钟
al_rest(5.0);
// 8. 销毁显示设备
al_destroy_display(display);
return 0;
}
编译和运行:
你需要安装 Allegro 5 开发库,并在编译时链接它,使用 MinGW:
gcc your_file.c -o your_program -lallegro -lallegro_primitives
在现代 UI 框架中 (如 Qt)
如果你在使用 C++ 的 Qt 框架(它也广泛用于 C++ 项目,但理念与 C 不同),绘制方式又有所不同,Qt 使用 QPainter 类进行所有绘图操作。
核心概念:
QPainter: 绘图类,负责在QWidget或其他QPaintDevice上绘图。QRectF或QRect: 定义矩形区域。QBrush: 定义填充样式(颜色、图案等)。fillRect():QPainter的一个成员函数。
示例代码 (C++ with Qt):
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QBrush>
#include <QColor>
class MyWidget : public QWidget {
protected:
void paintEvent(QPaintEvent *event) {
Q_UNUSED(event); // 忽略未使用的参数警告
QPainter painter(this); // 创建一个 QPainter 对象,this 指向当前窗口
// 创建一个蓝色的画刷
QBrush brush(Qt::blue);
painter.setBrush(brush);
// 定义矩形区域
QRectF rect(50.0, 50.0, 300.0, 200.0);
// 填充矩形
painter.fillRect(rect, brush);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyWidget widget;
widget.setWindowTitle("FillRectangle Demo (Qt)");
widget.resize(800, 600);
widget.show();
return app.exec();
}
总结与对比
| 环境/库 | 核心函数 | 特点 |
|---|---|---|
| Windows GDI | FillRect(hDC, &RECT, HBRUSH) |
Windows 平台原生,底层,句柄管理复杂,资源需手动释放。 |
| Allegro | al_draw_filled_rectangle(x1, y1, x2, y2, color) |
跨平台,专为游戏设计,API 简洁现代。 |
| SDL | SDL_RenderFillRect(renderer, &rect) |
跨平台,轻量级,常与 OpenGL 配合使用。 |
| Qt | painter.fillRect(rect, brush) |
C++ 框架,跨平台,面向对象,信号槽机制强大,适合构建复杂 GUI 应用。 |
如何选择?
- 如果你只需要在 Windows 上做简单的图形绘制或学习 GDI:使用 Windows GDI 的
FillRect。 - 如果你在开发游戏或需要跨平台的 2D 图形应用:推荐使用 Allegro 或 SDL,它们更简单、更现代。
- 如果你在用 C++ 开发桌面应用程序:Qt 是不二之选,功能强大且生态完善。
希望这个详细的解释能帮助你理解和使用 FillRectangle 功能!
