alpha49 2023-03-31 23:29 采纳率: 61.1%
浏览 88
已结题

请问纯C语言如何编写简易的easyx图形库

我最近想自己动手写一个easyx绘图库,我现在已经使用多线程写出了如下代码:
#include "windows.h"
#include "stdio.h"
#include <pthread.h>

HWND h;
HINSTANCE hinst;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

void win(){
    WNDCLASSEX wc;
    HWND hwnd;

    hinst = GetModuleHandle(NULL);

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hinst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = "WindowClass";
    wc.hbrBackground = CreateSolidBrush(RGB(127, 127, 127));

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(0,
                          "WindowClass",
                          "Hello, World!",
                          WS_OVERLAPPEDWINDOW,
                          300,
                          300,
                          500,
                          400,
                          NULL,
                          NULL,
                          hinst,
                          NULL);

    ShowWindow(hwnd, SW_SHOWDEFAULT);
    UpdateWindow(hwnd);
    h = hwnd;


}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }

    return 0;
}

void gmsg(){
    MSG msg;
    win();
    while (GetMessage(&msg, h, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

HWND initgraph(){
    pthread_t th1;

    pthread_create(&th1,NULL,(void*)gmsg,NULL);

    pthread_detach(th1);

    return h;
}

int main(){
    HWND hwnd = initgraph();
    printf("hello");
    getchar();
}
其中initgraph();函数是用来创建多线程窗口的,但是往下就没有思路了,如easyx库中创建窗口后使用setlinecolor改变线的颜色、setfillcolor改变填充色、fillrectangle函数绘制填充矩形等。以画矩形为例,如何创建一个函数,使其调用之后就可以实现与easyx一样的绘图效果呢?求解答,谢谢。
  • 写回答

7条回答 默认 最新

  • 极客智能体-在线 2023-04-01 16:54
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    要使用纯C语言实现类似EasyX的图形库是相当困难的任务。EasyX库充分利用Windows GDI的功能,调用了大量的Windows API,展现了一个简洁易用、功能强大且优秀的图形程序开发库。

    如果您想使用C语言开发一个图形库,我们建议您使用OpenGL或者SDL库,它们都是跨平台的图形库,非常适用于游戏开发。

    如果您坚持要使用Windows API来实现类似EasyX的库,我们将为您提供以下几个步骤:

    1.创建窗口

    和你现在写的代码类似,使用Windows API创建一个窗口,可以使用CreateWindow函数来创建并显示出一个窗口。

    2.处理消息

    和你现在写的代码一样,在WndProc函数中处理窗口消息。

    3.创建画笔

    使用Windows API中的CreatePen和CreateSolidBrush函数来创建画笔和画刷。

    4.绘制图形

    使用Windows API中的各种绘图函数,例如LineTo、MoveToEx、Rectangle、Ellipse等来绘制需要的图形。

    5.更新屏幕

    使用Windows API中的InvalidateRect和UpdateWindow函数来更新界面。

    以下是简单的代码示例:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
        char szClassName[] = "MyClass";
        char szTitle[] = "EasyX-like";
    
        WNDCLASSEX wcex;
        ZeroMemory(&wcex, sizeof(wcex));
        wcex.cbSize = sizeof(wcex);
        wcex.style = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc = WndProc;
        wcex.hInstance = hInstance;
        wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
        wcex.lpszClassName = szClassName;
        RegisterClassEx(&wcex);
    
        HWND hWnd = CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 50, 50, 700, 500, NULL, NULL, hInstance, NULL);
        ShowWindow(hWnd, SW_SHOWDEFAULT);
    
        HDC hdc = GetDC(hWnd);
        HPEN pen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
        SelectObject(hdc, pen);
    
        RECT rc = { 50, 50, 150, 150}; // 左上角坐标为 (50, 50),右下角坐标为 (150, 150)
        Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
    
        ReleaseDC(hWnd, hdc);
        MessageBox(NULL, "Hello", "World", MB_OK);
    
        return 0;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
        switch (msg) {
            case WM_PAINT: {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hwnd, &ps);
    
                HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
                SelectObject(hdc, brush);
    
                RECT rc = {200, 100, 300, 200};
                FillRect(hdc, &rc, brush);
    
                EndPaint(hwnd, &ps);
                break;
            }
            case WM_DESTROY:
                PostQuitMessage(0);
                break;
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    

    这份代码创建了一个350 * 400像素的窗口,并在窗口中绘制了一个红色矩形和一个蓝色填充矩形。

    由于Windows GDI中的所有函数都是基于设备上下文(DC)的,所以需要在绘图函数中获取设备上下文。在这个示例中,我们使用了GetDC和ReleaseDC函数来获取和释放设备上下文。

    这只是一个初步的示例,希望能过帮助您进一步了解图形编程和Windows API。如果您想要实现更加高级的图形库,我们建议您深入学习Windows GDI的相关知识。
    如果我的回答解决了您的问题,请采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 4月9日
  • 已采纳回答 4月1日
  • 创建了问题 3月31日

悬赏问题

  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题