回 帖 发 新 帖 刷新版面

主题:Visual Fortran Console 彩色文本屏幕输出的方法

前几天看到有朋友讨论有关 Console 类型工程使用彩色字体输出的问题。

有人说 Fortran 这方面不在行,建议用 C 来实现,其实 C 也是使用外部的函数库的。如果单单为了这一点点东西就改用另一门语言,或者改用 QuickWin,似乎有点小题大做了。

仔细想想,其实彩色文字这方面平常我们也经常会需要的。比如程序碰到例外或出错了,我们都希望给出红色的错误提示,或者黄色的警告。于是就有了一个想法,写一个模块来实现彩色文本的窗口输出。(输出到文件当然就失效了)

翻了翻有关的 API 函数,大概能够实现了。拿出来大家共同探讨。

模块取名为 Colorized_Text_Mod 。使用了 Kernel32 这个 API 函数库的一些东西。所以,需要你的编译器有 API 的导入库。一般的 VF(CVF 和 IVF) 都是可以的,写程序的时候是在 IVF 下,如果 CVF 下通不过,一般把模块里的 Use Kernel32 改成 Use DFWin 就可以了。在 Linux 平台上跑的高手就不要笑话我了,那方面我还很欠缺。呵呵~~

先 Use Colorized_Text_Mod

使用之前必须先定义一个逻辑型变量来接收模块函数的返回值,比如:

[quote]Logical(kind=ctmKIND_LOGICAL) :: bRes[/quote]

调用 Colorized_Text_Mod 中的函数以后都可以判断失败或成功。失败时返回值为 ctmEXECUTE_ERROR 成功时则为 ctmEXECUTE_SUCCESS。

定义好以后需要初始化:

[quote]bRes = ctm_Init()[/quote]

通过调用函数 ctm_SetColor 来改变当前的颜色:

[quote]bRes = ctm_SetColor( iColorValue , wFlag )[/quote]

参数定义为:
[quote]Integer(kind=ctmKIND_COLOR) , Intent( IN ) :: iColorValue
Integer(kind=ctmKIND_FLAG) , Intent( IN ) :: wFlag[/quote]

iColorValue 为颜色索引值,一共有 16 种颜色可以选择,建议直接使用定义好的常量,使用其他量的时候应该定义为 Integer(kind=ctmKIND_COLOR),并且小于等于16,大于等于0。十六个定义好的常量有:
[quote]ctmCOLOR_BLACK        0  黑色
ctmCOLOR_BLUE         1  蓝色
ctmCOLOR_GREEN        2  绿色
ctmCOLOR_CYAN         3  青色
ctmCOLOR_RED          4  红色
ctmCOLOR_MAGENTA      5  紫色
ctmCOLOR_BROWN        6  棕色
ctmCOLOR_LIGHTGRAY    7  浅灰色
ctmCOLOR_DARKGRAY     8  深灰色
ctmCOLOR_LIGHTBLUE    9  亮蓝色
ctmCOLOR_LIGHTGREEN   10 亮绿色
ctmCOLOR_LIGHTCYAN    11 亮青色
ctmCOLOR_LIGHTRED     12 亮红色
ctmCOLOR_LIGHTMAGENTA 13 亮紫色
ctmCOLOR_YELLOW       14 黄色
ctmCOLOR_WHITE        15 白色[/quote]

wFlag 指定需要设定的是文本颜色还是背景颜色。指定为 ctmSET_TEXT 代表要设定文本颜色,指定为 ctmSET_BG 代表要设定背景颜色。
测试发现改变背景颜色很不好看,建议就不要使用了。

通过调用 ctm_ResetColor( wFlag ) 恢复默认的显示方式
wFlag 可以指定为 ctmSET_TEXT 代表要恢复文本颜色,指定为 ctmSET_BG 代表要恢复背景颜色,指定为 ctmSET_BOTH 代表恢复文本和背景颜色。

最后调用 ctm_UnInit 结束 :
[quote]bRes = ctm_UnInit()[/quote]
ctm_UnInit 内部会调用 ctm_ResetColor( ctm_SET_BOTH ) 恢复文本和背景颜色的显示。

举一个例子:
[quote]
Program Main
  Use Colorized_Text_Mod
  Implicit None
  Logical(kind=ctmKIND_LOGICAL) :: bRes
  bRes = ctm_Init()
  If ( .Not.bRes ) then
    write(*,*) '初始化失败!'
  EndIf
  bRes = ctm_SetColor( ctmCOLOR_BLUE , ctmSET_TEXT )
  Write(*,*) '蓝色文字'
  bRes = ctm_ResetColor( ctmSET_TEXT )
  Write(*,*) '恢复文字显示颜色'
  bRes = ctm_SetColor( ctmCOLOR_RED , ctmSET_TEXT )
  Write(*,*) '红色文字'
  bRes = ctm_SetColor( ctmCOLOR_YELLOW , ctmSET_BG )
  Write(*,*) '黄色背景'
  bRes = ctm_ResetColor( ctmSET_BG )
  Write(*,*) '恢复背景显示颜色,保留字体颜色'
  bRes = ctm_SetColor( ctmCOLOR_GREEN , ctmSET_BG )
  Write(*,*) '绿色背景'
  bRes = ctm_UnInit()
  Write(*,*) '恢复默认样式'
  Read(*,*)
End Program Main[/quote]

源码和例子都在附件中,喜欢的朋友可以拿去。

回复列表 (共37个回复)

沙发


楼主真强,这样的方法都能想到。受楼主API方法启发,我来一个linux版本的,忝列在这个贴里面,用call system调用系统命令echo改变bash的字符颜色。。用g95编译通过并测试成功。测试环境为suse 10 + GNOME + g95 + bash + Gnome Terminal

[quote]
program test
    call system('echo -ne "color\33[1m\33[31m"')
    call system('echo -ne "color\33[1m\33[32m"')
    call system('echo -ne "color\33[1m\33[33m"')
    call system('echo -ne "color\33[1m\33[34m"')
    call system('echo -ne "color\33[1m\33[35m"')
    call system('echo -ne "color\33[1m\33[36m"')
    call system('echo -ne "color\33[1m\33[37m"')
    call system('echo -ne "color\33[1m\33[38m"')
    call system('echo -ne "color\33[1m\33[39m"')
end program test
[/quote]

板凳

昨天想在 Ftn95 上也用用,可惜 Ftn95 对 API 的接口很老,有好几个函数和结构体都缺少。

想了一些办法,修改了 Include 中的几个文件,总算可以实现了。

但是修改方法还真是比较麻烦,所以就提供一下 Ftn95 的 Lib 静态函数库吧。
(实现的代码基本还是一样的,所以不再单独写代码了)

使用办法就是复制 Lib 和 Mod 文件到 Include 下,然后添加 Lib 为工程的 Reference 就可以了。

文件已经包含在帖子附件中了。

如果使用 Plato3 环境,在编辑环境下点击 Run,可能看到的效果有一点点不同,这个问题不用担心,单独运行 Debug 下的 EXE 就不会有问题了。

3 楼

仰慕死二位了!!

4 楼

强烈建议置顶,路过的朋友都支持一下

5 楼

好的,顶

6 楼

谢谢分享

偶学习一下,赫赫

7 楼

本人有种看世间高手华山论剑的感觉,仰视ing。。。。

8 楼

[quote]本人有种看世间高手华山论剑的感觉,仰视ing。。。。[/quote]

别把有些事情想的那么难。。。

9 楼

不能理解你们说的啥啊,郁闷.

10 楼

很好的东西,谢谢分享!

我来回复

您尚未登录,请登录后再回复。点此登录或注册