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

news2025/1/11 4:26:44

        

目录

一、编译

二、中文显示如何处理:

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 label
    char buf[16 * 6]; // utf8 text
    int 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 TEXT
  const 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 allocated
  if(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 label
    char buf[16 * 6]; // utf8 text
    int 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.coloradmin.cn/o/580635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Join的连接原理

1. 连接简介 1.1 连接的本质 连接就是把各个表中的记录都取出来进行一次匹配&#xff0c;并把匹配后的组合发送给客户端。如果连接查询中的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合&#xff0c;那么这样的结果集就可以称为笛卡尔积。 1.2 连…

计算机网络基础知识(七)—— 什么是HTTPS协议?你听我“瞎掰”

文章目录 01 | 工作原理02 | SSL/TLS协议2.1 | 握手协议2.2 | 更换密码协议&#xff08;Change Cipher Spec Protocol&#xff09;2.3 | 警告协议&#xff08;Alert Protocol&#xff09;2.4 | 应用数据协议&#xff08;Application Data Protocol&#xff09; 03 | 加密算法3.…

CSRF及SSRF漏洞案例讲解(29)

讲解一下这个图片&#xff0c;用户在浏览器登陆银行界面发送一个请求&#xff0c;通过转账&#xff0c;转载的数据包假如是下面那串字符&#xff0c;黑客呢就自己一个网站或控制一个网站&#xff0c;去写入一个代码&#xff0c;这个代码就是请求这个数据包&#xff0c;刚好这个…

人工智能学习07--pytorch19--目标检测:常见指标(mAP计算+coco评价标准)

怎样才算正确检测到一个目标&#xff1f; 什么是IOU&#xff1a; https://blog.csdn.net/qq_51831335/article/details/125719420 mAP计算方法&#xff1a; 假设针对某一类别的AP情况 TP&#xff1a;预测正确的边界框个数。预测边界框与GT-box的IOU>0.5 FP&#xff1a;假…

原工程运行正常,重新复制一份后再 npm install 后再运行就报错的解决办法

原工程&#xff0c;运行正常 将刚刚的工程复制一份呢&#xff0c;重新 npm install 再 npm run serve 就报错 出现这个问题十之八九都是依赖的问题。有可能是因为这个工程里面之前安装过一些东西&#xff0c;后来莫名其妙的就把 package.json 里面相关的依赖给删掉了。但由于原…

lwIP 开发指南

目录 lwIP 初探TCP/IP 协议栈是什么TCP/IP 协议栈架构TCP/IP 协议栈的封包和拆包 lwIP 简介lwIP 源码下载lwIP 文件说明 MAC 内核简介PHY 芯片介绍YT8512C 简介LAN8720A 简介 以太网接入MCU 方案 lwIP 无操作系统移植lwIP 带操作系统移植ARP 协议ARP 协议的简介ARP 协议的工作流…

uni-app项目运行和项目结构目录讲解

UNI-APP学习系列 uni-app项目运行和项目结构目录讲解 文章目录 UNI-APP学习系列前言总结 前言 UNI-APP学习系列之uni-app项目运行和项目结构目录讲解 运行项目 使用 pnpm 包管理工具 # 查看是否安装pnpmpnpm -v# 无则安装npm install -g pnpm下载依赖 pnpm i运行pnpm dev:h…

Window的创建

Window的创建 上一篇说到了Window和WindowManager的关系并且讲述了WindowManager如何添加Window与Window内部的三个方法的实现 这篇主要讲几个常见的Window的创建比如Activity,Dialog和Toast 其中Activity属于应用Window Dialog属于子Window Toast属于系统Window z-order…

python基础知识(二):变量和常用数据类型

目录 1. 变量1.1 变量的定义1.2 变量的命名规则 2. 常用数据类型2.1 字符串2.1.1 字符串的常用方法2.1.1.1 title()方法&#xff1a;将字符串中的单词首字母大写2.1.1.2 upper()方法&#xff1a;将字符串中的单词字母全大写2.1.1.3 lower()方法&#xff1a;将字符串中的单词字母…

什么是分段路由?如何在网络中实施分段路由?

在计算机网络中&#xff0c;分段路由&#xff08;Subnetting&#xff09;是一种将一个大的网络划分为多个较小子网的技术。它允许网络管理员更有效地分配 IP 地址和管理网络流量。本文将详细介绍分段路由的概念、原理以及如何在网络中实施分段路由。 1. 分段路由的概念 分段路…

【深入浅出Spring Security(一)】Spring Security的整体架构

Spring Security的整体架构 一、整体架构认证&#xff08;Authentication&#xff09;AuthenticationManagerAuthentication登录后的数据保存&#xff08;SecurityContextHolder&#xff09; 授权&#xff08;Authorization&#xff09;ConfigAttribute 二、总结 这篇博客所述主…

CISCN 2023 初赛 pwn——Shellwego 题解

这是一个用go语言写的elf程序&#xff0c;没有PIE。这也是本蒟蒻第一次解go pwn题&#xff0c;故在此记录以便参考。 而且&#xff0c;这还是一个全部符号表被抠的go elf&#xff0c;直接面对一堆不知名的函数实在有些应付不来&#xff0c;因此在比赛时委托逆向的队友把符号表…

2023/5/28总结

static static:静态&#xff0c;可以修饰成员方法&#xff0c;成员变量。&#xff08;是所有成员共享的&#xff09; static修饰的特点&#xff1a; 被类的所有对象共享&#xff08;判断是否使用静态关键字的条件&#xff09;可以通过类名和对象名调用在定义对象时&#xff0c;…

图【数据结构】

目录 一、图的定义和基本术语 二、图的类型定义 三、图的存储结构 1、数组&#xff08;邻接矩阵&#xff09;表示法 二、邻接表&#xff08;链式&#xff09;表示法 三、图的邻接表的存储表示 四、十字链表与邻接多重链表 &#xff08;1&#xff09;十字链表 &#xff…

113.删除有序数组中的重复项 removeDuplicatesFromSortedArray

文章目录 题目描述解题思路代码详解运行截图 题目描述 题目链接 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元…

Java中ReentrantLock的概念深入理解

ReentrantLock和Synchronized的区别 核心区别 ReentrantLock是一个类&#xff0c;Synchronized是Java中的一个关键字。 两者都是JVM层面实现互斥锁的方式 效率区别 线程竞争激烈推荐使用ReentrantLock去实现&#xff0c;不存在锁竞争观念&#xff1b; Synchronized是存在锁升…

大数据Doris(二十九):Broker Load导入HDFS csv 格式数据并提取文件路径中的分区字段

文章目录 Broker Load导入HDFS csv 格式数据并提取文件路径中的分区字段 一、创建Doris表 二、准备HDFS数据<

蚁群算法(解决TSP问题)

一、概述 蚂蚁在寻找食物源时&#xff0c;会在其经过的路径上释放一种信息素&#xff0c;并能够感知其它蚂蚁释放的信息素。信息素浓度的大小表征到食物源路径的远近&#xff0c;信息素浓度越高&#xff0c;表示对应的路径距离越短。通常&#xff0c;蚂蚁会以较大的概率优先…

chatgpt赋能python:Python文件复制粘贴到另一个目录

Python文件复制粘贴到另一个目录 Python是一种通用编程语言&#xff0c;可用于各种任务&#xff0c;包括文件复制和移动。在本文中&#xff0c;我们将探讨Python中的文件复制粘贴到另一个目录。 为什么要使用Python进行文件复制粘贴&#xff1f; Python提供了强大的文件处理…

case when用法

case when的基本使用&#xff1a; Case when 的用法: 一旦满足了某一个WHEN, 则这一条数据就会退出CASE WHEN , 而不再考虑 其他CASE。 Case when 的用法 -- -搜索Case函数: Case函数(Case搜索函数): 判断表达式的真假,如果为真,返回结果;如果为假,返回else值;如果未定义el…