找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: zzz19760225

请问,C语言读取文本文件,获取特定字符串,作为鼠标点击按钮?

[复制链接]
 楼主| 发表于 2024-12-30 08:35:54 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-1-1 09:10 编辑

vbs的变量
vbs的变量之间联系线
组合穷尽地图
地图上的路线选择
输入文本的内容载入变量
文本故事剧本剧情初期运行载入内存里运行



变量=字符串(指代编码赋值)‘指代编码交换为数量和内容,没有赋值无法运行
变量=字符变量+字符变量
变量字符串组合聚散

  1. dim a,b,c
  2. b=b456
  3. c=c789
  4. a=b+c
  5. msgbox a
复制代码
结果输出0


不需要数值的字符串变量,组成结构关系后,然后二次赋值为数值,数量流量运行。一次抽象变量结构运行,二次数值流量运行。
b=b
c=c
b456=b456
c789=c789
变量等于自身就可以简单抽象化
但是不对啊,要将文字装进变量的,这样字符串都不显示了。字符串要加引号“”赋值。
b456="b456"
c789="c789"

  1. dim a,b,c
  2. b456="b456"
  3. c789="c789"
  4. a=b+c
  5. msgbox a
  6. msgbox b456
  7. msgbox c789
复制代码
三次输出

如果什么都不赋值呢?
b=
c=
a=b+c

  1. dim a,b,c
  2. b456=
  3. c789=
  4. a=b+c
  5. msgbox a
  6. msgbox b456
  7. msgbox c789
复制代码
报出错,无法运行。

将一个文本内容,代入变量容器单元?

人生生命实在,在一个假设一部分的模拟现实游戏中,进行各种不需要实际实物的游戏熟悉选择。选择里无善无恶和有善有恶,最终人生只有一次考核自由自选,只是多增加一些机动灵活的玩意玩具玩笑,放松面对而已。人生任何时候,你愿意面对生之存在和未知的活吗?我已有所准备,练习游戏百遍,我期待周期实践已知和未知,验证游戏所学。(或者一年一个学习实践的循环周期)
利用通用规律,将未来一个周期(看棋局三步棋的一步),琢磨其中的内容一部分,考古侦探一样,在实践中肯定这部分。这部分成为可流通内容,相对固定下来,再继续寻找可探测未来周期的内容。所谓历史周期律,只是破坏循环至一种叠加重压的债务病局,然后绝对化。而实际人类是可知流组合(为主或比例度),是可知可行可见的(从小到大,从单到多,从少到多,从具体一到抽象宏观广义一),可以看到看法清楚明白,这些是他们将组织失败责任摆脱的一种方式,神化唯心化。建立物质,万物,人为主方向,所谓钱,币,都是一种形式绝对化的假象当作眼镜,一切原本简单(也得透过已有惯性形式,把简化的组织结构找出来,以及简化也有极简的形式,必要形式是什么)。

百度“vbs读取文本输出”

  1. Dim fso, f, text
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set f = fso.OpenTextFile("C:\path\to\your\file.txt", 1) ' 1 表示只读模式

  4. text = f.ReadAll
  5. WScript.Echo text

  6. f.Close
  7. Set f = Nothing
  8. Set fso = Nothing
复制代码
修改文本地址“D:\dos\vbs\1.txt”
可以输出

  1. Dim fso, f, text
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set f = fso.OpenTextFile("1.txt", 1) ' 1 表示只读模式
  4. text123 = f.ReadAll
  5. f.Close
  6. Set f = Nothing
  7. Set fso = Nothing

  8. WScript.Echo text123
复制代码
直接文本,变量后置,也是可以的。目的是文本内容装进变量,而文本的位置是一个空壳类存在(相对地址),只要放在同一文件夹容器里就可以,不需要具体的地址路径指示。

如将一个文件夹里的文件,批量搜素,对应变量批量载入变量呢。这些批量工作做完,是搭配变量单元的组合关系。字符替换,交换翻译。
人生的出生和或者的现状,比较衡量为穿越地图的一个圈层级一个阵列。然后通过穿越的地图,进行对比,产生已有相同想法和历史,以及各种类似类近的联系线,作为参考选择,丰富想法库。
孩子模仿家长,孩子模仿他人。书本时代,孩子通过书本丰富。电视时代,孩子通过电视丰富。网络信息时代,通过信息编程游戏地图丰富。这种游戏可以简化,家庭一般普通人,按照事进行组合穷尽,做成游戏,不需要类似私有化的法律,经济等,弄得复杂人不懂,然后别人听话的模式。从基本需求,是可以进行基本编程满足的,类似棋牌的定量,适度丰富就可以。十五亿人的基本够用信息丰富和基本实在自信,是可以站起来的,在舆论制造的舞台上沉不沉默都没有关系。

游戏概念这个集合,包括各种内容组装成游戏软件各种器具体单元(WIN和LINUX各种变量,都可以实现)。

  1. '{
  2. Dim fso, f, text
  3.    '{
  4. Set fso = CreateObject("Scripting.FileSystemObject")
  5. Set f = fso.OpenTextFile("1.txt", 1) ' 1 表示只读模式
  6.      '{
  7. text123 = f.ReadAll
  8.        '}
  9. f.Close
  10.     '}
  11. Set f = Nothing
  12. Set fso = Nothing
  13. '}
  14. WScript.Echo text123
复制代码
在注释里增加相对关系符号,进行切割组合。

假设已有可运行的程序是机器,拆散了装不上去,就再回到初始的机器样子。

微观,中观,宏观的三层面变量单元组合地图,数组对应多个地图。

王族供养,人民家园的家人基本效率供养,善恶和信用,罪恶分别出来的剔除。养十五亿人的一部分和全部比例度,只养一天,年,生的不同可选。有物质养与没有物质养。有物质机动比例数量的养,收入大于支出的有余养。亏损不养。比例养。老幼孕残里的某一个需要,这些里还可以发展轻劳动,村社看顾一下,有事喊一声,通知一下。失业和工作会,工作局,学习工作=投入如何简化已有知识信息的学习方法方式,联系实习,考核等丰富。集中人,集中人使用人的劳动,人的主观主动劳动量,这些流量就是发展的能量。怎么换成模拟钱币,基本原理,钱币就是人生和活的劳动量。劳动能量之外的物质联系包裹,长远劳动的信息技术知识叠加。短近劳动,物质劳动,长远劳动实践经验教训丰富后浓缩传承的技术知识劳动。应该是很多需要劳动的地方,但是客观现实是缺少这种丰富需求。从压住历史经济阵脚的看法,适度的工作量也是对的。但是工作劳动者需求量决定再私有化手里,这是问题的根源,是私有化经济理论的历史效应。怎么将历史公有化工作劳动库的需求,建立成有序的库存规划计划历史阶段和年代的劳动清单。有一种情况,是明明人人都同意简单需要的事,但是就是无法去做和做成,会有更扯皮的人去阻止事完成,这种状态很普遍。在没有好的办法解决前,可以当作是基本出发层面,要习以为常准备专门的一套招式套路,相对简化减轻阻力。正侧两面,一面是利益化包括这些事,这些事是可以换成钱的东西,为了换钱,促进事完成的侧面。另一面是家概念完成家事的正面,在做事的惯性中,安排进去,顺着惯性一并做了。

工业园区的污水化学组合地图,针对申请的排污管道,进行分解化合反应准备,通用管道容器与对应变化的化合内容。楼房顶上的化工气罩,将化学物质内容分类集中起来化合处理。水和气

以化学知识为操作内容,经济园区治理经营的游戏。提出解决办法,做成产品,立项目收钱,一次付款,成本首付加后期利息,分期付款。

批量建立变量和批量对应文本赋值,规律变量名与文本名。

百度“vbs批量建立变量”


  1. Dim i
  2. For i = 1 To 10
  3.     Execute("Dim var" & i)
  4.     Execute("var" & i & " = i")
  5. Next
复制代码
批量建立变量和赋值后,输出变量。

  1. Dim i
  2. For i = 1 To 10
  3.     Execute("Dim a" & i)
  4.     Execute("a" & i & " = i")
  5. Next
  6. msgbox a1
  7. msgbox a10
复制代码
可以的

Execute=执行

读取文本建立的学生信息表,输出文本保存。学生表广义通用化,为生活表。
百度“vbs制作学生信息”

  1. ' 创建一个学生类
  2. Class Student
  3.     Private pName
  4.     Private pAge
  5.     Private pGrade

  6.     ' 构造函数
  7.     Public Sub Class_Initialize
  8.         pName = ""
  9.         pAge = ""
  10.         pGrade = ""
  11.     End Sub

  12.     ' 设置学生信息
  13.     Public Sub SetInfo(name, age, grade)
  14.         pName = name
  15.         pAge = age
  16.         pGrade = grade
  17.     End Sub

  18.     ' 获取学生信息字符串
  19.     Public Function GetInfoString()
  20.         GetInfoString = "Name: " & pName & ", Age: " & pAge & ", Grade: " & pGrade
  21.     End Function
  22. End Class

  23. ' 创建学生对象
  24. Dim student
  25. Set student = New Student

  26. ' 获取用户输入
  27. Dim name, age, grade
  28. name = InputBox("请输入学生姓名:")
  29. age = InputBox("请输入学生年龄:")
  30. grade = InputBox("请输入学生年级:")

  31. ' 设置学生信息
  32. student.SetInfo name, age, grade

  33. ' 将学生信息写入文本文件
  34. Dim fso, textFile
  35. Set fso = CreateObject("Scripting.FileSystemObject")
  36. Set textFile = fso.CreateTextFile("C:\students.txt", True)
  37. textFile.WriteLine student.GetInfoString()
  38. textFile.Close

  39. ' 清理对象
  40. Set textFile = Nothing
  41. Set fso = Nothing
  42. Set student = Nothing

  43. WScript.Echo "学生信息已保存到 C:\students.txt"
复制代码
出错信息“名称重定义”?

排序数字,弄一个背景是格子的图片,伪装成表格底子。上面显示的数字间隔分减号-与加号+,加号代表还有储存起来的数量。
---123--+456--+789
表格里的123数列全部显示,456和789还有隐藏的储存数量。对齐和提示数量。在前面可以有个位数提示,储存的数量有几个位数。
---123-2+456-9+789
---123-2-456-9+789(9位数上面还有位数,就不显示了,至少要这9位用光再说)
---123-2-456-0+789(用0代表十10)
或者用汉字
---123-二-456-十+789
---123-贰-456-拾+789

一段一段依次添加尝试验证可行执行,第二段的student后面加1区别。

  1. Dim student
  2. Set student = New Student
  3. student.SetInfo name, age, grade
  4. textFile.WriteLine student.GetInfoString()
  5. Set student = Nothing
复制代码
一共5个地方student修改为student1,可以顺利运行。

无器本能劳动,天才精英能人有品德者,后天学习劳动,制造用器,器能人民,器能的组织,生活资料需求,人民劳动库,人民资本总量流量,劳动实在与货币钱币的量化交换,物价价格交换率,历史道路阶段年代圈层级人物相对量,几者的关系。(为什么没有一共历史清清楚楚明明白白的表格清单,人人可以通过清单简单看透一切,更好的去选择)

人眼,历史眼睛,眼镜,放大镜,显微镜,望远镜,天文时空望远镜,历史望远和微观时空圈层级里的像素图形,印象,模糊,逐渐清楚,细节清晰可见。理论与实践的差异差别,绝对化的事理论和情,作为名义,代替客观存在的差异差别,这就是无赖流氓,历史风闻清谈官,官僚挂羊头卖狗肉指鹿为马的一个原因?应该补上,挂羊头卖狗肉和指鹿为马,与绝对化名义否定客观现实实践,两者是有本质区别的。不同时空的看看法,与空间象视觉变形的文艺绘画技术作品联系,与几何形象学关联。艺术与科学在技术上是一体的,归于同一个实在本体的各种形式衣服演化,这些演化变化万法归宗,所以互相有内在关系,分散看好似吓了一跳,我的神啦,这么巧合(括号:假设这种情况可能不是巧合,是广义宏观名实关系。那么这个名是指什么呢,人看看到看法和想想到想法,做做法做到的交换流通过程变了形?光干涉的观察问题,属于人下锅的内容和方式顺序不对?)。
 楼主| 发表于 2025-1-1 09:10:55 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-1-2 19:59 编辑

课题1:VBS批量获取文本内容至变量,这些变量储存着,随时可以提取出来,参与单元组合和输出显示。
作业1.1:将两个文本的内容,批量赋值到两个变量里,并输出显示这两个批量变量的内容(之前那个好像算吧,不算,只是程序内自定义变量内容,没有外求获取文件文本内容去赋值变量);
作业1.2:批量被赋值的两个变量,再次被传递给新的两个分散单独的变量,并输出显示这个两个新变量的内容。

---123-二-456-+十789
---123-贰-456-+拾789
---123+贰-456+拾-789
隐藏的文本储存数值可无限,超出显示极限。(中文与数字的象差。可以假设忽略,大礼不差的基本不乱,适度的不完整,是对习惯完整的一种相对阴阳存在补充。所谓不确定不完美概念=极限之外有无限=人外有人天外有天)

将外文集中起来,筛选100个简体字符。大小写打算,书法体也可以参与,都是图形符号的集合。bpqd容易转动方向混淆的,只取一个,提高识别度。一个字符出来,印象就是一个,独一无二的简单快速。外文之外的图形符号也可以拉进来,如文件的控制页面上的图形,抽象一下的。简化体积和需要识别的度量,简化容易接近的选择度量。

改制自组编码字符队伍,单元是哪些单元,摘洗了选择了,然后按照自身需求的程序下锅。原有和自身的内容,都是在单元组合穷尽的地图里,是地图上的各自路线。(这个地图算不算眼镜,不同的远视和近视,放大,显微的时空进制度量眼镜)
全数字,需要花费力气记忆,还是需要一个对应名字便于记忆。

货币资本圆环经济,一个管道头尾相接,但是管身是动态的,有时膨胀,有时紧缩,而且不是同时同步全部膨胀紧缩,而是相对前后波动化学化合反应一样。在这种动态流量象里,人民资本的内容,要吃得下,消化得了,循环每个历史阶段的钱币睡和醒,相对的另一面是物质的反之睡和醒。这些睡和醒的数量比例参数,是那个年代历史阶段的人数。人数,物数,钱数的三数基本逻辑元组合穷尽地图的时空圈层级经济,现在在地图的哪个地方,同样历史各个阶段王朝,也可以假设地图为尺子丈量,在地图上哪个地方,相对的发展推理应该如何。这样的自动量化游戏,代入穿越游戏,顺着历史地图跑的发大财,然后自由历史人物玩家的各自个人发挥选择。这个地图尺子,怎么做?

一百个游戏人物,一直持续运行的量,与周期运行一下获得数值就可以。这样多个游戏人物在不同的文件夹里,周期间隔时间执行一下的批量生产信息程序。批量执行不同文件夹里的同名程序,其处理的信息是周期时间段运算的结果,相对继续运算。一个游戏人物的石坚白数值集合,有多少。一百个有多少,怎么测试一下。或者定时一百个串起来的先后执行。(实际也应该是先后,只是表面概念是同时执行,所以排先后,只是间隔时间上比计算机的间隔拉大了。计算机不会管卡不卡死,人会考虑,所以用人为先后顺序,执行完一个才开始执行下一个的串执行,比较好些。还得看实际效果)
一百个虚拟的穷人富人家庭出生,再随机走向发展为富人穷人,玩家在其中或外环境天神视角,用各自二次随机的内容去影响变化其内容,实现穷富=人为可以影响制造的穷富度。个体穷富度穷人富人,还有组织集体整体的穷富度=唯物自由度(当唯物无法自由,只能唯心求假想假象的解脱。这里的问题是需要人在相对中,主动被动趋向坚强,能不能懒懒的躺着睡觉,不坚强也可以呢?如吹着口哨那样,也是可以的,但是只是有家德能者担负起环境整体,其余的多数一般平常人可以吹口哨,懒懒的躺着赖着不起来。实际总量不变,当那些人不在了,得有新的人继续去坚强,轮到谁得谁,这种没有办法的事。还是家长,孩子王,孩子的三类。家长也可以过六一儿童节,适度放松一下,不是绝对的家长概念,是需要需求问题事产生的家长,不是绝对化的,是相对而生的。这样就有政治相对概念,相对就是势的组成单元,相对组成一切)。

批处理和VB,VBS,c语言等的单独简化循环取数随机数单元,要用的时候,有一个独立的软件形式或代码模块,清楚怎么来的基本功能。概率二选一,重复01或一二,随时选择,得出的当时选择结果为随机数。扩大延长为更多数或字符名字选择。那么,怎么实现呢,最好是一句话就能记得住的量?
while循环,n=0,n=n+1,if(n=2)set n=0,然后怎么变量区域外取值呢?

  1. @echo off
  2. set n=0
  3. set n=n+1
  4. if %n%==12 set n=0
  5. ping -n 2 127.0.0.1 >nul
  6. %0
复制代码
提取n的值,任何时候都可以。输入一个按键或信号,这个是埋在循环里的,见到信号就往循环围墙外扔一个变量结果。需要一个程序或软件接口=输入输出

  1. @echo off
  2. set n=0
  3. set m=0
  4. :0
  5. set n=n+1
  6. if m==0 goto:1
  7. if %n%==12 set n=0
  8. ping -n 2 127.0.0.1 >nul
  9. goto:0
  10. :1
  11. echo:%n%
  12. pause
复制代码
没有反应。或者用for跳出

m加变量的百分号%%=%m%


  1. set /a n=0
  2. set /a m=0
  3. :0
  4. set /a n=n+1
  5. if %m%==0 goto:1
  6. if %n%==12 set n=0
  7. ping -n 2 127.0.0.1 >nul
  8. goto:0
  9. :1
  10. echo:%n%
  11. pause
复制代码
用for做简单选择,文本里的行是0101010100101,然后读取行,跳出来,选哪个是哪个。总之是执行的时候才需要,触发条件就用,其余就空着不执行。总之就是两个猜一个,再多也是这个差不多一类的。这样只需要执行一遍出结果。

假如车轮是圆圈线,先上的单元点是水滴,就是大平板车是船,水聚散为车轮,水是那个单元组合穷尽的地图。
历史适度的环境名义利益人情诱饵与明算账主体(宗教送小礼物入门与献礼,这点商业的免费与收获,那么公有化有没有层叠的送礼和收获,循环约定送礼和收获汇流)。

打开文件的容器与内容,
start容器1=开容器1=开门=可以进出=打开柜子门,才好找东西=打开房门,才好进这个屋子里找东西
close容器1=关容器1=关门=不可以进出咯=关柜子门=关房门
单元重复读取
大多数情况,人的眼睛看着,手跟随着看的内容做事,少数是眼睛看不到或闭着,手做事。也就是一般平常是眼看手做(不是将差异对立分散分解,强势按闹抢特权。眼睛太不是人了,象农民一样,有土地还要养老金,也不看看付过钱没有,工人太不是人了,不努力赚钱,就想着攀比要高收入高养老金,那么多人富的比比皆是,为什么就是你穷呢。这种价值意识的说法者,源头是哪些重复循环规律的人,是眼睛还是手?),这样如果程序化,是一个眼信息输入,一个对眼信息处理后再输到手的操作程序。
听风是雨,人概念象,对外象的交换翻译转化,将风这个环境存在,通过眼睛或耳朵等吾五感官,翻译为雨这个内部流通信息。翻译信息,交换信息。
批处理和VBS,将一个文本的内容,对照交换表,进行交换翻译。
if 变量读取的文本单元==集合里的单元,则替换为集合里的单元。
依次读取,C语言依次读取文本和批处理等依次读取文本。

每个人可能成为恶人或善人,不等于每个人是恶人或善人的名实关系。私有化的煽情,是用个体作为例子,去伪证整体,各种手法是一个路数方法方式,但是挺有效,信息企业的喇叭硬件在手里很重要,我的声音就是大。这个部分在游戏中,通过所有权来建立控制比例,私有化硬件喇叭为0%企业单元比例,至100%。对应的是公有化喇叭(这里的问题就出来了,我打工的,不赚老板便宜,还给老板卖命不成。那么如果有公有化所有制和总量整体所有权里的劳动股份所有权比例呢?我算不算十五亿分之一的主人了,法律形式名义上的,对应有量化的物质利益等着呢,快干活吧。也会有反过来,所有权都有了,别人多干点,我少干点,一样机械规则会产生所有权利益,自己少干不是相对多赚了)

游戏里信息人物发帖,然后玩家作为帖子管理员,进行不同情况趋势的导向操作。发帖人群体类别的控制,建立帖子的控制,把帖子排前排的排序控制,帖子里的回帖控制,点赞数控制,点踩数控制。
批处理的帖子点赞和点踩模拟,摆在最后一行,前面加上发帖地址的各国地方。这些需要处理的都是随机选择的集合,管理员的立场和个人利益趋向,影响帖子生产和帖子的观察者。管理员是老板所有权(也可以正反自身所在利益立场),管理员是老板的工人(工人可以自由度选择,成为工人劳动者利益趋势,也可以逆反),管理员是公有的集体成员(好像也可以正反,没有固定的形式和实在一体的,一切是变化的,但是环境影响趋势趋向被动一致的),三类人。

批处理建立一个帖子,管理模式和发帖,观察三模式。另外有个所有权的立法改变,买卖改变(买一个信息企业平台,卖一个信息企业平台。管理员工人被买来干活,或被赶走)。

帖子页面格式,VB6.0的froms控件里的多页,论坛主题多页里的多页回复贴。page1,2,tab1,2,
在游戏中,上下两分。两部分都可以再次最小化和最大化,半分三种选择。其中一个是论坛主题部分,另一个是输出主题主贴内容和回帖。这可以阅读小说,加上语音库,可以做其他事情听小说。VB6.0有没有声音功能,应该有吧?

选择旧的工具,跟着技术时代后面低头走,可以捡到东西,不用还的。(在游戏里打装备没有私有时限这个功能之前,是可以的,还有装备消失的时效)
外图lcon(外部文件夹里的文件图标),内图picture(软件程序内部图片)。

文件夹为地名的文件夹世界游戏模式

VB6.0里,通过time重复读数,然后读取到tag里的临时数,作为随机数。
if
elseif
else
endif
具有对称结构,便于记忆的复杂语句功能命令。
pri vate私有单独独立的
sub代替指代
通用=声明
from=31科目:
1,acti vate 激活开始启动选择
2,click点击,单击
3,dbclick点击,双击
4,de acti vate取消激活开始启动选择
5,dragdrop拖放信号
6,dragover拖放=drag+start+over+enter(类似鼠标按下,不放,松开的信号)
7,gotfocus
8,initialize
9,keydown
10,keypress按键press=按
11,keyup按键key+press+down+up+value=值
from属性=51科目

在南京文件夹里,点击飞机那个bat,输入目的地和航程对应的飞机票,然后移动到北京文件夹里。如果是南京文件夹里有一个北京文件夹,直接“CD 北京”是不行的。最好是一个文件夹浏览器可以执行的语句。
相对高技术物质劳动,平常物质技术劳动,物货钱。(物货钱,分别对应万物物质世界,物加工制造为货,这样与货币联系为下一步的量化钱币流量,对钱币流量,进行结构组织的水固流汽三态编程假设,钱币作为水,进行时空三态编程。钱是什么形态?)

家家一个对外的无人售货机,靠着大门(或者就是一个大门和货柜一体),可以自制商品出售,加上网络消费者远程快递自动对接。先付款,不可以退货?

批处理帖子

  1. @echo off
  2. :0
  3. :帖子1921
  4. echo:帖子1921:我们为什么要问?
  5. echo:答者1911:因为.......所以......。
  6. echo:发帖来源=%变量123%,点赞=%变量456%,点踩=%变量789%。
  7. goto:0
  8. pause
复制代码
 楼主| 发表于 2025-1-2 20:10:44 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-1-4 19:23 编辑

将批处理帖子分解为几个变量组合,每个变量获取其类文件夹里的文件文本行内容。
1开始标签变量
2主题名
3主题内容
4回帖名
5回帖内容
6回帖地址,7回帖点赞,8回帖点踩,
9结束标签变量

信息技术工程复杂细致至零件单元结构界面和内容,与用户需求问题相关常极界面和内容。器能的用户界面,其历史道路,历史阶段,历史年代的相对变与不变的相对。工程类似字典,有关科目就得列,具体要执行的,少了不行。(少了可以,那就少呗)

制造用器的自由度,器默认初始固定记录模式,用户自由度修改储存模式。这种自由度,好像很不好自由。华夏神器,一般平常普通用器。神器概念不好说得通,只是作为模糊混沌的代表存在,放大的个体个人为整体代表,如道一类概念,还是普通和家概念好说明白,人人都是过日子,谁不知道呢。这样所谓神器,就是放大的变量或抽象的家,小家,中家,大家。用家,就好理解了,哦,所谓神器,就是最大的家。这样物器,人器,神器。小器,中器,大器。
器,小器,中器,大器。
家,小家,中家,大家。
事,小事,中事,大事。

VB6.0按钮图片,按按钮控件,然后按钮界面显示的图片运行内容。,也就是不另外安排图片控件一picture或二lmage
透明按钮和按钮图片,循环多个按钮图片。
VB的界面可不可以改呢,改为鼠标一键显示属性栏,再按一下就挂起来。再有快捷键调用,快捷键放在头栏显示,只提示一个总的ctrl+0~9一类(快捷组合键的无限数量化?),后面自己测试记忆。
对技术印象的快捷键,对用户的提示快捷键+挂起和显示。也就是对一般普通用户简化,是可以的,没必要都很复杂。器能,是有可能度的。(缺点是到逻辑组合的那部分,还能简化吗,应该有一个量与质的相对边缘,一般到那个边缘边界就够用了,就停止。而个人使用学习,就可以继续提高那个边缘线,类似车间钳工技师再专门产品上,相对综合知识经验,技术手册,为底线工程师的一点点事实践动手记忆回忆积累的进步)

在一个文件夹里到处随机移动的文件和文本信息小人,不能出这个文件夹世界。
游戏的路社区,以路为集中的分散社区。
国=都,郡=府,县=城,乡=镇,村=社。八洲四海,一个中国,一个外国。外国郡府,洲和州就不用于外国了,减少游戏干扰。市作为市集概念象,不作为城市和地方的名称,属于历史阶段希望经济科技也强盛的模仿选择,但是实际作用只是比较效应,对具体反而横加干扰,可以取消。米郡,阴郡(其原有的郡缩小为县),法郡,德郡,澳郡,加郡。单字重复的需要特殊处理,成词以区别。一个人从中国中原河南郡,乘飞机到外国米郡,又转机到外国阴郡,然后回到江南郡(上海作为县吧,结构功能与特权的矛盾不好,用一个统一的,可以因事特殊处理,不能因特殊情况而要超出整体的特权。缺点是干事多了,会不会激励不足。这点应该分为两类,就如工人固定工资与甲方乙方联系,工人不奴隶干活的问题,其捆绑的话语不提所有权,将两类不同的利益捆绑起来,作为违法不付拖付工资的依据,这时也不提法制了,工人也成私有化资本家一桌人了,回头该历史反复验证的怎么对付工人,还是怎么对付。也就是特殊事的量增加,对工人的奖励也增大,而不是所有权的利润增大。一旦干顺手了,工人利益大大的,所有权形式的利润一方,可以扔掉了,你再去找事吧。无限资本所有权,与时效可以剥离的资本所有权,最后组织为劳动者的时效股份所有权循环承接,这里劳动者时效是方便变化的调整,资本时效是将无限改为有限极限,甚至利用完了就驱离。慈不掌兵,善不持公,向善能恶持公)。
一个批处理,上半部分是程序,下半部分是信息。
先一个bat将自身从中国南京府文件夹,移动到中国上海县。
不删除自身的移动,先复制后删除的分段处理移动,只复制信息建立新文件删除原文件。
两个bat呼叫模式,信息小人一号,呼叫移动交通工具,腿脚,自行车,电瓶车,摩托车,汽车,飞机,轮船啥的,这些交通工具bat被叫来,原本的呼叫停止,静态被动被交通工具bat移动。
如果bat本身结尾有删除功能单元,前面是指向复制自身,是不是模拟了移动呢?
1复制信息小人一号bat文件,至上海县文件夹;
2结尾删除自身bat文件。

  1. @echo off
  2. xcopy "D:\dos\bat\xsj\地星村\土洲\中国\江南郡\南京城\信息小人一号.bat" "D:\dos\bat\xsj\地星村\土洲\中国\江南郡\上海县\信息小人一号.bat"
  3. pause
复制代码
报错信息:

  1. 目标 D:\dos\bat\xsj\地星村\土洲\中国\江南郡\上海县\信息小人一号.bat 是文件名
  2. 还是目录名
  3. (F = 文件,D = 目录)?

  4. 是一个选择,不是报错。

  5. 目标 D:\dos\bat\xsj\地星村\土洲\中国\江南郡\上海县\信息小人一号.bat 是文件名
  6. 还是目录名
  7. (F = 文件,D = 目录)? f
  8. D:\dos\bat\xsj\地星村\土洲\中国\江南郡\南京城\信息小人一号.bat
  9. 复制了 1 个文件
  10. 请按任意键继续. . .

复制代码
是可以的,实现了从南京城文件夹,复制bat本身至上海县文件夹,然后删除自身。(就是有点磕磕绊绊的,选择文件或文件夹,复制过一次的已有同名提示覆盖。为什么呢,要一刀流的,刷)

  1. @echo off
  2. xcopy "D:\dos\bat\xsj\地星村\土洲\中国\江南郡\南京城\信息小人一号.bat" "D:\dos\bat\xsj\地星村\土洲\中国\江南郡\上海县\信息小人一号.bat"
  3. del %0
  4. pause
复制代码
应该是:

  1. set 变量1=地址1
  2. set 变量2=地址2
  3. 命令 变量1 变量2
  4. del删除自身%0
复制代码
地址2变量,是信息小人的随机内容,要怎么实现,还不能跑出地星村这个文件夹。
D:\dos\bat\xsj\地星村\为一个固定的变量,其余的是几个洲国的字词组合选择,在这些选择里,是不会跑出新世界xsj和地星村的固定变量前提。
一个人一生,一年,一天吃饭的事利益,上下两代或五代人的利益,世代人的利益,争取统治者所有权与劳动者劳动的相对短近长远关系。不需要在法律这种形式衣服上去争辩,而是在我们,上下,代世代的统治者利益角度去看所有权利益的取舍,在这种利益中,私有化群体只是利益食物。公有化的善良失败,与私有化的向恶必胜,导致向善的变质需求。
游戏的天气雨雪晴和明暗黑色彩,房路空间,身体心情,环境相对事情情绪。
新纪年历史王朝表,表格互换西历,农历阴阳历,新历(365天,客观少一天的日历与其余实际日历只能在年上交换,天不好全交换,可以交换大部分)。
外国法不是国内法,外国来的罪犯,要进行国内法补充处理一遍,不足的处罚补充完整,该坐牢的继续坐牢,还要有家庭保人的所有资产为押金,出个小问题就百分之十的比例处罚,直到最后低于最低工资。资产的百分之十是不是有点慢,换成百分之五十。
游戏新历转化历史王朝的历史阶段性,三皇五帝一句话,夏商周,秦汉唐,主要是外族入侵部分的定义,外族被打败成为纳入领土的臣服者,就开始变质,不再与之前的侵略者相同,反之继续萌芽新生与之前的侵略者相同,就继续打之,直到打灭或打服,保持大家统一互利共利组织化持久。同理能人私有化官僚资本主义官商,打灭和打服人民百姓大众的法律衣服下白色之黑的存在(深圳生存一百天的胜利,是谁的胜利呢,失败又是谁的失败呢,这样不同圈层级利益利害的相对胜败。活着不好吗,怎么活呢?从个体胜利的追求,走向整体平均化个体利益的胜利,所以平均这个概念才是胜利的追求,反之必然要反对平均,而且是将平均说成绝对化,建立为靶子打)。(这里就存在取舍矛盾问题了,生命只有一次,但是必须要下注,不下注也是下了一种注)
私有化的客观存在效率效益,本能,欲望,纵欲,贪婪的推动力,集中吸取的趋势惯性,至趋势结束,一般是权力和资源重新分配的几代人之间,一百多年,后面是私有化利益方向不变的正反挣扎惯性延续。私有化的客观存在,可不可以成为一种阶段阶梯的垫脚石可能,哪怕是被动的,他们也不想不愿意选择的那种(但是这种具有非通用性,却可以理解为奋斗解题努力的属性。在没有历史通用性的解题之前,有比没有好,所以是可以的吧,有什么办法呢,让大部分人人吃草,还是让一些少数人去啃一般平常人饭菜的选择,原来选择并不难,看与谁比。你看啊,现在吃的好,你看啊,现在这这那那的问题,看有其结构功能之用,但是只看,不承接其后的看法,想法,做法和做积累量至量变质,有屁用,就是忽悠人的)。

解决事与解决人的相对比例选择。

道路道理,乐象,编程组合穷尽地图,生命在本立自由度,相对名实量化关系科研科技,器能,文化传统习俗习惯简化(习俗习惯,属于结构组织需求问题简化。同理是私有化的利益利害选择和规则)。
十二朝
三皇五帝,夏商周,秦汉唐,五代十国南北朝,宋明民新(外族统治,一般得至外族心身物意识组织消亡内化掉,才能算善后结束=元清)。
三皇五帝,夏商周,秦汉隋唐,宋明民新。8+11=19个大概念基本定位,四个历史阶段。历史阶段里的统治组织。经济基础生产力差别,所产生的历史阶段王朝山河区分。内部组织权力斗争与外族内外斗争的再次区别。
1传统断续传承的区别,2经济基础发展的区别,3组织内部竞赛的区别,4组织内外斗争的区别。敌人不得不进入内部竞赛,还是不是敌人了呢?

随机移动文件的随机选择组合单元对象,地星村之下的多个文件夹名字搜索集中,对这些集合的文件夹名字单元,进行随机选择的先复制再删除移动。for处理。批处理获取文件夹
文件夹地图,如果都是变量,是不是都在内存里活动,不需要经常外部读取文本。
tree树叉命令,怎么把文件夹名给排序出来。几个制表字符替换为空,空格怎么办。
历史记录的排序阵列名字,代入通用的变量。
===========================变量
|||||||||||||||||||||||||||||||||||||||||||||||蜈蚣脚或车轮子,滚木的具体定义名字
单机利益风洞试验场,将模拟的信息个体,实验各种方向和极限的现象,数值。
信息小人的模拟性格选择,与满天星星为孔的信息之孔=缸中之脑的信息输入输出。
人民信息时代,与私有化愚民时代的一个历史台阶,很可能要出现,一个新历史阶段新生的信息技术文明种族民族国家。人,火光,影,镜,境的信息组织组合集合一体化。信息是光线,光明的一部分,但是信息也有颜色,可以是白色,也可以是白色的黑色,可以是黑色。白色信息可以照亮路步子,可以眼睛看见手好做事。白色的黑色,可以让人走向各种心身绝境,还以为是光明中(伪白)。黑色是历史存在的明显明面明确的害处。是否有伪黑呢
怎么保证批处理的文件移动,不是到处留下复制的影子文件,不会产生无数个分身,而是唯一一个呢?
tree处理一行一个文件夹名字,其for假设有随机选择,产生的移动,你并不知道文件跑到哪里了。所以先建立一个顺序移动,方便观察。

  1. @echo off
  2. cd.>1.txt
  3. cd.>2.txt
  4. tree >1.txt
  5. setlocal enabledelayedexpansion
  6. (
  7. for /f "delims=" %%i in ('more +3 1.txt') do (
  8. set "str=%%i"
  9. set "str=!str:├=!"
  10. set "str=!str:│=!"
  11. set "str=!str:─=!"
  12. set "str=!str:└=!"
  13. set "str=!str: =!"
  14. echo,!str!
  15. )
  16. )>2.txt
  17. pause
复制代码
以2.txt文本里的文件夹名字,作为循环跳转信息小人的选择。for循环

  1. @echo off
  2. set "a=D:\dos\bat\xsj\地星村\土洲\中国\江南郡\南京城\信息小人一号.bat"
  3. set "b=D:\dos\bat\xsj\地星村\土洲\中国\江南郡\上海县"
  4. xcopy %a% %b%
  5. del %0
  6. pause
复制代码
怎么将文件夹=路径路线单元,都弄成变量的组合,这些单元的规律随机组合,形成跑路的路线。(还要加上一个时间限制,一天只能走路十几里至二十里,极限翻倍40里,这样县与县移动按照地图大理不差的平均值50西里=外里,就是100里,需要2天多游戏时间?)

  1. 开始
  2. 变量123=文本内容
  3. 变量456=鼠标键盘操作
  4. 变量交换
  5. echo:变量页面
  6. 变量交换
  7. echo:变量页面
  8. 变量清理(这一步需要吗?)
  9. 结束
复制代码
 楼主| 发表于 2025-1-4 21:00:25 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-2-10 17:37 编辑

批处理的第三方软件读取文件夹图片集

  1. :0
  2. for /l (123.jpg)
  3. 第三方显示变量名图片
  4. goto next
  5. ping
  6. goto 0
  7. :next
复制代码
设置一个变量数字增量呢?set /a n=,set /a n=n+1,if n==最终数字,则停止。还是需要goto,单独并不能循环重复。
goto尽量要批量,如一船一船的,一个程序里有三个goto对应通用,组用,专用的,如果goto全用变量,一个就可以了。

  1. @echo off
  2. set /a a=5
  3. :0
  4. ping -n %a% 127.0.0.1 >null
  5. echo:00000
  6. goto:0
  7. pause
复制代码
ping的数值化变量是可以的。批处理全变量或大部分命令的数值全变量。
一个无限自转goto(或者for/l一生多生循环,对应多种进制组合),直到关闭。里面有for/l计数类集合。

  1. for /l (0,1,10) (十个十年的百年一世
  2. for /l (0,1,10) (十年一代
  3. for /l (0,1,360) (360天一年
  4. for /l (0,1,6) (360天额外的5或6天,以独立形式加入
  5. for /f (0.txt) (读取输入信息寄存器切割为日程表,作息表,睡醒表,工作劳动表,一生百年事程表,一代十年事程表,一年事程表,年内循环使用的地图和地图上自由度发挥的路线具体事情。
  6. )))))
复制代码
:1
goto:1
goto(123):1
goto+123:1
:1;
goto+123:1;
goto(123-1=0):1;
信息小人的出生开始和结束,中间的各种内容,以及这些内容怎么通过BMP图片,集成为一种动态演化的图,可以眼睛看的什么一生形态,将时空集成起来,对付人生的参与熟记忆,好恶,主动被动记忆遗忘,建立旁观人生图,如佛让其弟子看前世后生的看一生。
人民自治自组基层土工小组,自下而上生长组构覆盖。自动自下而上生长到极限的家概念人民组织,世代周期新生代重生重新生长一遍。(私有化颜色活动也是新生代群体生长,还得考虑历史文化的后天加成参与投入组合)
以勇士大闯关为基础模型,加入中医许阳作为剧情,勇士大闯关的通天塔类,增加宏观中医和微观中医。将万物太极与原子分子数量数学之间,作为微观中医内容。将抽象通用传统文化中医基础理论内容,作为宏观中医,联系唯物理论为广义中医,治天下。这样基本架构不需要费脑子想剧情了,抄写修改就可以了。(将阴阳放在太极前面,气清浊相对开天辟地。混元,太极圆,原子分子单元集合等概念体联系起来。空,作为不在概念,就是理论上存在,但是实际现实不会存在的静态抽象内容,或极少存在,作为一个0概念镜子,去相对差异=看见相对内容存在,0奇点临界点=相对差异的反射镜子。其余机械理论,是连续变化时空体,其相对慢速的截取静态时空。动态和描述动态的相对静态理论,是主要需要的内容。但是将其余的大部分内容扫清保障环境=谋略和内务政务,余下的主力集中动态内容=相对静态理论,重点重心中心。)勇士大闯关的存取和随机用户名,已有用户的自动演化和先后账号互相模拟演化的关系(这种不需要去想了,超出范围的想法情绪基本截断,集中于已有需要可行的内容)。勇士大闯关里加入图片是可以的,需要弄固定图片大小显示的,这样固定空文字行数下的文字配合图片显示。(中医许阳这本书的意义不会小,比历史的组织,中医名家等普及书籍更高,次于黄帝内经)
 楼主| 发表于 2025-12-16 11:29:12 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-16 11:32 编辑

linux mint22.2 C语言SDL2
终端输入:安装常用开源中文字体
sudo apt install fonts-wqy-microhei fonts-wqy-zenhei
0.txt

  1. [选1游戏开始]

  2. 背个书包上学校

  3. [选2游戏说明]


  4. 下班烧饭喝酒看新闻
  5. 玩玩游戏睡觉

  6. [选3退出游戏]
复制代码
1.txt

  1. [123]

  2. 0000
  3. 0000
  4. 0000
  5. 欢迎来到游戏!

  6. [返回主菜单]
  7. [111]
复制代码
2.txt

  1. [456]

  2. 111
  3. 111
  4. 111

  5. [000]
复制代码
3.txt

  1. [789]

  2. 000
  3. 000
  4. 000

  5. [111]
复制代码
0.c

  1. // 标准输入输出库(用于 printf, fprintf, fopen 等)
  2. #include <stdio.h>
  3. // 标准库(用于 malloc, free, exit 等)
  4. #include <stdlib.h>
  5. // 字符串处理库(用于 strcpy, strlen, strchr 等)
  6. #include <string.h>
  7. // SDL2 主头文件(图形窗口、事件、渲染等核心功能)
  8. #include <SDL2/SDL.h>
  9. // SDL2_ttf 头文件(用于加载和渲染 TrueType 字体)
  10. #include <SDL2/SDL_ttf.h>

  11. // 定义窗口宽度(像素)
  12. #define WINDOW_WIDTH 800
  13. // 定义窗口高度(像素)
  14. #define WINDOW_HEIGHT 600
  15. // 定义字体大小(点数)
  16. #define FONT_SIZE 24
  17. // 最大支持的文本行数
  18. #define MAX_LINES 200
  19. // 每行最大字符数(字节数,UTF-8 下一个汉字占3字节)
  20. #define MAX_LINE_LEN 512
  21. // 每页最多支持的按钮数量
  22. #define MAX_BUTTONS 50

  23. // 按钮结构体:记录可点击区域的信息
  24. typedef struct {
  25.     int line;                // 按钮所在行号(从0开始)
  26.     int start_col, end_col;  // 按钮在该行中的起始和结束字节偏移(UTF-8 字节位置)
  27.     char label[MAX_LINE_LEN]; // 按钮标签内容(不含方括号,如 "选1游戏开始")
  28.     int target_id;           // 从标签中提取的目标文件编号(如 "选1..." → 1;若无法解析则为 -1)
  29. } Button;

  30. // 页面结构体:表示一个 .txt 文件的内容及其交互元素
  31. typedef struct {
  32.     char lines[MAX_LINES][MAX_LINE_LEN]; // 存储所有文本行
  33.     int num_lines;                       // 实际行数
  34.     Button buttons[MAX_BUTTONS];         // 本页所有可点击按钮
  35.     int num_buttons;                     // 实际按钮数量
  36.     char filename[32];                   // 当前页面对应的文件名(如 "0.txt")
  37. } Page;

  38. // 全局变量声明
  39. SDL_Window *window = NULL;        // SDL 窗口指针
  40. SDL_Renderer *renderer = NULL;    // SDL 渲染器指针(用于绘制)
  41. TTF_Font *font = NULL;            // 加载的字体指针
  42. SDL_Color text_color = {255, 255, 255, 255};      // 普通文本颜色:白色
  43. SDL_Color button_color = {0, 255, 255, 255};      // 按钮文本颜色:青色(高亮)
  44. SDL_Color bg_color = {0, 0, 0, 255};              // 背景颜色:黑色

  45. // 函数:加载指定文件到 Page 结构体中,并解析其中的按钮
  46. int load_page(Page *page, const char *filename) {
  47.     // 以只读模式打开文件
  48.     FILE *fp = fopen(filename, "r");
  49.     if (!fp) {
  50.         fprintf(stderr, "无法打开文件: %s\n", filename);
  51.         return -1; // 打开失败返回 -1
  52.     }

  53.     // 记录当前加载的文件名
  54.     strcpy(page->filename, filename);
  55.     page->num_lines = 0;    // 初始化行数
  56.     page->num_buttons = 0;  // 初始化按钮数

  57.     char line_buf[MAX_LINE_LEN];
  58.     // 逐行读取文件,直到文件结束或达到最大行数
  59.     while (fgets(line_buf, sizeof(line_buf), fp) && page->num_lines < MAX_LINES) {
  60.         // 移除行尾的换行符 '\n'
  61.         size_t len = strlen(line_buf);
  62.         if (len > 0 && line_buf[len - 1] == '\n') {
  63.             line_buf[len - 1] = '\0';
  64.         }
  65.         // 将处理后的行存入页面结构
  66.         strcpy(page->lines[page->num_lines], line_buf);
  67.         page->num_lines++;
  68.     }
  69.     fclose(fp); // 关闭文件

  70.     // 遍历每一行,查找并解析 [ ... ] 形式的按钮
  71.     for (int i = 0; i < page->num_lines; i++) {
  72.         char *line = page->lines[i];
  73.         char *p = line;
  74.         // 在当前行中循环查找 '['
  75.         while ((p = strchr(p, '[')) != NULL) {
  76.             // 查找对应的 ']'
  77.             char *end = strchr(p, ']');
  78.             if (!end) break; // 没有匹配的 ']',跳过

  79.             // 计算标签长度(不包括 '[' 和 ']')
  80.             int label_len = end - p - 1;
  81.             if (label_len <= 0 || label_len >= MAX_LINE_LEN) {
  82.                 p++; // 跳过无效标签
  83.                 continue;
  84.             }

  85.             // 复制标签内容(如 "选1游戏开始")到按钮结构
  86.             strncpy(page->buttons[page->num_buttons].label, p + 1, label_len);
  87.             page->buttons[page->num_buttons].label[label_len] = '\0'; // 确保字符串结尾

  88.             // 尝试从标签中提取数字(格式必须是 "选数字...")
  89.             int id = -1;
  90.             if (sscanf(page->buttons[page->num_buttons].label, "选%d", &id) == 1) {
  91.                 page->buttons[page->num_buttons].target_id = id; // 成功提取
  92.             } else {
  93.                 // 不符合 "选N" 格式,设为 -1(可后续扩展自定义行为)
  94.                 page->buttons[page->num_buttons].target_id = -1;
  95.             }

  96.             // 记录按钮在文本中的位置(按字节偏移)
  97.             page->buttons[page->num_buttons].line = i;
  98.             page->buttons[page->num_buttons].start_col = p - line;   // 起始列('[' 的位置)
  99.             page->buttons[page->num_buttons].end_col = end - line;   // 结束列(']' 的位置)

  100.             page->num_buttons++; // 按钮计数加一
  101.             if (page->num_buttons >= MAX_BUTTONS) break; // 达到上限则停止

  102.             p = end + 1; // 继续在 ']' 之后搜索
  103.         }
  104.     }

  105.     return 0; // 成功加载
  106. }

  107. // 函数:将 Page 内容渲染到窗口
  108. void render_page(Page *page) {
  109.     // 设置清屏颜色为背景色(黑色)
  110.     SDL_SetRenderDrawColor(renderer, bg_color.r, bg_color.g, bg_color.b, bg_color.a);
  111.     SDL_RenderClear(renderer); // 清空屏幕

  112.     int y = 10; // 初始 Y 坐标(顶部留白)
  113.     // 遍历每一行进行渲染
  114.     for (int i = 0; i < page->num_lines; i++) {
  115.         if (y > WINDOW_HEIGHT) break; // 超出窗口底部则停止

  116.         // 检查当前行是否包含按钮
  117.         int has_button = 0;
  118.         for (int b = 0; b < page->num_buttons; b++) {
  119.             if (page->buttons[b].line == i) {
  120.                 has_button = 1;
  121.                 break;
  122.             }
  123.         }

  124.         if (!has_button) {
  125.             // 无按钮:整行用普通颜色渲染
  126.             SDL_Surface *surf = TTF_RenderUTF8_Blended(font, page->lines[i], text_color);
  127.             if (surf) {
  128.                 SDL_Texture *tex = SDL_CreateTextureFromSurface(renderer, surf);
  129.                 SDL_Rect dst = {10, y, surf->w, surf->h}; // X=10 留左边界
  130.                 SDL_RenderCopy(renderer, tex, NULL, &dst);
  131.                 SDL_DestroyTexture(tex);
  132.                 SDL_FreeSurface(surf);
  133.             }
  134.             y += FONT_SIZE + 4; // 行间距
  135.         } else {
  136.             // 有按钮:分段渲染(普通文本 + 高亮按钮)
  137.             char *line = page->lines[i];
  138.             int x = 10;     // 当前行的 X 起始位置
  139.             int pos = 0;    // 当前行的字节偏移

  140.             while (pos < (int)strlen(line)) {
  141.                 // 查找当前位置是否有按钮开始
  142.                 Button *btn = NULL;
  143.                 for (int b = 0; b < page->num_buttons; b++) {
  144.                     if (page->buttons[b].line == i && page->buttons[b].start_col == pos) {
  145.                         btn = &page->buttons[b];
  146.                         break;
  147.                     }
  148.                 }

  149.                 if (btn) {
  150.                     // 渲染按钮部分(带 [],使用高亮颜色)
  151.                     int btn_len = btn->end_col - btn->start_col + 1;
  152.                     char btn_text[btn_len + 3]; // 预留空间给 '[' 和 ']'
  153.                     snprintf(btn_text, sizeof(btn_text), "[%s]", btn->label);

  154.                     SDL_Surface *surf = TTF_RenderUTF8_Blended(font, btn_text, button_color);
  155.                     if (surf) {
  156.                         SDL_Texture *tex = SDL_CreateTextureFromSurface(renderer, surf);
  157.                         SDL_Rect dst = {x, y, surf->w, surf->h};
  158.                         SDL_RenderCopy(renderer, tex, NULL, &dst);
  159.                         SDL_DestroyTexture(tex);
  160.                         SDL_FreeSurface(surf);
  161.                         x += surf->w; // 更新 X 坐标
  162.                     }
  163.                     pos = btn->end_col + 1; // 跳过整个按钮(包括 ']')
  164.                 } else {
  165.                     // 渲染单个字符(简单处理 UTF-8,可能对齐不准但可接受)
  166.                     char single[5] = {line[pos], 0}; // 取一个字节(注意:UTF-8 汉字需多字节)
  167.                     SDL_Surface *surf = TTF_RenderUTF8_Blended(font, single, text_color);
  168.                     if (surf) {
  169.                         SDL_Texture *tex = SDL_CreateTextureFromSurface(renderer, surf);
  170.                         SDL_Rect dst = {x, y, surf->w, surf->h};
  171.                         SDL_RenderCopy(renderer, tex, NULL, &dst);
  172.                         SDL_DestroyTexture(tex);
  173.                         SDL_FreeSurface(surf);
  174.                         x += surf->w;
  175.                     }
  176.                     pos++; // 移动到下一个字节
  177.                 }
  178.             }
  179.             y += FONT_SIZE + 4; // 行间距
  180.         }
  181.     }

  182.     SDL_RenderPresent(renderer); // 提交渲染结果到屏幕
  183. }
复制代码
下续
 楼主| 发表于 2025-12-16 11:29:38 | 显示全部楼层

  1. // 函数:检测鼠标点击是否落在某个按钮区域内
  2. int check_click(Page *page, int mouse_x, int mouse_y) {
  3.     int y = 10; // 从顶部开始计算行位置
  4.     for (int i = 0; i < page->num_lines; i++) {
  5.         if (y > WINDOW_HEIGHT) break;

  6.         // 检查该行是否有按钮
  7.         int line_has_button = 0;
  8.         for (int b = 0; b < page->num_buttons; b++) {
  9.             if (page->buttons[b].line == i) {
  10.                 line_has_button = 1;
  11.                 break;
  12.             }
  13.         }

  14.         if (!line_has_button) {
  15.             y += FONT_SIZE + 4;
  16.             continue; // 无按钮行,跳过点击检测
  17.         }

  18.         // 计算该行整体高度(用于判断鼠标是否在行内)
  19.         int line_height = FONT_SIZE + 4;

  20.         // 如果鼠标 Y 坐标在当前行范围内
  21.         if (mouse_y >= y && mouse_y < y + line_height) {
  22.             // 精确计算每个字符/按钮的 X 位置
  23.             int x = 10;
  24.             int pos = 0;
  25.             char *line = page->lines[i];

  26.             while (pos < (int)strlen(line)) {
  27.                 // 查找当前位置是否有按钮
  28.                 Button *btn = NULL;
  29.                 for (int b = 0; b < page->num_buttons; b++) {
  30.                     if (page->buttons[b].line == i && page->buttons[b].start_col == pos) {
  31.                         btn = &page->buttons[b];
  32.                         break;
  33.                     }
  34.                 }

  35.                 if (btn) {
  36.                     // 构造带 [] 的按钮文本,计算其宽度
  37.                     char btn_text[512];
  38.                     snprintf(btn_text, sizeof(btn_text), "[%s]", btn->label);
  39.                     SDL_Surface *surf_btn = TTF_RenderUTF8_Blended(font, btn_text, button_color);
  40.                     int btn_w = surf_btn ? surf_btn->w : 0;
  41.                     SDL_FreeSurface(surf_btn);

  42.                     // 检查鼠标 X 是否在按钮宽度范围内
  43.                     if (mouse_x >= x && mouse_x < x + btn_w) {
  44.                         // 点击有效按钮!
  45.                         if (btn->target_id >= 0) {
  46.                             // 构造目标文件名(如 "1.txt")
  47.                             char next_file[32];
  48.                             snprintf(next_file, sizeof(next_file), "%d.txt", btn->target_id);
  49.                             // 尝试加载新页面
  50.                             if (load_page(page, next_file) == 0) {
  51.                                 return 1; // 成功切换
  52.                             } else {
  53.                                 return -1; // 文件不存在
  54.                             }
  55.                         }
  56.                     }
  57.                     // 更新 X 和位置指针
  58.                     x += btn_w;
  59.                     pos = btn->end_col + 1;
  60.                 } else {
  61.                     // 普通字符:计算宽度并推进
  62.                     char single[5] = {line[pos], 0};
  63.                     SDL_Surface *surf_char = TTF_RenderUTF8_Blended(font, single, text_color);
  64.                     int w = surf_char ? surf_char->w : 10;
  65.                     SDL_FreeSurface(surf_char);
  66.                     x += w;
  67.                     pos++;
  68.                 }
  69.             }
  70.         }
  71.         y += FONT_SIZE + 4;
  72.     }
  73.     return 0; // 未点击任何有效按钮
  74. }

  75. // 主函数
  76. int main(int argc, char *argv[]) {
  77.     // 初始化 SDL 视频子系统
  78.     if (SDL_Init(SDL_INIT_VIDEO) < 0) {
  79.         fprintf(stderr, "SDL 初始化失败: %s\n", SDL_GetError());
  80.         return -1;
  81.     }

  82.     // 初始化 SDL_ttf 字体系统
  83.     if (TTF_Init() < 0) {
  84.         fprintf(stderr, "TTF 初始化失败: %s\n", TTF_GetError());
  85.         SDL_Quit();
  86.         return -1;
  87.     }

  88.     // 创建窗口
  89.     window = SDL_CreateWindow("文字按钮游戏",
  90.                               SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
  91.                               WINDOW_WIDTH, WINDOW_HEIGHT,
  92.                               SDL_WINDOW_SHOWN);
  93.     if (!window) {
  94.         fprintf(stderr, "创建窗口失败: %s\n", SDL_GetError());
  95.         TTF_Quit();
  96.         SDL_Quit();
  97.         return -1;
  98.     }

  99.     // 创建硬件加速渲染器
  100.     renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  101.     if (!renderer) {
  102.         fprintf(stderr, "创建渲染器失败: %s\n", SDL_GetError());
  103.         SDL_DestroyWindow(window);
  104.         TTF_Quit();
  105.         SDL_Quit();
  106.         return -1;
  107.     }

  108.     // 加载中文字体(文泉驿微米黑)
  109.     font = TTF_OpenFont("/usr/share/fonts/truetype/wqy/wqy-microhei.ttc", FONT_SIZE);
  110.     if (!font) {
  111.         fprintf(stderr, "无法加载中文字体!请确认已安装 fonts-wqy-microhei\n");
  112.         TTF_Quit();
  113.         SDL_Quit();
  114.         return -1;
  115.     }

  116.     // 加载初始页面(0.txt)
  117.     Page current_page;
  118.     if (load_page(&current_page, "0.txt") != 0) {
  119.         fprintf(stderr, "初始文件 0.txt 不存在!\n");
  120.         TTF_CloseFont(font);
  121.         SDL_DestroyRenderer(renderer);
  122.         SDL_DestroyWindow(window);
  123.         TTF_Quit();
  124.         SDL_Quit();
  125.         return -1;
  126.     }

  127.     int quit = 0;
  128.     SDL_Event e;

  129.     // 主事件循环
  130.     while (!quit) {
  131.         while (SDL_PollEvent(&e)) {
  132.             if (e.type == SDL_QUIT) {
  133.                 quit = 1; // 点击窗口关闭按钮
  134.             } else if (e.type == SDL_MOUSEBUTTONDOWN && e.button.button == SDL_BUTTON_LEFT) {
  135.                 // 处理鼠标左键点击
  136.                 int clicked = check_click(&current_page, e.button.x, e.button.y);
  137.                 if (clicked == 1) {
  138.                     // 成功切换页面,立即重绘
  139.                     render_page(&current_page);
  140.                 } else if (clicked == -1) {
  141.                     fprintf(stderr, "目标文件不存在!\n");
  142.                 }
  143.             }
  144.         }

  145.         // 每帧渲染当前页面
  146.         render_page(&current_page);
  147.         SDL_Delay(16); // 控制帧率(约60 FPS)
  148.     }

  149.     // 清理资源
  150.     TTF_CloseFont(font);
  151.     SDL_DestroyRenderer(renderer);
  152.     SDL_DestroyWindow(window);
  153.     TTF_Quit();
  154.     SDL_Quit();
  155.     return 0;
  156. }
复制代码
终端编译

  1. gcc -o 0 0.c -lSDL2 -lSDL2_ttf
复制代码
编译生成一个名字为0的可执行文件,鼠标双击运行,可以显示中文,鼠标点击方括号,可以跳转。
 楼主| 发表于 2025-12-26 12:33:18 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-26 12:36 编辑

生活游戏12(文字按钮打开同名gif联动同名mp3).c
执行文件,打开执行文件同名的txt,txt里面得有[方括号内容],点击方括号,会打开方括号文字按钮同名的txt,gif,gif联动mp3(体积小)。要先准备同名文件txt,gif,mp3

  1. #define _GNU_SOURCE

  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <libgen.h>
  7. #include <sys/stat.h>
  8. #include <locale.h>

  9. #include <SDL2/SDL.h>
  10. #include <SDL2/SDL_ttf.h>
  11. #include <SDL2/SDL_image.h>
  12. #include <SDL2/SDL_mixer.h>

  13. // 配置
  14. #define MAX_BUTTONS 100
  15. #define MAX_TEXT_LEN 4000
  16. #define MAX_LINES 1000
  17. #define MAX_SEG_PER_LINE 100
  18. #define FONT_SIZE 24
  19. #define MARGIN 20

  20. // 播放类型(位标志)
  21. typedef enum {
  22.     PLAYBACK_NONE   = 0,
  23.     PLAYBACK_IMAGE  = (1 << 0),
  24.     PLAYBACK_GIF    = (1 << 1),
  25.     PLAYBACK_AUDIO  = (1 << 2)
  26. } PlaybackType;

  27. // GIF 帧
  28. typedef struct {
  29.     SDL_Texture *texture;
  30.     int delay_ms;
  31. } GIFFrame;

  32. // 按钮 & 段
  33. typedef struct Segment Segment;
  34. typedef struct Button Button;
  35. typedef struct Line Line;

  36. struct Segment {
  37.     char text[256];
  38.     int is_button;
  39.     int button_index;
  40. };

  41. struct Button {
  42.     char text[100];
  43.     SDL_Rect logical_rect;
  44. };

  45. struct Line {
  46.     Segment segs[MAX_SEG_PER_LINE];
  47.     int count;
  48.     int y;
  49. };

  50. // 页面结构
  51. typedef struct {
  52.     char filename[256];
  53.     char content[MAX_TEXT_LEN];
  54.     Button buttons[MAX_BUTTONS];
  55.     int button_count;
  56.     Line lines[MAX_LINES];
  57.     int line_count;
  58.     int total_height;
  59.     int window_w, window_h;
  60. } Page;

  61. // 全局变量
  62. SDL_Window *window = NULL;
  63. SDL_Renderer *renderer = NULL;
  64. TTF_Font *font = NULL;
  65. Page current_page = {0};
  66. int scroll_y = 0;

  67. // 播放状态(使用 int 存储位标志)
  68. int current_playback = PLAYBACK_NONE;
  69. SDL_Texture *current_image = NULL;
  70. int image_w = 0, image_h = 0;

  71. // GIF
  72. GIFFrame *gif_frames = NULL;
  73. int gif_frame_count = 0;
  74. int gif_current_frame = 0;
  75. Uint32 gif_last_time = 0;
  76. int gif_playing = 0;

  77. // 音频
  78. Mix_Music *current_music = NULL;

  79. // 函数声明
  80. void cleanup_playback();
  81. void start_image_playback(const char *path);
  82. void start_gif_playback(const char *path);
  83. void start_audio_playback(const char *path);
  84. const char* get_extension(const char* filename);
  85. int is_text_file(const char* ext);
  86. int is_image_file(const char* ext);
  87. int is_gif_file(const char* ext);
  88. int is_audio_file(const char* ext);
  89. int file_exists(const char *f);
  90. void get_desktop_workarea(int *w, int *h);
  91. int load_page(const char *filename);
  92. void layout_page();
  93. void render();
  94. char* get_exe_name();

  95. // ========================
  96. // 播放控制
  97. // ========================

  98. void cleanup_playback() {
  99.     if (current_playback & PLAYBACK_GIF) {
  100.         for (int i = 0; i < gif_frame_count; i++) {
  101.             if (gif_frames[i].texture)
  102.                 SDL_DestroyTexture(gif_frames[i].texture);
  103.         }
  104.         free(gif_frames);
  105.         gif_frames = NULL;
  106.         gif_frame_count = 0;
  107.         gif_playing = 0;
  108.         current_playback &= ~PLAYBACK_GIF;
  109.     }

  110.     if (current_playback & PLAYBACK_AUDIO) {
  111.         if (current_music) {
  112.             Mix_HaltMusic();
  113.             Mix_FreeMusic(current_music);
  114.             current_music = NULL;
  115.         }
  116.         current_playback &= ~PLAYBACK_AUDIO;
  117.     }

  118.     if (current_playback & PLAYBACK_IMAGE) {
  119.         if (current_image) {
  120.             SDL_DestroyTexture(current_image);
  121.             current_image = NULL;
  122.         }
  123.         current_playback &= ~PLAYBACK_IMAGE;
  124.     }
  125. }

  126. void start_image_playback(const char *path) {
  127.     cleanup_playback(); // 清空之前所有媒体
  128.     SDL_Surface *surf = IMG_Load(path);
  129.     if (!surf) {
  130.         fprintf(stderr, "IMG_Load failed: %s\n", IMG_GetError());
  131.         return;
  132.     }
  133.     current_image = SDL_CreateTextureFromSurface(renderer, surf);
  134.     image_w = surf->w;
  135.     image_h = surf->h;
  136.     SDL_FreeSurface(surf);
  137.     current_playback |= PLAYBACK_IMAGE;
  138. }

  139. void start_gif_playback(const char *path) {
  140.     cleanup_playback(); // 清空之前所有媒体
  141.     IMG_Animation *anim = IMG_LoadAnimation(path);
  142.     if (!anim) {
  143.         fprintf(stderr, "IMG_LoadAnimation failed: %s\n", IMG_GetError());
  144.         return;
  145.     }

  146.     gif_frame_count = anim->count;
  147.     gif_frames = calloc(gif_frame_count, sizeof(GIFFrame));
  148.     if (!gif_frames) {
  149.         IMG_FreeAnimation(anim);
  150.         return;
  151.     }

  152.     for (int i = 0; i < gif_frame_count; i++) {
  153.         if (anim->frames[i]) {
  154.             gif_frames[i].texture = SDL_CreateTextureFromSurface(renderer, anim->frames[i]);
  155.             gif_frames[i].delay_ms = anim->delays[i] > 0 ? anim->delays[i] : 100;
  156.         }
  157.     }

  158.     IMG_FreeAnimation(anim);
  159.     gif_current_frame = 0;
  160.     gif_last_time = SDL_GetTicks();
  161.     gif_playing = 1;
  162.     current_playback |= PLAYBACK_GIF;
  163. }

  164. void start_audio_playback(const char *path) {
  165.     // 不清理其他媒体!允许与 GIF 共存
  166.     if (current_music) {
  167.         Mix_HaltMusic();
  168.         Mix_FreeMusic(current_music);
  169.         current_music = NULL;
  170.     }

  171.     current_music = Mix_LoadMUS(path);
  172.     if (!current_music) {
  173.         fprintf(stderr, "Mix_LoadMUS failed: %s\n", Mix_GetError());
  174.         return;
  175.     }
  176.     if (Mix_PlayMusic(current_music, -1) == -1) {
  177.         fprintf(stderr, "Mix_PlayMusic failed: %s\n", Mix_GetError());
  178.         Mix_FreeMusic(current_music);
  179.         current_music = NULL;
  180.         return;
  181.     }
  182.     current_playback |= PLAYBACK_AUDIO;
  183. }
复制代码
 楼主| 发表于 2025-12-26 12:34:36 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-26 12:37 编辑

续上

  1. // ========================
  2. // 工具函数
  3. // ========================

  4. const char* get_extension(const char* filename) {
  5.     const char* dot = strrchr(filename, '.');
  6.     if (!dot || dot == filename) return "";
  7.     return dot + 1;
  8. }

  9. int is_text_file(const char* ext) { return strcmp(ext, "txt") == 0; }
  10. int is_image_file(const char* ext) {
  11.     return strcmp(ext, "png") == 0 || strcmp(ext, "jpg") == 0 ||
  12.            strcmp(ext, "jpeg") == 0 || strcmp(ext, "bmp") == 0;
  13. }
  14. int is_gif_file(const char* ext) { return strcmp(ext, "gif") == 0; }
  15. int is_audio_file(const char* ext) {
  16.     return strcmp(ext, "mp3") == 0 || strcmp(ext, "wav") == 0 || strcmp(ext, "ogg") == 0;
  17. }

  18. int file_exists(const char *f) {
  19.     struct stat buf;
  20.     return stat(f, &buf) == 0;
  21. }

  22. void get_desktop_workarea(int *w, int *h) {
  23.     SDL_Rect r;
  24.     if (SDL_GetDisplayUsableBounds(0, &r) == 0) {
  25.         *w = r.w; *h = r.h;
  26.     } else { *w = 800; *h = 600; }
  27. }

  28. // ========================
  29. // 页面加载与布局
  30. // ========================

  31. int load_page(const char *filename) {
  32.     FILE *fp = fopen(filename, "r");
  33.     if (!fp) return -1;
  34.     memset(&current_page, 0, sizeof(Page));
  35.     strcpy(current_page.filename, filename);
  36.     size_t len = fread(current_page.content, 1, MAX_TEXT_LEN - 1, fp);
  37.     current_page.content[len] = '\0';
  38.     fclose(fp);
  39.     scroll_y = 0;
  40.     return 0;
  41. }

  42. void layout_page() {
  43.     TTF_Font *f = font;
  44.     int font_h = TTF_FontHeight(f);
  45.     int line_spacing = font_h + 4;
  46.     int y = MARGIN;

  47.     current_page.line_count = 0;
  48.     current_page.button_count = 0;

  49.     char *content = strdup(current_page.content);
  50.     char *line_tok = strtok(content, "\n\r");
  51.     while (line_tok && current_page.line_count < MAX_LINES) {
  52.         Line *line = &current_page.lines[current_page.line_count];
  53.         line->count = 0;
  54.         line->y = y;

  55.         char *start = line_tok;
  56.         while (*start) {
  57.             while (*start == ' ') start++;
  58.             if (!*start) break;

  59.             char *end = start;
  60.             while (*end && *end != '[') end++;
  61.             if (end > start) {
  62.                 if (line->count < MAX_SEG_PER_LINE) {
  63.                     Segment *seg = &line->segs[line->count++];
  64.                     strncpy(seg->text, start, end - start);
  65.                     seg->text[end - start] = '\0';
  66.                     seg->is_button = 0;
  67.                 }
  68.                 start = end;
  69.             }

  70.             if (*start == '[') {
  71.                 char *close = strchr(start, ']');
  72.                 if (close) {
  73.                     if (line->count < MAX_SEG_PER_LINE) {
  74.                         Segment *seg = &line->segs[line->count++];
  75.                         strncpy(seg->text, start + 1, close - start - 1);
  76.                         seg->text[close - start - 1] = '\0';
  77.                         seg->is_button = 1;
  78.                         seg->button_index = current_page.button_count;

  79.                         Button *btn = &current_page.buttons[current_page.button_count++];
  80.                         strcpy(btn->text, seg->text);
  81.                     }
  82.                     start = close + 1;
  83.                 } else {
  84.                     break;
  85.                 }
  86.             }
  87.         }

  88.         if (line->count > 0) {
  89.             current_page.line_count++;
  90.             y += line_spacing;
  91.         }
  92.         line_tok = strtok(NULL, "\n\r");
  93.     }

  94.     free(content);
  95.     current_page.total_height = y + MARGIN;

  96.     // 计算按钮逻辑矩形(用于点击检测)
  97.     for (int i = 0; i < current_page.button_count; i++) {
  98.         Button *btn = &current_page.buttons[i];
  99.         int found = 0;
  100.         for (int li = 0; li < current_page.line_count && !found; li++) {
  101.             Line *line = &current_page.lines[li];
  102.             for (int si = 0; si < line->count; si++) {
  103.                 Segment *seg = &line->segs[si];
  104.                 if (seg->is_button && seg->button_index == i) {
  105.                     SDL_Surface *s = TTF_RenderUTF8_Blended(font, seg->text, (SDL_Color){0,0,0,255});
  106.                     if (s) {
  107.                         btn->logical_rect.x = MARGIN;
  108.                         for (int k = 0; k < si; k++) {
  109.                             SDL_Surface *prev = TTF_RenderUTF8_Blended(font, line->segs[k].text, (SDL_Color){0,0,0,255});
  110.                             if (prev) {
  111.                                 btn->logical_rect.x += prev->w;
  112.                                 SDL_FreeSurface(prev);
  113.                             }
  114.                         }
  115.                         btn->logical_rect.y = line->y;
  116.                         btn->logical_rect.w = s->w;
  117.                         btn->logical_rect.h = s->h;
  118.                         SDL_FreeSurface(s);
  119.                         found = 1;
  120.                         break;
  121.                     }
  122.                 }
  123.             }
  124.         }
  125.     }
  126. }

  127. void render() {
  128.     SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255);
  129.     SDL_RenderClear(renderer);

  130.     int font_h = TTF_FontHeight(font);
  131.     for (int i = 0; i < current_page.line_count; i++) {
  132.         Line *line = &current_page.lines[i];
  133.         int screen_y = line->y - scroll_y;
  134.         if (screen_y + font_h < 0) continue;
  135.         if (screen_y > current_page.window_h) break;
  136.         int x = MARGIN;
  137.         for (int j = 0; j < line->count; j++) {
  138.             Segment *seg = &line->segs[j];
  139.             SDL_Color color = seg->is_button ? (SDL_Color){200, 100, 100, 255}
  140.                                             : (SDL_Color){0, 0, 0, 255};
  141.             SDL_Surface *surf = TTF_RenderUTF8_Blended(font, seg->text, color);
  142.             if (surf) {
  143.                 SDL_Texture *tex = SDL_CreateTextureFromSurface(renderer, surf);
  144.                 if (tex) {
  145.                     SDL_Rect dst = {x, screen_y, surf->w, surf->h};
  146.                     if (dst.y + dst.h > 0 && dst.y < current_page.window_h) {
  147.                         SDL_RenderCopy(renderer, tex, NULL, &dst);
  148.                     }
  149.                     SDL_DestroyTexture(tex);
  150.                 }
  151.                 x += surf->w;
  152.                 SDL_FreeSurface(surf);
  153.             }
  154.         }
  155.     }
复制代码
 楼主| 发表于 2025-12-26 12:34:58 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-26 15:36 编辑

续上

  1.     // 绘制媒体内容(允许多个共存)
  2.     if (current_playback & PLAYBACK_IMAGE && current_image) {
  3.         int win_w, win_h;
  4.         SDL_GetRendererOutputSize(renderer, &win_w, &win_h);
  5.         float scale = fminf((float)win_w / image_w, (float)win_h / image_h) * 0.9f;
  6.         int draw_w = (int)(image_w * scale);
  7.         int draw_h = (int)(image_h * scale);
  8.         SDL_Rect dst = {(win_w - draw_w)/2, (win_h - draw_h)/2, draw_w, draw_h};
  9.         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 180);
  10.         SDL_RenderFillRect(renderer, NULL);
  11.         SDL_RenderCopy(renderer, current_image, NULL, &dst);
  12.     }
  13.     else if (current_playback & PLAYBACK_GIF && gif_playing && gif_frames) {
  14.         Uint32 now = SDL_GetTicks();
  15.         if (now - gif_last_time >= (Uint32)gif_frames[gif_current_frame].delay_ms) {
  16.             gif_last_time = now;
  17.             gif_current_frame = (gif_current_frame + 1) % gif_frame_count;
  18.         }
  19.         if (gif_frames[gif_current_frame].texture) {
  20.             int win_w, win_h;
  21.             SDL_GetRendererOutputSize(renderer, &win_w, &win_h);
  22.             SDL_SetRenderDrawColor(renderer, 0, 0, 0, 180);
  23.             SDL_RenderFillRect(renderer, NULL);
  24.             // 居中缩放 GIF(可选,也可全屏)
  25.             int img_w, img_h;
  26.             SDL_QueryTexture(gif_frames[gif_current_frame].texture, NULL, NULL, &img_w, &img_h);
  27.             float scale = fminf((float)win_w / img_w, (float)win_h / img_h) * 0.9f;
  28.             int draw_w = (int)(img_w * scale);
  29.             int draw_h = (int)(img_h * scale);
  30.             SDL_Rect dst = {(win_w - draw_w)/2, (win_h - draw_h)/2, draw_w, draw_h};
  31.             SDL_RenderCopy(renderer, gif_frames[gif_current_frame].texture, NULL, &dst);
  32.         }
  33.     }

  34.     SDL_RenderPresent(renderer);
  35. }

  36. char* get_exe_name() {
  37.     static char path[256];
  38.     ssize_t len = readlink("/proc/self/exe", path, sizeof(path) - 1);
  39.     if (len != -1) {
  40.         path[len] = '\0';
  41.         return basename(path);
  42.     }
  43.     return "生活游戏";
  44. }

  45. // ========================
  46. // 主函数
  47. // ========================

  48. int main(int argc, char *argv[]) {
  49.     setlocale(LC_ALL, "");

  50.     if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) goto fail;
  51.     if (TTF_Init() < 0) goto fail;
  52.     int img_flags = IMG_INIT_PNG | IMG_INIT_JPG;
  53.     if ((IMG_Init(img_flags) & img_flags) != img_flags) goto fail;
  54.     if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0) goto fail;

  55.     int desktop_w, desktop_h;
  56.     get_desktop_workarea(&desktop_w, &desktop_h);

  57.     window = SDL_CreateWindow("生活游戏", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
  58.                               desktop_w, desktop_h, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
  59.     if (!window) goto fail;

  60.     renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  61.     if (!renderer) goto fail;

  62.     font = TTF_OpenFont("/usr/share/fonts/truetype/wqy/wqy-microhei.ttc", FONT_SIZE);
  63.     if (!font) font = TTF_OpenFont("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", FONT_SIZE);
  64.     if (!font) font = TTF_OpenFont(NULL, FONT_SIZE); // fallback
  65.     if (!font) goto fail;

  66.     SDL_GetWindowSize(window, &current_page.window_w, &current_page.window_h);

  67.     char exe[256];
  68.     strcpy(exe, get_exe_name());
  69.     char init_file[300];
  70.     snprintf(init_file, sizeof(init_file), "%s.txt", exe);

  71.     if (!file_exists(init_file)) {
  72.         fprintf(stderr, "初始文件不存在: %s\n", init_file);
  73.         goto fail;
  74.     }

  75.     if (load_page(init_file) != 0) goto fail;
  76.     layout_page();

  77.     int running = 1;
  78.     SDL_Event e;
  79.     while (running) {
  80.         while (SDL_PollEvent(&e)) {
  81.             if (e.type == SDL_QUIT) {
  82.                 running = 0;
  83.             } else if (e.type == SDL_WINDOWEVENT) {
  84.                 if (e.window.event == SDL_WINDOWEVENT_RESIZED ||
  85.                     e.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
  86.                     current_page.window_w = e.window.data1;
  87.                     current_page.window_h = e.window.data2;
  88.                     layout_page();
  89.                 }
  90.             } else if (e.type == SDL_MOUSEWHEEL) {
  91.                 scroll_y -= e.wheel.y * 30;
  92.                 int max_scroll = current_page.total_height - current_page.window_h + 20;
  93.                 if (max_scroll < 0) max_scroll = 0;
  94.                 if (scroll_y < 0) scroll_y = 0;
  95.                 if (scroll_y > max_scroll) scroll_y = max_scroll;
  96.             } else if (e.type == SDL_MOUSEBUTTONDOWN) {
  97.                 if (current_playback != PLAYBACK_NONE) {
  98.                     // 点击任意位置关闭当前媒体
  99.                     cleanup_playback();
  100.                 } else {
  101.                     int mx = e.button.x, my = e.button.y;
  102.                     for (int i = 0; i < current_page.button_count; i++) {
  103.                         SDL_Rect log = current_page.buttons[i].logical_rect;
  104.                         SDL_Rect scr = {log.x, log.y - scroll_y, log.w, log.h};
  105.                         if (mx >= scr.x && mx <= scr.x + scr.w &&
  106.                             my >= scr.y && my <= scr.y + scr.h) {

  107.                             const char* btn_text = current_page.buttons[i].text;

  108.                             // === 新逻辑:支持 GIF + 音频 联动 ===
  109.                             cleanup_playback(); // 清空前一个媒体

  110.                             // 尝试加载 GIF
  111.                             char gif_path[300];
  112.                             snprintf(gif_path, sizeof(gif_path), "%s.gif", btn_text);
  113.                             if (file_exists(gif_path)) {
  114.                                 start_gif_playback(gif_path);
  115.                             }

  116.                             // 尝试加载音频(mp3/wav/ogg)
  117.                             const char* audio_exts[] = {"mp3", "wav", "ogg"};
  118.                             char audio_path[300];
  119.                             int audio_found = 0;
  120.                             for (int k = 0; k < 3; k++) {
  121.                                 snprintf(audio_path, sizeof(audio_path), "%s.%s", btn_text, audio_exts[k]);
  122.                                 if (file_exists(audio_path)) {
  123.                                     start_audio_playback(audio_path);
  124.                                     audio_found = 1;
  125.                                     break;
  126.                                 }
  127.                             }

  128.                             // 如果没有媒体,则尝试作为文本页面
  129.                             if (!file_exists(gif_path) && !audio_found) {
  130.                                 char txt_path[300];
  131.                                 snprintf(txt_path, sizeof(txt_path), "%s.txt", btn_text);
  132.                                 if (file_exists(txt_path)) {
  133.                                     if (load_page(txt_path) == 0) {
  134.                                         SDL_GetWindowSize(window, &current_page.window_w, &current_page.window_h);
  135.                                         layout_page();
  136.                                     }
  137.                                 }
  138.                             }

  139.                             break;
  140.                         }
  141.                     }
  142.                 }
  143.             } else if (e.type == SDL_KEYDOWN) {
  144.                 if (e.key.keysym.sym == SDLK_ESCAPE && current_playback != PLAYBACK_NONE) {
  145.                     cleanup_playback();
  146.                 }
  147.             }
  148.         }

  149.         render();
  150.         SDL_Delay(16);
  151.     }

  152. fail:
  153.     cleanup_playback();
  154.     if (font) TTF_CloseFont(font);
  155.     if (renderer) SDL_DestroyRenderer(renderer);
  156.     if (window) SDL_DestroyWindow(window);
  157.     if (current_music) {
  158.         Mix_FreeMusic(current_music);
  159.     }
  160.     Mix_CloseAudio();
  161.     Mix_Quit();
  162.     IMG_Quit();
  163.     TTF_Quit();
  164.     SDL_Quit();
  165.     return 0;
  166. }
复制代码
不断修改,当处理完gif动画播放,原本的图片显示不见了。需要人工或功能全组合可选。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 21:20 , Processed in 0.034606 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表