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

news/2024/11/24 8:03:24/

        

目录

一、编译

二、中文显示如何处理:

2.1在发文2天前突然发现,我这个界面显示英文出现问题了,开始我的搜索之旅,一些参考页面有碰到问题也可以看看:

2.2、 那就开始翻翻官方自带的例程吧,看看他如何显示的吧,能够解决显示问题的方案之一我翻到了测试程序如图:

三、决定要放弃使用FLTK这个开源项目的时候:

3.1、通过2-3天的测试研究后决定放弃这个项目。

3.2、完美解决这windows下开发中文软件的终极方法通过多日艰苦搜寻总算有眉目了过程如下:

3、终极武器,编译器入手。也是本文重点和最终解决方案:


笔者最近准备做一个vs下开发c++工程,界面开发一直是我不太理想的弱项,本着造轮子不如找轮子的精神,为了向那些开源的大牛们学习一下技术,搜了下网上综合考虑了下准备使用ftlk开源项目作为界面编写的组件。

        过程中充满了曲折,我太低估了编译fltk项目的难度,以为vs建一个空项目把源码拉进去哗哗修改一下库包含文件关系或设置路径即可集成入自己项目,结果折腾了1周编译无数错误排除掉了,在链接那边还是各种问题。还是老老实实的按说明书编译一个lib文件来用。先说说编译的步骤和注意要点。

一、编译

1、前往fltk官方网页下载一个最新版本的fltk源码程序,本文写作之时最新的库发行版本号是1.3.8官方下载的地址是:Download - Fast Light Toolkit (FLTK)

1.3.8版本是发行版本,(注意:后续fltk-1.4.x-20230526-4c057c57是最新版本没有提供vs下的工程要自己通过cmake建立一下,https://download.csdn.net/download/lyfwwb/87835107,放在fltk-1.4代码包中即可环境我用vs2017,源码包请自行到官网下载后解压出来,将我的工程文件下载下来解压到FLTK-1.4.x目录中找到.sln文件打开就可以了)。有需要用的朋友也通过上面链接或百度等其他方式下载到源码。解压后得到一个fltk-1.3.8的源码目录。就是我们要项目了,找到flt-1.3.8目录下ide\VisualC2010目录找到fltk.sln用你的vs打开升级后编译就可以了默认只有win32模式没有64位的模式,有需要的朋友可以自行配置。

一些例子的图片也出来了:如下

 

 

 满心欢喜开始开发之旅。就着这些例子写写需要的程序应该没有什么问题。

二、中文显示如何处理:

2.1在发文2天前突然发现,我这个界面显示英文出现问题了,开始我的搜索之旅,一些参考页面有碰到问题也可以看看:

FLTK 1.3中使用中文_fltk 中文_thy38的博客-CSDN博客

如何巧妙解决FLTK不支持中文字符的问题_百度知道

等等看了不少也没有解决我的问题,始终显示如下:

2.2、 那就开始翻翻官方自带的例程吧,看看他如何显示的吧,能够解决显示问题的方案之一我翻到了测试程序如图:

可爱的中文显示出来了,我们看看源码如下:


int main(int argc, char** argv)
{int l;const char *latin1 = "\x41\x42\x43\x61\x62\x63\xe0\xe8\xe9\xef\xe2\xee\xf6\xfc\xe3\x31\x32\x33";char *utf8 = (char*) malloc(strlen(latin1) * 5 + 1);l = 0;//	l = fl_latin12utf((const unsigned char*)latin1, strlen(latin1), utf8);l = fl_utf8froma(utf8, (strlen(latin1) * 5 + 1), latin1, strlen(latin1));make_font_chooser();extra_font = FL_TIMES_BOLD_ITALIC;/* setup the extra font */Fl::set_font(extra_font,
#ifdef WIN32" Arial Unicode MS"
#elif defined(__APPLE__)"Monaco"
#else"-*-*-*-*-*-*-*-*-*-*-*-*-iso10646-1"
#endif);main_win = new Fl_Double_Window (200 + 5*75, 400, "Unicode Display Test");main_win->begin();Fl_Input i1(5, 5, 190, 25);utf8[l] = '\0';i1.value(utf8);Fl_Scroll scroll(200,0,5 * 75,400);int off = 2;int end_list = 0x10000 / 16;if (argc > 1) {off = (int)strtoul(argv[1], NULL, 0);end_list = off + 0x10000;off /= 16;end_list /= 16;}argc = 1;for (long y = off; y < end_list; y++) {int o = 0;char bu[25]; // index labelchar buf[16 * 6]; // utf8 textint i = 16 * y;for (int x = 0; x < 16; x++) {int l;l = fl_utf8encode(i, buf + o);if (l < 1) l = 1;o += l;i++;}buf[o] = '\0';sprintf(bu, "0x%06lX", y * 16);Fl_Input *b = new Fl_Input(200,(y-off)*25,80,25);b->textfont(FL_COURIER);b->value(strdup(bu));b = new Fl_Input(280,(y-off)*25,380,25);b->textfont(extra_font);b->value(strdup(buf));}scroll.end();main_win->resizable(scroll);thescroll = &scroll;char *utf8l = (char*) malloc(strlen(utf8) * 3 + 1);Fl_Input i2(5, 35, 190, 25);l = fl_utf_tolower((const unsigned char*)utf8, l, utf8l);utf8l[l] = '\0';i2.value(utf8l);char *utf8u = (char*) malloc(strlen(utf8l) * 3 + 1);Fl_Input i3(5, 65, 190, 25);l = fl_utf_toupper((const unsigned char*)utf8l, l, utf8u);utf8u[l] = '\0';i3.value(utf8u);const char *ltr_txt = "\\->e\xCC\x82=\xC3\xAA";Fl_Input i4(5, 90, 190, 25);i4.value(ltr_txt);i4.textfont(extra_font);wchar_t r_to_l_txt[] = {/*8238,*/ 1610, 1608, 1606, 1604, 1603, 1608, 1583, 0};char abuf[40];//  l = fl_unicode2utf(r_to_l_txt, 8, abuf);l = fl_utf8fromwc(abuf, 40, r_to_l_txt, 8);abuf[l] = 0;right_left_input i5(5, 115, 190, 50);i5.textfont(extra_font);i5.textsize(30);i5.value(abuf);Fl_Input i7(5, 230, 190, 25);Fl_Input i8(5, 260, 190, 25);i7.callback(i7_cb, &i8);i7.textsize(20);i7.value(abuf);i7.when(FL_WHEN_CHANGED);wchar_t r_to_l_txt1[] = { /*8238,*/ 1610, 0x20, 1608, 0x20, 1606, 0x20,  1604, 0x20, 1603, 0x20, 1608, 0x20, 1583, 0};//  l = fl_unicode2utf(r_to_l_txt1, 14, abuf);l = fl_utf8fromwc(abuf, 40, r_to_l_txt1, 14);abuf[l] = 0;right_left_input i6(5, 175, 190, 50);i6.textfont(extra_font);i6.textsize(30);i6.value(abuf);// Now try Greg Ercolano's Japanese test sequence// SOME JAPANESE UTF-8 TEXTconst char *utfstr = "\xe4\xbd\x95\xe3\x82\x82\xe8\xa1""\x8c\xe3\x82\x8b\xe3\x80\x82"; UCharDropBox db(5, 300, 190, 30);db.textsize(16);db.value("unichar drop box");Fl_Output o9(5, 330, 190, 45);o9.textfont(extra_font);o9.textsize(30);o9.value(utfstr);main_win->end();main_win->callback((Fl_Callback*)cb_exit);fl_set_status(0, 370, 100, 30);main_win->show(argc,argv);fnt_chooser_win->show();int ret = Fl::run();// Free up the sizes arrays we allocatedif(numsizes) {delete [] numsizes;}if(sizes) {delete [] sizes;}return ret;
}

看样子能解决问题,找出自己的编码写进去就可以了吧,管方例程未做修改,好了我们在这段代码中应该就提取出来的代码,自己修改修改可以搞定了。做到这边我基本上就要决定要么封装一下自己的函数,要么就放弃这开源项目,另外找一个诸如QT这样的强大库来使用的状态。

  有耐心的朋友可以抠一下以下代码应该有所收获:(上面代码段抄出来)

int off = 2;int end_list = 0x10000 / 16;if (argc > 1) {off = (int)strtoul(argv[1], NULL, 0);end_list = off + 0x10000;off /= 16;end_list /= 16;}argc = 1;for (long y = off; y < end_list; y++) {int o = 0;char bu[25]; // index labelchar buf[16 * 6]; // utf8 textint i = 16 * y;for (int x = 0; x < 16; x++) {int l;l = fl_utf8encode(i, buf + o);if (l < 1) l = 1;o += l;i++;}buf[o] = '\0';sprintf(bu, "0x%06lX", y * 16);Fl_Input *b = new Fl_Input(200,(y-off)*25,80,25);b->textfont(FL_COURIER);b->value(strdup(bu));b = new Fl_Input(280,(y-off)*25,380,25);b->textfont(extra_font);b->value(strdup(buf));}scroll.end();

三、决定要放弃使用FLTK这个开源项目的时候:

3.1、通过2-3天的测试研究后决定放弃这个项目。

        不错,10多天的研究一无所获,编译一周解决问题没有什么好说的,开源项目基本上多多少少碰到首次编译问题,浪费就浪费了,毕竟官方给出的方案也是不强改没有问题,老老实实按官方步骤可保无虞。现在是中文的程序开发界面显示出现比较大难题,放弃也属正常。

又开始我在网上查找的新旅程,一番查找一无所获。没有找到我想要的理想的界面库估计和知识面有关。哀叹自己的知识能力不足时,心里也挺纠结。反复研究是否有突破。

3.2、完美解决这windows下开发中文软件的终极方法通过多日艰苦搜寻总算有眉目了过程如下:

1、首先是不断通过搜索引擎查找相关文章看看是否提供相关的灵感。结果让我失望了。强大的搜索引擎也有不找不到的时候。谷歌没法上不知道结果。

2、翻看fltk测试程序例子。无果。

3、终极武器,编译器入手。也是本文重点和最终解决方案:

(1)、通过反复测试和编写查找相关文档最后完美的解决中文输出问题的就是一条编译指令:

#pragma execution_character_set("utf-8")

如果出现编译错误是下图C3437错误那么就是否检查了第2个方式设置过了,就不需要这行代码了。

(2)、在工程中属性中编译选项中设置如图在FLTK1.4.X版本也已经设置好了,自己建立工程时候可以参考:

 至此我们的fltk工程就可以在windows下编程正确显示中文了。值此文章献给需要fltk工程又碰到类似难题的编程朋友。对您有用不妨点个赞再走。


http://www.ppmy.cn/news/99458.html

相关文章

为建筑物的供暖系统实施MPC控制器的小型项目(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

learnOpenGL-深度测试

深度测试&#xff1a;OpenGL将一个片段的深度值与深度缓冲的内容进行对比。执行一个深度测试&#xff0c;测试通过则深度缓冲将会更新为新的深度值。测试失败则片段被丢弃。 深度测试片段着色器及模版测试之后执行。 片段着色器中内置变量gl_FragCoord的z值即为深度值。 提前深…

Zephyr sem

文章目录 简介互斥同步 数据结构信号量初始化Z_SEM_INITIALIZERint k_sem_init (struct k_sem *sem, unsigned int initial_count, unsigned int limit) 获取信号量int k_sem_take(struct k_sem *sem, k_timeout_t timeout) 释放信号量void k_sem_give(struct k_sem *sem) 获取…

Java学习笔记20——常用API

常用API 常用APIMath类Math的常用方法 System类System类常用方法 Object类Object类常用方法 Arrays类Arrays常用方法 基本类型包装类Integer类的概述和使用int和String的相互转换自动装箱和拆箱 日期类Date类Date类的常用方法 SimpleDateFormat类SimpleDateFormat的构造方法Sim…

Java输入输出流

目录 一、数据流概念 1.输入输出的概念​ 2.流的概念 3.流的操作 二、常用的流分类 三、文件输入输出流 1.FileReader和FileWriter 2.FileInputStream和FileOutStream 四、复制文件 一、数据流概念 1.输入输出的概念​ 输入输出技术用于处理设备之间的数据传输&#x…

【数据库复习】第六章 关系数据理论 1

关系模式的设计 按照一定的原则从数量众多而又相互关联的数据中&#xff0c;构造出一组既能较好地反映现实世界&#xff0c;而又有良好的操作性能的关系模式 ●冗余度高 ●修改困难 ●插入问题 ●删除问题 ★产生问题的原因 属性间约束关系&#xff08;即数据间的依赖关系&…

dpdk ip分片报文重组处理

dpdk ip报文重组及分片API及处理逻辑介绍 DPDK的分片和重组实现零拷贝&#xff0c;详细介绍可以参阅DPDK分片与重组用户手则 相关数据结构 /** Fragmented packet to reassemble.* First two entries in the frags[] array are for the last and first fragments.*/ struct …

Doris----Rollup表分析及案例实现

ROLLUP 在多维分析中是“上卷”的意思&#xff0c;即将数据按某种指定的粒度进行进一步聚合。 之前的聚合模型: 用户id数据插入时间城市年龄性别最后一次访问的时间该用户的总消费额该用户的最大停留时长该用户的最小停留时长100002017/10/2北京1002017/10/02 08:00:00651521…