C++的跨平台桌面GUI库有很多,大体上分成两种流派:retained mode和immediate mode。

  • 其中前者是主流的桌面GUI机制框架,包括:Qt、wxwidgets、gtk、juce等
  • 后者是一些游戏引擎编辑器常用的GUI机制框架,包括:imgui、nanogui等

使用这些框架都支持构建在windows、mac、linux上面能运行的桌面图形界面程序。
但如果在开发小工具项目,要求跨平台、开源免费、协议友好、性能高、轻量级的需求,这里推荐FLTK库(https://www.fltk.org/),只需要作为一个依赖库的方式引入工程即可。

以下是一个使用FLTK开发的简单demo代码示例,功能是显示一个编辑框和一个按钮,点击按钮刷新编辑框的数字。

项目结构

fltk_demo
	- fltk-1.3.8
	- src
	  |- main.cpp
	- CMakeLists.txt

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(fltk_demo)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if (WIN32)
    set(CMAKE_EXE_LINKER_FLAGS "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") # do not pop out console for release
endif()

if (WIN32)
    add_definitions(
        -D_CRT_SECURE_NO_WARNINGS
        -D_WINSOCK_DEPRECATED_NO_WARNINGS
    )
endif()

add_subdirectory(fltk-1.3.8)

include_directories(fltk-1.3.8)

file(GLOB SRC
    src/*.h
    src/*.cpp
)

add_executable(${PROJECT_NAME} ${SRC})

# both win and linux use the same lib name
target_link_libraries(${PROJECT_NAME}
    fltk
)

main.cpp

#include <iostream>
#include <string>
#include "FL/Fl.H"
#include "FL/Fl_Window.H"
#include "FL/Fl_Box.H"
#include "FL/Fl_Input.H"
#include "FL/Fl_Button.H"

class MyWindow : public Fl_Window
{
public:
	MyWindow(int w, int h, const char* title) : Fl_Window(w, h, title)
	{}

	void init()
	{
		std::cout << "MyWindow init" << std::endl;

		// ui
		begin();

		color(FL_DARK3);

		int y = 10;
		s_input = new Fl_Input(150, y, 100, 20, "Number:");
		s_input->static_value(s_num_str.c_str()); // set init text

		y += 30;
		Fl_Button* add_button = new Fl_Button(150, y, 60, 30, "Add Num");
		resizable(add_button);
		add_button->callback(handleAddButtonClick);

		end();
	}

	static void handleAddButtonClick(Fl_Widget* widget, void* v)
	{
		std::cout << "MyWindow handleAddButtonClick" << std::endl;

		// update text
		int num = atoi(s_num_str.c_str());
		num++;
		s_num_str = std::to_string(num);

		std::cout << "add num to " << num << std::endl;
		s_input->static_value(s_num_str.c_str());
		s_input->redraw();
	}

private:
	static Fl_Input* s_input;
	static std::string s_num_str;
};

Fl_Input* MyWindow::s_input = nullptr;
std::string MyWindow::s_num_str = "0";

#include <string>
#include <algorithm>

int main(int argc, char** argv)
{

	MyWindow* my_window = new MyWindow(400, 300, "MyWindow");
	my_window->init();
	my_window->show();

	return Fl::run();
}

其中

  • cmake配置里面需要增加编译选项,可以避免界面启动后弹出控制台黑框,如果作为debug阶段可以保留
  • 控件绑定的回调函数必须是全局或者静态函数

效果
在这里插入图片描述
源码
https://download.csdn.net/download/u012234115/87878308

Logo

更多推荐