FLTK学习笔记2-回调函数

article/2025/9/1 12:11:05

FLTK学习笔记2-回调函数

    • 回调函数
    • 为控件添加回调函数
    • 程序示例

回调函数

回调函数(Callback)简单说来就是一个以函数指针的方式被调用的函数。

考虑如下情况,我们编写了一个整数排序算法函数mySort

void mySort(std::vector<int>& v);

这个函数能够让vector里面的数由小到大排列。但是我们希望这个函数能够支持一些其它规则,例如让数字按绝对值由小到大排列,因此我们可以编写以下函数:

void mySort(std::vector<int>& v, bool (*pFun)(int, int));
bool smaller(int i1, int i2);
bool smallerAbs(int i1, int i2);

其中bool (*pFun)(int, int))是一个指向返回值bool,参数为两个int的函数指针,smallersmallerAbs分别是两种排序规则的实现函数,于是mySort函数就可以用以下方式在两种规则之间进行切换:

mySort(v, smaller);			/* 用smaller规则排序 */
mySort(v, smallerAbs);		/* 用smallerAbs规则排序 */

为控件添加回调函数

FLTK中通过回调函数来响应控件的事件(比如按钮被点击)。

FLTK中的回调函数的定义如以下形式:

void widget_cb(Fl_Widget* pw, void* pv);

其返回类型为void,参数有两个,一个是指向Fl_Widget类型的指针pw,另一个是指向void类型的指针pv。

类型Fl_Widget是所有控件类型的基类,pw实际上是指向调用回调函数的控件。例如,一个按钮pButton1被点击后调用回调函数button1_cb,其回调函数的第一个参数pw就是指向pButton1的指针。

第二个参数pv是要传给回调函数的额外数据。例如,要实现一个点击后改变另一个控件pBox上文字的按钮pButton1,可以在定义回调函数时将指向控件pBox的指针作为第二个参数。

代码示例:

void button1_cb(Fl_Widget* w, void* p){Fl_Button* o1 = (Fl_Button*)w;						/* 将Fl_Widget*类型转换为Fl_Button*类型,以调用value方法 */o1->value(o1->value()?0:1);w->label(o1->value()?"按钮1的值为1":"按钮1的值为0");Fl_Box* o2 = (Fl_Box*)p;							/* 将void*类型转换为Fl_Box类型以调用label方法 */o2->label("按钮1被点击");
}pButton1->callback(button1_cb, (void*)pBox);

在FLTK中,一种方法往往有两种重载:一种是带参数的,其作用是设置变量的值,例如value(1)Fl_Button中私有变量value_的值设为1;另一种是没有参数的,其作用是获取变量的值,例如value()将返回私有变量value_的值。其函数原型如下:

int value(int v);
char value() const {return value_;}

回调函数的注意要点

  • 类内定义回调方法时要将回调函数设为静态方法,否则会编译报错。具体解释见这里。
  • 在回调函数中要将传入参数进行类型转换以调用其具体控件相关的方法

程序示例

下面程序创建了一个标签以及三个按钮,前两个按钮点击后将会改变自身文字以及标签上的文字,第三个按钮点击后退出程序。

#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Box.H>void button1_cb(Fl_Widget* w, void* p){Fl_Button* o1 = (Fl_Button*)w;o1->value(o1->value()?0:1);w->label(o1->value()?"按钮1的值为1":"按钮1的值为0");Fl_Box* o2 = (Fl_Box*)p;o2->label("按钮1被点击");
}
void button2_cb(Fl_Widget* w, void* p){Fl_Button* o1 = (Fl_Button*)w;o1->value(o1->value()?0:1);w->label(o1->value()?"按钮2的值为1":"按钮2的值为0");Fl_Box* o2 = (Fl_Box*)p;o2->label("按钮2被点击");
}
void quit_cb(Fl_Widget* w, void* p){exit(0);
}int main(){Fl_Double_Window window(390, 180, "回调函数");Fl_Box* pBox = new Fl_Box(50, 50, 290, 50, "没有按钮被点击");Fl_Button* pButton1 = new Fl_Button(50, 120, 100, 30, "按钮1");Fl_Button* pButton2 = new Fl_Button(170, 120, 100, 30, "按钮2");Fl_Button* pQuitButton = new Fl_Button(290, 120, 50, 30, "退出");pButton1->callback(button1_cb, (void*)pBox);pButton2->callback(button2_cb, (void*)pBox);pQuitButton->callback(quit_cb, nullptr);window.end();window.show();return Fl::run();
}

这里注意在编译的时候记得加上-lfltk命令(在MSYS2上还要加上-mwindows -DWIN32 -lole32 -luuid -lcomctl32)。

运行结果:
回调函数

相关链接:
专栏:FLTK
FLTK学习笔记1-绘制基本控件(按钮、文本输入、容器)
FLTK学习笔记3-随机点名器


http://chatgpt.dhexx.cn/article/fbK8k2HL.shtml

相关文章

rust 使用fltk 的小问题

rust 使用fltk 的小问题 windowns下进行编译使用cargo build --release 打包出现以下问题 最近有需求写一个简单的桌面应用程序&#xff0c;正好使用rust来练练手&#xff0c;中间碰到一些问题&#xff0c;尤其fltk 打包有个cmd黑框就很恶心。只记录一些国内网络上资料较少的问…

gmsh+fltk配置过程

本文主要讲解如何利用cmake进行配置带图形界面的gmsh,因为gmsh给出的qt范例只有简单的显示功能&#xff0c;而对 fltk中编写了较完整的功能&#xff0c;所以利用fltk进行说明&#xff0c;如需qt可参考链接。本文使用的编译器是vs2019 首先为了编译成功gmsh软件&#xff0c;我们…

FLTK学习笔记1-绘制基本控件(按钮、文本输入、容器)

FLTK学习笔记1-绘制基本控件&#xff08;按钮、文本输入、容器&#xff09; FLTK中的坐标FLTK常用控件按钮控件文本控件容器控件 绘制基本控件 FLTK中的坐标 在FLTK中坐标均为正整数&#xff0c;其单位是像素&#xff08;pixel&#xff09;&#xff0c;原点&#xff08;x0, y0…

FLTK中的字体

FLTK中的字体 字体在FLTK中的表示获取系统的字体编号表程序示例 字体在FLTK中的表示 在FLTK中&#xff0c;系统中的每一种字体都对应着一个整数类型(严格来讲是Fl_Font类型&#xff0c;但Fl_Font本身就是int的别名)的字体编号。例如&#xff0c;在本人的系统中“楷体”所对应的…

FLTK学习笔记4-在FLTK中显示图片(上)

FLTK学习笔记4-在FLTK中显示图片&#xff08;上&#xff09; Fl_JPEG_Image和Fl_PNG_ImageFl_Shared_Image程序示例 在FLTK中&#xff0c;并不是任何时候都可以绘图的&#xff08;当然也包括绘制图片&#xff09;&#xff0c;一般来讲我们只能在控件类中的 draw()方法中绘制所…

C++轻量级跨平台桌面GUI库FLTK的简单使用

C的跨平台桌面GUI库有很多&#xff0c;大体上分成两种流派&#xff1a;retained mode和immediate mode。 其中前者是主流的桌面GUI机制框架&#xff0c;包括&#xff1a;Qt、wxwidgets、gtk、juce等后者是一些游戏引擎编辑器常用的GUI机制框架&#xff0c;包括&#xff1a;img…

开源跨平台GUI库Fltk在Deepin Linux下的使用

开源跨平台GUI库Fltk在Deepin Linux下的使用 前言一、下载安装二、样例使用三、自编代码四、后记 前言 在互联网应用漫天的现在&#xff0c;实体企业、工厂却绕不开大量的桌面应用&#xff0c;开发工具有恐龙C#&#xff0c;有难用的MFC&#xff0c;也有没落的Delphi&#xff0…

Ubuntu安装FLTK详细过程

1.官网下载源码压缩包。版本建议最新&#xff0c;我这里的版本是1.3.8 2. 终端输入&#xff1a;sudo apt-get install build-essential xorg-dev libx11-dev libcairo2-dev //此步骤必要&#xff01;&#xff01;&#xff01;安装依赖库&#xff0c;不然后面安装总会出错&#…

[Rust GUI]fltk-rs的helloworld

1、安装VSCode 下载安装VSCode 安装VSCode扩展 rust-analyzer或rust-analyzer(CN) 2、安装Microsoft C 生成工具 访问微软官网下载生成工具&#xff0c;勾选使用 C 的桌面开发之后会自动勾选5个项目 取消勾选以下项目 用于 Windows 的 C CMake 工具 测试工具核心功能 - 生成…

使用CLion配置第一个FLTK界面

文章目录 写在前面安装与配置安装helloworld配置命令行配置CLion 运行结果 写在前面 假期抽时间学习一下跨平台GUI界面的开发, 正好也当做C的练手小项目了. C标准库中没有对于GUI的支持, 需要依赖三方库, 这里我先想到的是老牌跨平台GUI——Qt, 但是作为一个小项目感觉使用Qt有…

FLTK-Rs 2

Trees 树形结构&#xff0c;允许在树中显示项目&#xff0c;使用add方法发添加条目 use fltk::{prelude::*, *}; use fltk::enums::FrameType;fn main() {let a celet mut win window::Window::default().with_size(400, 300);let mut tree tree::Tree::new(5,5,390,290,&…

FLTK的UI设计工具FLUID使用方法总结

tags: FLTK C GUI 写在前面 终于又捡起来FLTK了, 先来看看怎么通过FLUID创建一个图形界面并完成回调函数的创建, 参考的是官方教程中关于创建一个CubeView程序的例子, 教程里面很多都与最新版本的FLTK界面不太一致, 但是通过我的摸索还是找出了方法. 下面来分享一下. 创建类…

fltk和glog在mac下的安装与编译

glog 根据官方文档安装即可 https://github.com/google/glog % git clone https://github.com/google/glog.git % cd glog % cmake -S . -B build -G "Unix Makefiles" //这句含义未知 % cmake --build build安装完后可以去/usr/local目录下查看是否有对应的头文件…

c语言fltk图形库,FLTK编程模型

2003 年 5 月 10 日 FLTK(Fast Light Tool Kit 发音为fulltick) 是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性…

FLTK-Rs

终于还是到这一步了&#xff0c;可视化&#xff0c;我的超人&#xff01; FLTK是一个跨平台的轻量级 gui 库。该库本身是用 C98 编写的&#xff0c;具有很高的可移植性。fltk crate 是用 Rust 编写的&#xff0c;并使用 FFI 调用 FLTK 包装器cfltk&#xff0c;它是用 C89 和 C…

Visual Studio 安装 FLTK

Visual Studio 安装 FLTK 环境介绍 Windows 10Visual Studio Community 2019 (2021-11-29补充2022版)FLTK-1.3.7 下载与解压 ​ 进入FLTK官网-Download下载最新版本。 ​ 解压到D:\Program Files\fltk(解压路径任意都行)&#xff0c;推荐使用Bandzip免费解压工具。 编译 …

FLTK--轻量级C++跨平台GUI库

FLTK FLTK&#xff08;Fast Light Toolkit&#xff09;是一个跨平台的CGUI工具集&#xff0c;用在UNIX/Linux&#xff08;X11&#xff09;、微软Windows和Mac OS X上。FLTK提供现代的GUI功能&#xff0c;除却膨胀&#xff0c;通过OpenGL和内建的GLUT模拟器提供3D图形支持。最初…

浅谈如何fltk项目编译和实现显示中文

目录 一、编译 二、中文显示如何处理&#xff1a; 2.1在发文2天前突然发现&#xff0c;我这个界面显示英文出现问题了&#xff0c;开始我的搜索之旅&#xff0c;一些参考页面有碰到问题也可以看看&#xff1a; 2.2、 那就开始翻翻官方自带的例程吧&#xff0c;看看他如何显…

FLTK 学习一:简介和安装

文章目录 FLTK 简介FLTK 安装FLTK Windows安装FLTK Linux 安装 FLTK 简单示例参考资料 FLTK 简介 从网上引用的一段 FLTK 的介绍 FLTK (Fast Light Tool Kit 发音为fulltick) 是一种使用 C 开发的 GUI 工具包&#xff0c;它可以应用于 Unix, Linux, MS-Windows95/98/NT/2000 和…

安装使用FLTK图形库

FLTK是Fast Light Toolkit的简称&#xff0c;是一个跨平台的C GUI包&#xff0c;FLTK提供xiandai GUI功能&#xff0c;而且通过OpenGL支持3D图像。 下载FLTK安转包fltk-1.3.4-1-source.tar.gz&#xff1a; http://www.fltk.org/software.php?VERSION1.3.4&FILEfltk/1.3.…