| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2334 人关注过本帖
标题:[求助]关于点阵字模显示
只看楼主 加入收藏
沙漠水手
Rank: 2
等 级:论坛游民
帖 子:69
专家分:40
注 册:2007-3-17
结帖率:100%
收藏
 问题点数:0 回复次数:4 
[求助]关于点阵字模显示

/*************** 点阵字模工具编程辅助效果示例 ***************/

#include "Conio.h"
#include "graphics.h"
#define closegr closegraph

void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd=VGA,gm=VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
下面红色的显示我一点都不懂,这是WIN-TC下的一个示例,希望你们给我解释一下.我可能来不及看,明天我一定会仔细研究,先谢谢了.

void drawmat(char *mat,int matsize,int x,int y,int color)
/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/
{
int i, j, k, n;
n = (matsize - 1) / 8 + 1;
for(j = 0; j < matsize; j++)
for(i = 0; i < n; i++)
for(k = 0;k < 8; k++)
if(mat[j * n + i] & (0x80 >> k)) /*测试为1的位则显示*/
putpixel(x + i * 8 + k, y + j, color);
}
char guan48[]={
/* 以下是 '灌' 的 48点阵黑体 字模,288 byte */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0xC0,0x38,0x00,
0x03,0x00,0x03,0xC0,0x38,0x00,0x07,0x80,
0x03,0xC0,0x38,0x00,0x07,0xC0,0x03,0xC0,
0x38,0x00,0x03,0xF1,0xFF,0xFF,0xFF,0xFC,
0x01,0xF9,0xFF,0xFF,0xFF,0xFC,0x00,0x79,
0xF1,0xC0,0x39,0xFC,0x00,0x30,0x01,0xC0,
0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xF0,0xFF,0xE0,0x00,0x00,0xFF,0xF0,
0xFF,0xE0,0x00,0x00,0xE0,0x70,0xE0,0xE0,
0x0E,0x00,0xE0,0x70,0xE0,0xE0,0x1F,0x80,
0xE0,0x70,0xE0,0xE0,0x1F,0xE0,0xFF,0xF0,
0xFF,0xE0,0x07,0xF0,0xFF,0xF0,0xFF,0xE0,
0x01,0xF0,0xFF,0xF1,0xFF,0xE0,0x00,0x60,
0x08,0x07,0x00,0x00,0x00,0x20,0x1E,0x03,
0x80,0x00,0x00,0x00,0x1E,0x03,0x00,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0xF0,0x00,0x00,
0x3F,0xFF,0xFF,0xF0,0x00,0x00,0x3F,0xFF,
0xFF,0xF0,0x00,0x00,0x7C,0x03,0x80,0x00,
0x00,0x20,0x7C,0x03,0x80,0x00,0x00,0x70,
0xFC,0x03,0x80,0x00,0x00,0x71,0xFF,0xFF,
0xFF,0xE0,0x00,0x73,0xFF,0xFF,0xFF,0xE0,
0x00,0xF3,0xBC,0x03,0x80,0x60,0x00,0xE3,
0xBC,0x03,0x80,0x00,0x01,0xE1,0x3C,0x03,
0x80,0x00,0x01,0xC0,0x3F,0xFF,0xFF,0xE0,
0x01,0xC0,0x3F,0xFF,0xFF,0xE0,0x03,0xC0,
0x3F,0xFF,0xFF,0xE0,0x03,0x80,0x3C,0x03,
0x80,0x00,0x07,0x80,0x3C,0x03,0x80,0x00,
0x0F,0x80,0x3C,0x03,0x80,0x00,0x0F,0x00,
0x3F,0xFF,0xFF,0xF8,0x1F,0x00,0x3F,0xFF,
0xFF,0xF8,0x1F,0x00,0x3C,0x00,0x00,0x00,
0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};


int main(void)
{
int i, j;
initgr(); /* BGI初始化 */
drawmat(guan48, 48, 350, 110, RED);

getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
}

搜索更多相关主题的帖子: 点阵 字模 BGI void 
2007-09-21 19:37
沙漠水手
Rank: 2
等 级:论坛游民
帖 子:69
专家分:40
注 册:2007-3-17
收藏
得分:0 

唉,怎么没人来帮我啊?是不是我问的问题不对啊。

2007-09-22 12:05
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 

wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-09-22 22:22
沙漠水手
Rank: 2
等 级:论坛游民
帖 子:69
专家分:40
注 册:2007-3-17
收藏
得分:0 
太感谢了,等到今天终于有人帮我了,我会仔细研究的。
2007-09-23 10:01
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
void drawmat(char *mat,int matsize,int x,int y,int color)
/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/
{
int i, j, k, n;
n = (matsize - 1) / 8 + 1;
for(j = 0; j < matsize; j++)
for(i = 0; i < n; i++)
for(k = 0;k < 8; k++)
if(mat[j * n + i] & (0x80 >> k)) /*测试为1的位则显示*/
putpixel(x + i * 8 + k, y + j, color);
}

首先你要看清楚它的坐标关系,就可以分析出这个字模是按什么扫描的。
这里k是最内层的一个循环,基本上都有这个循环,它是用于遍历当前字节的所谓二进制位的,所以k固定是8次循环,每次判断byte中的一位。
再看i和j,

看内层循环i,,注意内层循环是什么将决定这个字模是按照什么方式排列的。
这里可见,i每循环一次,像素位置的横坐标向右前进了8个像素,所以这里很明显就是按行扫描了~。
也就是说,字模里面的字节是每6个byte(也就是代码里的n)为一行像素,从上倒下,一共分为了48行。

再看外层循环j,j每循环一次,纵坐标向下前进一个像素,可见j是当前所在的行号。

最后我在解释一下测试位的这行代码:
if(mat[j * n + i] & (0x80 >> k)) /*测试为1的位则显示*/
这里我们已经知道了,j是所在行号,i是当前行内的字节号(每8个像素距离为1个i),每一行有n个字节,因此当前的字节索引是就是j*n+i,
后面的0x80,写成二进制就是1000 0000,当k=0时,判断的是该字节的最高位,当k=7时,这个数字右移7位就是0000 0001,判断的是最低位。

字模数组这样表示:
char[0],[1],...,[5],     //第0行
    [6],[7],...,[11],    //第1行
    [12],[13],.,[17],    //第2行
     .....
2008-02-25 22:38
快速回复:[求助]关于点阵字模显示
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025183 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved