目录
一、编译
二、中文显示如何处理:
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工程又碰到类似难题的编程朋友。对您有用不妨点个赞再走。