Как создать кастомное кроссплатформенное окно на си?

Для создания кастомного кроссплатформенного окна на языке C существуют несколько популярных библиотек, таких как SDL (Simple DirectMedia Layer), GLFW (Graphics Library Framework) и GTK+ (GIMP Toolkit). В данном ответе я расскажу о каждой из них и продемонстрирую примеры использования.

1. SDL (Simple DirectMedia Layer):
SDL является мощной и широко используемой библиотекой для создания кроссплатформенных окон. Она поддерживает работу с графикой, звуком, вводом устройств и другими основными функциями, которые часто используются при создании оконных приложений. Вот пример кода, который показывает, как создать простое окно при помощи SDL:

#include <SDL.h>

int main(int argc, char* argv[]) {
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window* window = SDL_CreateWindow("My Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

    // Основной цикл приложения
    bool running = true;
    while (running) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                running = false;
            }
        }

        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

2. GLFW (Graphics Library Framework):
GLFW предоставляет простой и удобный интерфейс для создания окон и обработки событий. Она также поддерживает работу с OpenGL. Вот пример кода, который демонстрирует создание окна с помощью GLFW:

#include <GLFW/glfw3.h>

void error_callback(int error, const char* description) {
    fprintf(stderr, "Error: %sn", description);
}

int main(void) {
    GLFWwindow* window;
    glfwSetErrorCallback(error_callback);

    if (!glfwInit()) {
        exit(EXIT_FAILURE);
    }

    window = glfwCreateWindow(640, 480, "My Window", NULL, NULL);
    if (!window) {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(window);

    // Основной цикл приложения
    while (!glfwWindowShouldClose(window)) {
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

3. GTK+ (GIMP Toolkit):
GTK+ является библиотекой с открытым исходным кодом, которая предоставляет инструменты и функции для создания графического интерфейса. Она может использоваться для создания окон, кнопок, текстовых полей и многого другого. Вот пример кода, демонстрирующий создание окна с помощью GTK+:

#include <gtk/gtk.h>

static void activate(GtkApplication* app, gpointer user_data) {
    GtkWidget *window;

    window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "My Window");
    gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);

    gtk_widget_show_all(window);
}

int main(int argc, char** argv) {
    GtkApplication* app;
    int status;

    app = gtk_application_new("com.example.myapp", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);

    return status;
}

При использовании любой из этих библиотек необходимо установить соответствующие заголовочные файлы и библиотеки для компиляции. Кроме того, не забудьте учесть требования к сборке проекта для каждой библиотеки.

Надеюсь, эти примеры помогут вам начать создавать кастомные кросс-платформенные окна на языке C.