C语言中fillrectangle函数如何使用?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 C语言 正文

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

c语言 fillrectangle
(图片来源网络,侵删)

它是一个图形函数,存在于各种不同的图形库和框架中,你如何使用它,完全取决于你正在使用的编程环境或库。

下面我将为你介绍最常见的几种情况,从最经典的到现代的。


在 Windows 平台下 (使用 GDI)

如果你在 Windows 平台下进行 C 语言开发,最经典的图形库是 GDI (Graphics Device Interface)。FillRectangle 在这里对应的函数是 FillRect

核心函数:

c语言 fillrectangle
(图片来源网络,侵删)
  • FillRect(hDC, &lprc, hbr)

参数说明:

  • hDC: 设备上下文句柄,你可以把它理解为“画布”的凭证,任何绘图操作都需要它,通常通过 BeginPaintGetDC 函数获取。
  • 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)

在游戏开发和跨平台图形应用中,开发者通常会选择更高级的图形库,如 AllegroSDL,这些库提供了更现代、更易用的 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 上绘图。
  • QRectFQRect: 定义矩形区域。
  • 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 图形应用:推荐使用 AllegroSDL,它们更简单、更现代。
  • 如果你在用 C++ 开发桌面应用程序Qt 是不二之选,功能强大且生态完善。

希望这个详细的解释能帮助你理解和使用 FillRectangle 功能!

-- 展开阅读全文 --
头像
C语言中GetTickCount如何精确获取运行时间?
« 上一篇 12-10
如何去除dede中的标签?
下一篇 » 12-10

相关文章

取消
微信二维码
支付宝二维码

目录[+]