C语言中如何绘制矩形?

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

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

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

使用 EasyX 图形库 (Windows 环境下最简单)

EasyX 是一个专为C/C++设计的轻量级图形库,非常适合初学者和在Windows平台下进行简单的图形编程。

安装 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;
}

代码解释:

c语言drawrectangle
(图片来源网络,侵删)
  • 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)。

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

安装 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,它能让你专注于绘图逻辑本身,而不是复杂的窗口和消息处理。

-- 展开阅读全文 --
头像
dede织梦整站路径如何修改?
« 上一篇 2025-12-21
dede美食餐饮公司织梦模板哪里下载?
下一篇 » 2025-12-21

相关文章

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

目录[+]