回 帖 发 新 帖 刷新版面

主题:文本方式下显示汉字的源程序

'$INCLUDE: 'qb.bi'
CLS
DIM SHARED ax AS INTEGER, bx AS INTEGER, cx AS INTEGER, dx AS INTEGER, es AS INTEGER, bp AS INTEGER
DIM test%(64)
es = VARSEG(test%(32)) '获得缓冲区的段址
DEF SEG = es
FOR i = 1 TO 96
   READ t
   POKE i, t
NEXT i
DEF SEG
bp = 1
ax = &H1100
bx = &H1000
cx = 6
dx = &HCC
int10
FOR i = 0 TO 5
   PRINT CHR$(&HCC + i);
NEXT i
END
DATA 0 , 32 , 19 , 16 , 0 , 7 , 240 , 16 , 17 , 16 , 23 , 16 , 20 , 24 , 16 , 3
DATA 32 , 40 , 252 , 32 , 32 , 254 , 146 , 84 , 16 , 148 , 254 , 32 , 32 , 80 , 140 , 4
DATA 2 , 1 , 63 , 32 , 64 , 31 , 0 , 0 , 1 , 255 , 1 , 1 , 1 , 1 , 5 , 2
DATA 0 , 0 , 252 , 4 , 8 , 224 , 64 , 128 , 4 , 254 , 0 , 0 , 0 , 0 , 0 , 0
DATA 16 , 16 , 35 , 34 , 74 , 251 , 18 , 34 , 67 , 246 , 74 , 3 , 26 , 226 , 66 , 2
DATA 128 , 72 , 252 , 8 , 8 , 248 , 0 , 4 , 254 , 148 , 148 , 252 , 148 , 148 , 148 , 12

SUB int10
    DIM InRegs AS RegTypeX
    DIM OutRegs AS RegTypeX
    InRegs.ax = ax
    InRegs.bx = bx
    InRegs.cx = cx
    InRegs.dx = dx
    InRegs.es = es
    InRegs.bp = bp
    INTERRUPTX &H10, InRegs, OutRegs
    ax = OutRegs.ax
    bx = OutRegs.bx
    cx = OutRegs.cx
    dx = OutRegs.dx
    es = OutRegs.es
    bp = OutRegs.bp

END SUB

回复列表 (共18个回复)

沙发

嘿,怎么好的程序竟然没人欣赏
顶一下

板凳

好是好,太高深了。
我想是大家很难理解罢了。

3 楼

不是没人欣赏,是不会,怎么欣赏呀

4 楼

这是一个并不好的例子,程序未有完善,经不起测试,如果全屏显示中文,将是乱成一片
,其中有许多代码是多余的,没有优化。有待完善,希望QB45能够作成可用的过程,期待中。。。。。。。。

5 楼

'将此程序改进了一下,做成了一个过程,但是
'还是不能完成实际的功能
'希望哪位高手能够把这个功能做出来
'方便大家使用
DECLARE SUB Textp (Lx%, LY%, Text$, Bfcolor%, BkColor%)
'$INCLUDE: 'qbx.bi'   '如果是 Quick Basic 4.5 的版本用 '$INCLUDE: 'qb.bi'
DEFINT A-Z
CLS
SCREEN 0, 0
tt$ = "文本模式下写汉字到屏幕功能并未完善"
Textp 2,10,tt$,4,1
end

Textp (Lx%, LY%, Text$, Bfcolor%, BkColor%)

    '********************************************************************
    ' 文本模式下,写汉字到屏幕
    ' Lx% Ly% 为要写到的位置
    ' Text$ 是要写的汉字
    ' BfColor% BkColor% 是前景色和背景色
    ' 使用时请把UCDOS的汉字字库文件hzk16,放到同目录下
    '********************************************************************
    
    STATIC reg AS RegTypeX                '定义中断类型变量
    STATIC Buff%()                        '定义字模缓冲
    STATIC Vseg%                          '定义字模地址变量

    STATIC Lc%, hzkfile%, byte$           '定义汉字字模文件变量
    IF Lc% = 0 THEN                       '第一次调用时初始化
       Lc% = 1
       REDIM Buff%(1024)                  '置缓冲变量
       Vseg% = VARSEG(Buff%(32))          '取缓冲地址
       hzkfile = FREEFILE                 '取打开汉字文件的一个空闲文件号
       OPEN "Hzk16" FOR RANDOM AS #hzkfile LEN = 32
       FIELD #hzkfile, 32 AS byte$        '置读取文件缓冲为 32 个字节
    END IF
    
    slen% = LEN(Text$)
    DEF SEG = Vseg%                          '置字模的段地址
    FOR LL% = 1 TO slen% STEP 2
       L% = ASC(MID$(Text$, LL%, 1)) - 161   '取汉字区码
       r% = ASC(MID$(Text$, LL%, 1)) - 160   '取汉字位码
       Index% = L% * 94 + r%                 '取字模位置
       GET #hzkfile, Index%                  '取字模数据
       FOR i% = 1 TO 16                      '写字模到内存
       POKE Sum + i%, ASC(MID$(byte$, i% * 2 - 1, 1))
       POKE Sum + i% + 16, ASC(MID$(byte$, i% * 2, 1))
       NEXT
       Sum = Sum + 32
    NEXT
    DEF SEG                                  '恢复地址
    
    Now% = Lx% * 80 + Ly% - 81
    reg.ax = &H1100                          '设置中断各寄存器
    reg.bx = &H1000
    reg.cx = 80
    reg.dx = Now%
    reg.es = Vseg%
    reg.bp = &H1
    InterruptX &H10, reg, reg                '调用中断 &H10  &H11号功能
    

    Loca% = Lx% * 160 + LY% * 2 - 162
    Clr% = BkColor% * 16 + Bfcolor%

    DEF SEG = &HB800                         '设置文本显示段地址
                                             '写汉字到屏幕
    FOR i = 1 TO slen%
       POKE Loca% + i * 2 - 2, Now% + i - 1
       POKE Loca% + i * 2 - 1, Clr%
    NEXT
    DEF SEG
END SUB

6 楼

第一个程序和第二个程序都有问题,函数你都没高好,还编程呢!

7 楼

第一个程序,这句有问题:




INTERRUPTX &H10, InRegs, OutRegs
    

8 楼

第二个程序没定义好函数就在用啊!

9 楼

我晕,你将它拷贝到QB中就可以用了,

-----------“第二个程序没定义好函数就在用啊!”-----------

你试一下看

10 楼

是不是要在7.1下运行,4.5版本下不能用呀

我来回复

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