windows+GTK4/3+Clion+msys2


🔜底部锚点 ▼⬇️

前言

  • 在犹豫用什么框架写GUI时,考虑纵多,我决定用GTK4来在windows上开发GUI程序,
    原因是小巧,界面还可以. (受不了win32图形界面原生api的臃肿繁琐?)
  • 相关教程很少 于是我在这里整理一些要点细节记录一下

提示:以下是本篇文章正文内容,下面案例可供参考

Requirements

一、安装相关工具

  •   # gcc
      pacman -S mingw-w64-ucrt-x86_64-gcc
      # gtk  4
      pacman -S mingw-w64-x86_64-gtk4
      # gtk  3
      pacman -S mingw-w64-x86_64-gtk3
      # 工具链
      pacman -S mingw-w64-x86_64-toolchain base-devel 
    
  • gtk4或许依赖一些gtk3的库文件所以我都安装后再 pacman -R mingw-w64-x86_64-gtk3
    只安装gtk4时 CMakeLists.txt build 时报一些错误

二、配置环境变量

  • msys的路径
    主要是把msys下面的mingw64目录暴露出来,然后

  • 在这里插入图片描述

  • 注意顺序: 上面bin lib include 一定放在下面两个上面 不然后面用
    pkg-config --modversion gtk4 验证的时候:Package gtk4 was not found in the pkg-config search path.

  • 下面两个环境变量的配置是必要的吗? 待定…在这里插入图片描述

三、验证工具/模块

  •   # PowerShell下输入
      
      gcc --version 
      #gtk4 模块版本
      pkg-config --modversion gtk4
      #gtk3 
      pkg-config --modversion gtk+-3.0
      #gtk3/4 库文件 4改3
      pkg-config --cflags --libs gtk4 
      
      #demo
      gtk4-demo
      gtk3-demo
    

四、Clion Build工具集的配置

  • Ctrl+Alt+S show up the settings Window
    在这里插入图片描述

五、CMakeLists.txt文件的配置

  • gtk4 (ProjectName字段改成你的项目名)

    cmake_minimum_required(VERSION 3.2)
    project(SimpleCalculatorPro)
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    
    find_package(PkgConfig REQUIRED)
    
    pkg_check_modules(GTK4 REQUIRED gtk4)
    
    include_directories(${GTK4_INCLUDE_DIRS})
    link_directories(${GTK4_LIBRARY_DIRS})
    
    add_definitions(${GTK4_CFLAGS_OTHER})
    
    add_executable(ProjectName main.cpp)
    target_link_libraries(ProjectName ${GTK4_LIBRARIES})
    
  • gtk3 (ProjectName字段改成你的项目名)

      cmake_minimum_required(VERSION 3.2)
      project(SimpleCalculatorPro)
    
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    
      find_package(PkgConfig REQUIRED)
    
      pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
    
      include_directories(${GTK3_INCLUDE_DIRS})
      link_directories(${GTK3_LIBRARY_DIRS})
    
      add_definitions(${GTK3_CFLAGS_OTHER})
    
      add_executable(ProjectName main.cpp)
      target_link_libraries(ProjectName ${GTK3_LIBRARIES})
    

六、简单窗口例子

  • #include <gtk/gtk.h>
    static
    void log_print()
    {
    
     g_print("this is a message\n");
    
    }
    static
    void activate (
     GtkApplication* app,
     gpointer  data
    )
    {
     GtkWidget* window;
     GtkWidget* button;
     window = gtk_application_window_new(app);
     button = gtk_button_new_with_label("hello world!");
     g_signal_connect(button, "clicked", G_CALLBACK(log_print), nullptr);
    
     gtk_window_set_default_size(GTK_WINDOW(window), 100, 300);
     gtk_window_set_title(GTK_WINDOW(window), "test");
     gtk_window_set_child(GTK_WINDOW(window), button);
     gtk_window_present(GTK_WINDOW(window));
    }
    int main(int argc,
          char** argv)
    {
     GtkApplication* app;
     int status;
     app = gtk_application_new("myapp.test.com", G_APPLICATION_DEFAULT_FLAGS);
     g_signal_connect(app, "activate", G_CALLBACK(activate), nullptr);
    
     status = g_application_run(G_APPLICATION(app), argc, argv);
     g_object_unref(app);
    
    }
    
    • 这是一个GTK4窗口
      在这里插入图片描述

七、Glade:GTK的GUI设计器

在这里插入图片描述

To be continue…


------------------------------------- ½§¦ ‹ ‹‹‹…‹ 这是分割线中的分隔区 ›…››› ›¦§½ ----------------------------------------


后记

我保留了GTK3模块,以防GTK4错误

<think>好的,用户问的是如何用C语言的函数实现图形交互界面。我需要先回顾一下之前的历史对话。用户之前问过如何实现简单的UI,我介绍了终端界面、Tkinter、Electron、硬件级UI等方案,其中提到了C语言的curses库做终端菜单。现在用户可能想进一步深入,用C语言在图形界面而非终端下开发。 首先,用户的需求是“用函数实现图形交互界面”,所以需要明确C语言通常如何创建图形界面。C语言本身没有内置的图形库,需要依赖第三方库。常见的库包括GTK、SDL、WinAPI、X11等。之前提到过curses,但那是终端下的,用户这次可能指的是图形窗口界面。 接下来要考虑用户可能的背景。他们可能有一定的C语言基础,但对图形编程不熟悉。需要介绍几种常用库,并给出简单示例,说明如何使用这些库的函数来创建窗口、处理事件等。 需要分步骤解释,比如选择库、安装环境、编写代码、编译运行。同时要注意不同平台的差异,比如Windows和Linux下可用的库可能不同。例如,WinAPI只能在Windows使用,而GTK是跨平台的,但安装配置可能复杂些。 用户可能需要对比不同库的优缺点,帮助他们选择适合的。比如GTK适合创建原生界面的桌面应用,而SDL更适合游戏或多媒体应用。还要注意示例代码的正确性,确保他们能够复制并运行。 另外,用户可能对事件驱动机制不熟悉,需要解释事件循环的概念,比如如何处理鼠标点击、键盘输入等。在示例代码中展示如何创建按钮并绑定回调函数,这样用户能直观看到交互的实现。 还要考虑编译指令,比如如何链接库。例如,GTK需要安装开发包,编译时用`pkg-config`来获取正确的编译选项。这对于新手来说可能是个障碍,需要详细说明。 最后,可能需要给出一些学习资源或进一步的建议,比如官方文档或教程,帮助用户深入学习。同时提醒他们图形编程的复杂性,建议从简单例子开始,逐步构建功能。</think>### **C语言实现图形交互界面的核心方法与示例** C语言本身不包含图形库,但可通过**第三方库**实现图形界面开发。以下是三种主流方案的实现路径: --- ### **一、基于GTK+的跨平台GUI开发** #### 1. 环境准备 ```bash # Ubuntu/Debian sudo apt install libgtk-3-dev # Windows需下载MSYS2环境 pacman -S mingw-w64-x86_64-gtk3 ``` #### 2. 基础窗口示例 ```c #include <gtk/gtk.h> // 按钮点击回调函数 static void on_button_click(GtkWidget *widget, gpointer data) { g_print("按钮被点击!\n"); } int main(int argc, char *argv[]) { GtkWidget *window, *button; gtk_init(&argc, &argv); // 初始化GTK // 创建窗口 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GTK示例"); gtk_container_set_border_width(GTK_CONTAINER(window), 10); // 创建按钮并绑定事件 button = gtk_button_new_with_label("点击我"); g_signal_connect(button, "clicked", G_CALLBACK(on_button_click), NULL); // 布局管理 gtk_container_add(GTK_CONTAINER(window), button); // 显示控件 gtk_widget_show_all(window); // 主事件循环 gtk_main(); return 0; } ``` **编译命令**: ```bash gcc `pkg-config --cflags gtk+-3.0` -o app main.c `pkg-config --libs gtk+-3.0` ``` #### 3. 核心概念 - **信号与回调机制**:通过`g_signal_connect()`绑定事件 - **容器布局**:使用`GtkBox`/`GtkGrid`进行控件排列 - **多线程处理**:使用`g_idle_add()`更新UI --- ### **二、Windows平台原生API开发** #### 1. Win32 API基础框架 ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("MyWindow"); HWND hwnd; MSG msg; WNDCLASS wndclass; // 注册窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) return 0; // 创建窗口 hwnd = CreateWindow(szAppName, TEXT("Windows GUI"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL); // 显示窗口 ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); // 消息循环 while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 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); TextOut(hdc, 50, 50, TEXT("Hello Windows!"), 13); EndPaint(hwnd, &ps); return 0; } case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } ``` #### 2. 技术特点 - 直接调用系统API,性能最优 - 需要理解Windows消息机制(如`WM_PAINT`, `WM_SIZE`等) - 支持GDI绘图(直线、矩形、文本等) --- ### **三、跨平台图形库SDL2** #### 1. 基础交互框架 ```c #include <SDL2/SDL.h> int main() { SDL_Window *window = NULL; SDL_Renderer *renderer = NULL; // 初始化SDL SDL_Init(SDL_INIT_VIDEO); // 创建窗口 window = SDL_CreateWindow("SDL界面", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN); renderer = SDL_CreateRenderer(window, -1, 0); // 事件循环 SDL_Event event; int quit = 0; while (!quit) { while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) quit = 1; // 处理鼠标点击 if (event.type == SDL_MOUSEBUTTONDOWN) { int x, y; SDL_GetMouseState(&x, &y); printf("点击坐标: (%d, %d)\n", x, y); } } // 清屏绘制 SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_RenderClear(renderer); // 绘制红色矩形 SDL_Rect rect = {100, 100, 200, 150}; SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); SDL_RenderFillRect(renderer, &rect); SDL_RenderPresent(renderer); } // 资源释放 SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` **编译命令**: ```bash gcc main.c -o app `sdl2-config --cflags --libs` ``` --- ### **四、技术选型对比** | 方案 | 优点 | 缺点 | 适用场景 | |-------------|---------------------------|---------------------------|------------------------| | **GTK+** | 跨平台、现代控件库 | 依赖较多、包体积较大 | Linux桌面应用开发 | | **Win32API**| 原生性能、无额外依赖 | 仅限Windows平台 | Windows系统工具开发 | | **SDL2** | 游戏开发友好、硬件加速 | 需要自行实现控件系统 | 游戏/多媒体应用 | --- ### **五、进阶开发建议** 1. **界面布局优化** - 使用Glade工具可视化设计GTK界面(生成XML文件) - 学习CSS样式表定制GTK控件外观 ```c // 为按钮添加CSS样式 GtkCssProvider *provider = gtk_css_provider_new(); gtk_css_provider_load_from_data(provider, "button { background: #4CAF50; color: white; }", -1, NULL); gtk_style_context_add_provider(gtk_widget_get_style_context(button), GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER); ``` 2. **多线程处理** ```c // GTK中的线程安全更新 g_idle_add((GSourceFunc)update_label, data); // SDL中的定时器回调 SDL_TimerID timer = SDL_AddTimer(1000, timer_callback, NULL); ``` 3. **硬件交互** ```c // 通过SDL读取游戏手柄输入 SDL_Joystick *joystick = SDL_JoystickOpen(0); if (joystick) { printf("检测到游戏手柄: %s\n", SDL_JoystickName(joystick)); } ``` --- ### **六、学习资源推荐** 1. **官方文档** - [GTK官方教程](https://docs.gtk.org/gtk3/) - [Microsoft Win32 API文档](https://docs.microsoft.com/zh-cn/windows/win32/api/) - [SDL Wiki](https://wiki.libsdl.org/) 2. **经典书籍** - 《Windows程序设计》(Charles Petzold著) - 《GTK+ 3开发基础教程》 3. **开发工具** - Visual Studio(Windows开发) - GNOME Builder(GTK开发) - CLion + SDL2(跨平台开发) --- **实践建议**:从简单的消息框和按钮开始,逐步增加绘图功能和复杂控件,最终实现完整的交互逻辑。注意不同平台的编译环境配置差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值