文章列表
 
您正在查看 "程序设计" 分类下的文章

2008-05-21 10:11
汉字库原理
2008-04-29 20:54

※点阵汉字显示原理及其在点阵 LCD&LED 中的应用※        

--------------------------------------------------------------------------------
摘要: 本文主要论述汉字的显示原理,并详细阐述了如何创建点阵字库,如何在点阵 LCD&LED 进行扫描显示的原理,还阐述了如何根据不同的字符编码标准,来存取数据,使您的系统可以和计算机兼容,并象计算机一样能显示各种字符。
关键字: 位( bit )、字节( byte )、字模、计算机内码( ASCII )、 UNICODE 编码
提示: 如果没有特别提示,本文所提到的字库都是指点阵字库

--------------------------------------------------------------------------------
问题引入
大千世界中,有很多物质都可以看作是由很小很小的点(例如:分子、原子)组成的,当然,您所看到的字符也不例外。假设我们把一个字符分成若干个可视的点组成,换句话来说,就是一个个点组成了我们看到的字符。假设您的电脑显示器是液晶的,您不妨仔细的看看,每一个字符或图形都是由一个个的点组成的,只是这些点很小,小得让您不容易发现而已(仔细看看还是不难发现呀!);由此,我们引入点阵字符的概念,从微观的电子信号 0 或 1 ,到宏观可视的字符,足以让我们感叹这世界真是丰富多彩,奥妙无穷啊!
字模数据
首先,从我们常用的计算机系统谈起,再扩展到我们要开发设计的点阵 LCD&LED 显示系统中去,其实单片机系统的显示原理和计算机是一样的。在计算机中,所有的数据(包括指令等)都是以 0 和 1 来表示的,这意味着,如果我们想要在显示器上显示字符,那么这些字符的信息将也会是以 0 、 1 来保存显示的。那么计算机是如何来存贮显示字符的呢?下面我们举例来说明点阵字符的数据存贮及显示原理(这里我们主要讨论的是点阵字符,故有关计算机矢量字符的显示及其原理这里就不作说明,而且单片机的寻址和计算能力远不及 PC ,故显示矢量的字符还是有一定的困难)。假设我们把计算机液晶显示器上显示 16x16 点阵的“汉”字放大 10 倍。放大之后,每一个小方格代表一个点,黑色的为 1 ,白色为 0 ;每一个点看作为一位( bit )。据此可以描绘出“豪”字的位( bit )信息。采用行扫描的方式,每八位( bit )为一个字节,这里采用十六进制表示,这样就得到了字模数据。由上述的示例,我们可以清晰的了解到可视字符、位信息与字模数据之间的关系。清楚了上面的关系之后,我们就可以自己编写一个字模数据生成工具了。
[点阵异常处理] 假设字符的点阵不是 8 的倍数怎么办呢?通常情况下可以不计或在后面以 4 个 0 位补足 8 位都可,例如: 12x12 点阵的汉字,以本人编写的字模工具软件 为例,是这样处理的:先假设对 12x12的点阵字符进行扫描,第一行的前8位为一个字节,第一行的后面4位形成一个字节,以后的每行逐次类推,直到扫描到最后一行,行成一个完整可用的字模数据。
点阵字库
把上述很多很多字符的字模数据按照一定的排列顺序存放在一起,就形成了点阵字库。这里所讲的字库是广义的,可以是文件,也可以是其他的东东,例如:数组、 DB 表等等所有可以存取数据的形式。有的点阵字库还带有索引表,用来方便程序的编写及查询。
在计算机中如何显示一个字符
在计算机中是如何把点阵字符显示出来的呢?其实字符的显示过程是字模数据创建的逆过程。首先我们要明白字模数据的排列扫描方式,然后再把 16 进制的字模数据变成位( bit )信息,最后才能根据位信息按照字模数据给定的扫描方式逐个把点描绘出来。光说还是不行的,最好我们亲自动手来实验一下,先假定我们要用行扫描的显示方式,在计算机中显示一个“豪”字,我们可以使用字模软件来创建一个字模数据,设定为行扫描、 16x16 点阵、宋体、 11 号字, 创建如下字模数据:
    unsigned char hao0[]={
    0x00,0x00, 0x00,0x80, 0x3F,0xFC, 0x00,0x00,
    0x07,0xF0, 0x04,0x10, 0x3F,0xFE, 0x20,0x02,
    0x4F,0xF4, 0x05,0x20, 0x1A,0xC0, 0x04,0xA0,
    0x1B,0x58, 0x04,0x46, 0x19,0x80, 0x00,0x00
    };
则 C 语言全部显示代码描述如下:
    unsigned char cmp_w[8]={128,64,32,16,8,4,2,1}; // 用于取位
    unsigned char hao0[]={ /* 字模数组 */
    0x00,0x00, 0x00,0x80, 0x3F,0xFC, 0x00,0x00,
    0x07,0xF0, 0x04,0x10, 0x3F,0xFE, 0x20,0x02,
    0x4F,0xF4, 0x05,0x20, 0x1A,0xC0, 0x04,0xA0,
    0x1B,0x58, 0x04,0x46, 0x19,0x80, 0x00,0x00
    };
    void FontDisplay(int x, int y, unsigned char * FontModule) ; /*16x16 单个字符行扫描函数 */
    void FontDisplay(int x, int y, unsigned char * FontModule)
    {/*x: 水平偏移坐标, y: 垂直偏移坐标 */
        for(int row=0;row<16;row++)
        {
            for(int c=0;c<8;c++)
                if((FontModule[row*2]&cmp_w[c])!=0)
                    putpixel(c+x,row+y,15);/* 画一个点 */
            for(c=0;c<8;c++)
                if((FontModule[row*2+1]&cmp_w[c])!=0)
                    putpixel(c+8+x,row+y,15);
        }
    }
    main()
    {/* 调用显示主程序 */
        FontDisplay(5,5, hao0 );
    }

上述代码直接拷贝即可用,假设你的系统需要显示的字符不多,直接使用上面的代码或稍做修改,直接编译烧写到芯片里,即可满足一般点阵字符显示的需求,而不需要制作大的文件字库,节省有限的 ROM 空间,编程又极其简单。假设我们要显示一串字符,把这一串字符拷贝到字模工具软件里,字模 软件会为每个字符产生一个字模数组,我们在程序里按字符显示的顺序依次调用 FontDisplay(int x,int y, unsigned char * FontModule) 即可连续把字符显示出来。记着把显示的偏移位置递增一个字符宽度呀( x 或 y )!否则就重叠看不清了。不要笑俺,俺就犯过如此愚钝的错误!
备注 : putpixel(int x,int y,int color) 函数
x,y为坐标,color为颜色值.该函数在(x,y)点设定象素的颜色.由于硬件的不同,也许提供的函数不同,用户可把此函数作为参考,必要时用硬件提供的函数取而代之。
前面提到的是 16x16点阵的字符的显示方案和程序例程。但往往我们在开发产品的时候,可能因为产品的体积定位较小,从而需要使用更小的液晶来显示;也可能为了显示更多的字符;还可能为了节约成本,使用较小的存贮器、计算能力一般的廉价单片机,或者压根不要存贮芯片,直接把字模数据和程序一起烧在单片机里边。上述的情况都有可能,解决的最好办法就是减小点阵的大小,点阵小,自然字模数据就小,存贮、扫描、计算的开销相对也小。但太小的点阵又不容易识别,为此,在汉显方面,本人根据经验推荐使用12x12点阵。并在此给出一个12x12点阵的示例,供大家学习和交流之用。当然,12x12点阵的汉字在LCD和LED显示屏中是最常用的,其优点就不言而喻了。
    unsigned char hao0[]={
    0x04,0x0, 0xFF,0xE, 0x1F,0x8, 0x10,0x8,
    0xFF,0xE, 0x80,0x2, 0x3F,0xC, 0x54,0x8,
    0x2B,0x0, 0x12,0x8, 0x6E,0x6, 0x00,0x0
    };
    unsigned char cmp_w[8]={128,64,32,16,8,4,2,1};
    void FontDisplay(int x, int y, unsigned char *FontModule);
    void FontDisplay(int x, int y, unsigned char *FontModule)
    {/*12x12扫描显示函数*/
        for(int row=0;row<12;row++)
        {
            for(int c=0;c<8;c++)
                if((FontModule[row*2]&cmp_w[c])!=0)
                    putpixel(c+x,row+y,15);
            for(c=0;c<4;c++)
                if((FontModule[row*2+1]&cmp_w[c+4])!=0)
                    putpixel (c+8+x,row+y,15);
        }
    }
    main()
    {/*调用显示主程序*/
        FontDisplay(5,5, hao0 );
    }
几种常用的字符动态编码显示方案分析
直接固化显示字模数据: 将要显示的字符的字模数据通过字模软件提取出来,顺序烧在存贮器中,当程序要显示的时候,直接提取送显示屏。优点是易理解、实现程序简单、空间资源占用少;缺点:组织字模数据及寻址比较麻烦,可维护性及灵活性差。针对其缺点并不是没有解决的办法,作者推荐前面提到的汉字字模工具,它可按汉字的拼音批量生成字模数组或汇编 DB 表,直接拷贝到程序里即可用,这样的字模数据可以方便灵活的根据以拼音命名的方式进行寻址。用户在使用的时候,直接用汉字的拼音代替字符串中相应的汉字,显示程序则直接调用该地址的字模数据进行显示。前面在计算机中如何显示一个字符中所提到的 C 语言示例就是本方案,灵活方便吧。
创建索引表和点阵字模库: 索引表包括字符机内码和该字符在字库中的偏移地址。如果字符的机内码的排列顺序和字符的字模数据在字库里的排列顺序一致,偏移地址则可通过计算的方式给出( offset= 该字符机内码在索引中的位置 No. * 单个字符的字模数据所占的字节数 bytes ;由本人编写的 汉字字模点阵数据批量生成工具 V5.0以上版本可创建机内码索引表 )。在显示的时候,先得到字符的机内码,再得到该字符机内码在索引中的位置,最后计算出该字符在字库中的偏移地址并从字库中取出字模数据进行扫描显示即可。此方法的优点是灵活方便,占用空间小;但需要复杂的查询、计算、寻址取模等过程。如果字稍多,单个字的显示时间就会很长,会使系统显得慢,效率低
创建连续的大字库: 根据字符编码,利用字模软件创建连续的大字库,然后再根据字符编码直接计算出该字符在字库中的位置,最后取模显示。这种方法非常灵活,但是需要计算寻址,因为字库较大,所以寻址的时间可能会较长,显示速度较慢。如果你的系统用的是高速芯片(例如: ARM 、 DSP ),大容量的存贮器件,这些对你来说不算什么,这种方法最适用你,因为这种方法程序易维护、不需经常修改字库、而且兼容性很强。当然,电子信息发展到今天,芯片的计算能力已不是什么大的问题,越来越多的存贮芯片不断推出,价格低廉,为我们的开发奠定了很好的基础。同志们,努力吧!展望一下明天,还是很美好的呀!
......要阅读更多更详尽的内容,请 下载本文     点击这里 下载字模软件工具
符24x24点阵水平扫描C语言示例代码:
unsigned char mo[]={
0x00,0x00,0x00, 0x00,0x00,0x00, 0x07,0x0C,0xC0, 0x06,0x0C,0xC0,
0x06,0x0C,0xDC, 0x06,0x7F,0xF0, 0x06,0xCC,0xC0, 0x1F,0xF0,0x70,
0x06,0x3F,0xF0, 0x07,0x30,0x70, 0x0F,0xBF,0xF0, 0x0E,0xF0,0x70,
0x1E,0xF0,0x70, 0x1E,0x3F,0xF0, 0x36,0x06,0x18, 0x06,0xFF,0xFC,
0x06,0x07,0x00, 0x06,0x0F,0x80, 0x06,0x0C,0xE0, 0x06,0x38,0x7C,
0x06,0xE0,0x18, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00
};
unsigned char cmp_w[8]={128,64,32,16,8,4,2,1};
void FontDisplay(int x, int y, unsigned char * FontModule)
{
    for(int row=0;row<24;row++)
    {
        for(int c=0;c<8;c++)
            if((FontModule[row*3]&cmp_w[c])!=0)
                putpixel(c+x,row+y,15);
        for(c=0;c<8;c++)
            if((FontModule[row*3+1]&cmp_w[c])!=0)
                putpixel(c+8+x,row+y,15);
        for(c=0;c<8;c++)
            if((FontModule[row*3+2]&cmp_w[c])!=0)
                putpixel(c+16+x,row+y,15);
     }
}


边框汉显 一维数组实现举例:
unsigned short FontOrg1[]={
/* @中 [Font Model Tool] */
0x00,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x08, 0x3F,0xFC, 0x21,0x08, 0x21,0x08, 0x21,0x08, 0x21,0x08, 0x3F,0xF8, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x00,0x00};
unsigned short FontOrg2[]={
/* @国 [Font Model Tool] */
0x00,0x00, 0x00,0x04, 0x3F,0xFE, 0x20,0x04, 0x2F,0xF4, 0x21,0x04, 0x21,0x04, 0x27,0xE4, 0x21,0x44, 0x21,0x24, 0x21,0x04, 0x2F,0xFC, 0x20,0x04, 0x3F,0xFC, 0x20,0x04, 0x00,0x00};
unsigned short FontOrg3[]={
/* @移 [Font Model Tool] */
0x00,0x00, 0x04,0x20, 0x0E,0x20, 0x38,0x7C, 0x08,0x88, 0x09,0x50, 0x7E,0x20, 0x09,0xC0, 0x1C,0x24, 0x2A,0x7E, 0x28,0xC4, 0x4B,0x28, 0x08,0x10, 0x08,0x60, 0x0B,0x80, 0x00,0x00};
unsigned short FontOrg4[]={
/* @动 [Font Model Tool] */
0x00,0x00, 0x00,0x20, 0x00,0x20, 0x3E,0x20, 0x00,0x24, 0x00,0xFE, 0x7F,0x24, 0x08,0x24, 0x08,0x24, 0x12,0x24, 0x22,0x44, 0x7F,0x44, 0x20,0x84, 0x01,0x14, 0x02,0x08, 0x00,0x00};

unsigned short FontEdge1[]={
/* @中 [Font Model Tool] */
0x03,0x80, 0x02,0x80, 0x02,0x9C, 0x7E,0xF6, 0x40,0x02, 0x5E,0xF6, 0x52,0x94, 0x52,0x94, 0x5E,0xF4, 0x40,0x04, 0x7E,0xFC, 0x02,0x80, 0x02,0x80, 0x02,0x80, 0x02,0x80, 0x03,0x80};
unsigned short FontEdge2[]={
/* @国 [Font Model Tool] */
0x00,0x0E, 0x7F,0xFB, 0x40,0x01, 0x5F,0xFB, 0x50,0x0A, 0x5E,0xFA, 0x5E,0xFA, 0x58,0x1A, 0x5E,0xBA, 0x52,0xDA, 0x5E,0xFA, 0x50,0x02, 0x5F,0xFA, 0x40,0x02, 0x5F,0xFA, 0x70,0x0E};
unsigned short FontEdge3[]={
/* @移 [Font Model Tool] */
0x0E,0x70, 0x1B,0x50, 0x71,0xDE, 0x47,0x82, 0x77,0x76, 0xF6,0xAC, 0x81,0xD8, 0xF6,0x3E, 0x63,0xDB, 0x55,0x81, 0xD7,0x3B, 0xB4,0xD6, 0xF7,0xEC, 0x17,0x98, 0x14,0x70, 0x1F,0xC0};
unsigned short FontEdge4[]={
/* @动 [Font Model Tool] */
0x00,0x70, 0x00,0x50, 0x7F,0x50, 0x41,0x5E, 0x7F,0xDB, 0xFF,0x01, 0x80,0xDB, 0xF7,0xDA, 0x37,0x5A, 0x6D,0xDA, 0xDD,0xBA, 0x80,0xAA, 0xDF,0x7A, 0x76,0xEA, 0x05,0xB6, 0x07,0x1C};

const unsigned short FontProp[][]={
{2,1,12,14}, /* 中 [Font Model Tool]*/
{2,1,13,14}, /* 国 [Font Model Tool]*/
{1,1,14,14}, /* 移 [Font Model Tool]*/
{1,1,14,14} /* 动 [Font Model Tool]*/
}

    main()
    {/*调用显示主程序*/
        FontDisplay(8,5, FontOrg1); FontDisplay(8,5, FontEdge1);
        FontDisplay(24,5, FontOrg2); FontDisplay(24,5, FontEdge2);
        FontDisplay(40,5, FontOrg3); FontDisplay(40,5, FontEdge3);
        FontDisplay(56,5, FontOrg4); FontDisplay(56,5, FontEdge4);
    }

边框汉显 二维数组实现举例:
const unsigned short FontOrg[4][32]={
/* @中 [Font Model Tool] */
{0x00,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x08, 0x3F,0xFC, 0x21,0x08, 0x21,0x08, 0x21,0x08, 0x21,0x08, 0x3F,0xF8, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x01,0x00, 0x00,0x00},
/* @国 [Font Model Tool] */
{0x00,0x00, 0x00,0x04, 0x3F,0xFE, 0x20,0x04, 0x2F,0xF4, 0x21,0x04, 0x21,0x04, 0x27,0xE4, 0x21,0x44, 0x21,0x24, 0x21,0x04, 0x2F,0xFC, 0x20,0x04, 0x3F,0xFC, 0x20,0x04, 0x00,0x00},
/* @移 [Font Model Tool] */
{0x00,0x00, 0x04,0x20, 0x0E,0x20, 0x38,0x7C, 0x08,0x88, 0x09,0x50, 0x7E,0x20, 0x09,0xC0, 0x1C,0x24, 0x2A,0x7E, 0x28,0xC4, 0x4B,0x28, 0x08,0x10, 0x08,0x60, 0x0B,0x80, 0x00,0x00},
/* @动 [Font Model Tool] */
{0x00,0x00, 0x00,0x20, 0x00,0x20, 0x3E,0x20, 0x00,0x24, 0x00,0xFE, 0x7F,0x24, 0x08,0x24, 0x08,0x24, 0x12,0x24, 0x22,0x44, 0x7F,0x44, 0x20,0x84, 0x01,0x14, 0x02,0x08, 0x00,0x00}
}
const unsigned short FontEdge[4][32]={
/* @中 [Font Model Tool] */
{0x03,0x80, 0x02,0x80, 0x02,0x9C, 0x7E,0xF6, 0x40,0x02, 0x5E,0xF6, 0x52,0x94, 0x52,0x94, 0x5E,0xF4, 0x40,0x04, 0x7E,0xFC, 0x02,0x80, 0x02,0x80, 0x02,0x80, 0x02,0x80, 0x03,0x80},
/* @国 [Font Model Tool] */
{0x00,0x0E, 0x7F,0xFB, 0x40,0x01, 0x5F,0xFB, 0x50,0x0A, 0x5E,0xFA, 0x5E,0xFA, 0x58,0x1A, 0x5E,0xBA, 0x52,0xDA, 0x5E,0xFA, 0x50,0x02, 0x5F,0xFA, 0x40,0x02, 0x5F,0xFA, 0x70,0x0E},
/* @移 [Font Model Tool] */
{0x0E,0x70, 0x1B,0x50, 0x71,0xDE, 0x47,0x82, 0x77,0x76, 0xF6,0xAC, 0x81,0xD8, 0xF6,0x3E, 0x63,0xDB, 0x55,0x81, 0xD7,0x3B, 0xB4,0xD6, 0xF7,0xEC, 0x17,0x98, 0x14,0x70, 0x1F,0xC0},
/* @动 [Font Model Tool] */
{0x00,0x70, 0x00,0x50, 0x7F,0x50, 0x41,0x5E, 0x7F,0xDB, 0xFF,0x01, 0x80,0xDB, 0xF7,0xDA, 0x37,0x5A, 0x6D,0xDA, 0xDD,0xBA, 0x80,0xAA, 0xDF,0x7A, 0x76,0xEA, 0x05,0xB6, 0x07,0x1C}
}

    unsigned char cmp_w[8]={128,64,32,16,8,4,2,1};
    void DrawFontOrg(int x, int y, int dim);
    void DrawFontEdge(int x, int y, int dim);

    void DrawFontOrg(int x, int y, int dim)
    {/*16x16扫描显示函数*/
        for(int row=0;row<16;row++)
        {
            for(int c=0;c<8;c++)
                if((FontOrg[dim][row*2]&cmp_w[c])!=0)
                    putpixel(c+x,row+y,0);/* 画一个点 */
            for(c=0;c<8;c++)
                if((FontModule[dim][row*2+1]&cmp_w[c])!=0)
                    putpixel(c+8+x,row+y,0);
        }
    }

    void DrawFontEdge(int x, int y, int dim)
    {/*16x16扫描显示函数*/
        for(int row=0;row<16;row++)
        {
            for(int c=0;c<8;c++)
                if((FontEdge[dim][row*2]&cmp_w[c])!=0)
                    putpixel(c+x,row+y,15);/* 画一个点 */
            for(c=0;c<8;c++)
                if((FontEdge[dim][row*2+1]&cmp_w[c])!=0)
                    putpixel(c+8+x,row+y,15);
        }
    }
    main()
    {/*调用显示主程序*/
        DrawFontOrg(8,5,0); DrawFontEdge(8,5,0);
        DrawFontOrg(24,5,1); DrawFontEdge(24,5,1);
        DrawFontOrg(40,5,2); DrawFontEdge(40,5,2);
        DrawFontOrg(56,5,3); DrawFontEdge(56,5,3);
    }


 
2008-05-21 9:58
Crazy Bugs   这是本站的Logo,感谢 ->布瓜大虾帮忙制作 :)
唯 C 世界   唯C论坛十分出色...
TC256 专题站   TC编程网站,开发了举世闻名的WIN-TC...
VRIXPWorld   关于OS和图形编程的网站,高手请进...
  Zane Studio   游戏编程的网站,太酷了...
梦幻坊乐园   网友SZK的编程站,可以找到好多有趣的代码和文章哦...
金点时空   《圣剑英雄传》系列是其特色作品...
  水银沼泽地   一个非常另类的MM的另类的游戏制作站...
  Kane的游戏编程网站   关于3D游戏开发的网站,《游戏编程指南》很有价值...
中国游戏开发资源网   游戏开发的各方面文章都可以在此找到...
  中国游戏开发者   大量游戏开发理论,比较艰深一些...
  新 DOS 时代   关于 DOS 的丰富资源站点...
中国MIDI音乐网   有很多原创midi音乐,去寻求游戏制作的合作伙伴吧...
   
 
2008-05-21 9:44

原文地址:http://tieba.baidu.com/f?kz=7359496

/* 显示16*16和12*12点阵汉字的演示 */
/* */
/* Little Tiger 2003.11.13 */
/* */
/* 需要使用 HZK16,HZK12,ASC16文件 */
/* */
/******************************************/

#include<stdio.h>
#include<graphics.h>

/* 显示16*16点阵汉字函数,使用HZK16文件,x,y为显示坐标,s为显示字符串,colour为颜色 */
void hanzi16(int x,int y,char *s,int colour)
{
FILE *fp;
char buffer[32];
register i,j,k;
unsigned char qh,wh;
unsigned long location;
if((fp=fopen("hzk16","rb"))==NULL)
{
printf("Can't open hzk16!");
getch();
exit(0);
}
while(*s)
{
qh=*s-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*32L;
fseek(fp,location,SEEK_SET);
fread(buffer,32,1,fp);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j+k,y+i,colour);
s+=2;
x+=16;
}
fclose(fp);
}

/* 显示12*12点阵汉字函数,使用HZK12文件,x,y为显示坐标,s为显示字符串,colour为颜色 */
void hanzi12(int x,int y,char *s,int colour)
{
FILE *fp;
char buffer[24];
register i,j,k;
unsigned char qh,wh;
unsigned long location;
if((fp=fopen("hzk12","rb"))==NULL)
{
printf("Can't open hzk12!");
getch();
}
while(*s)
{
qh=*(s)-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*24L;
fseek(fp,location,SEEK_SET);
fread(buffer,24,1,fp);
for(i=0;i<12;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if((buffer[i*2+j]>>(7-k))&0x1)
putpixel(x+8*j+k,y+i,colour);
s+=2;
x+=12;
}
fclose(fp);
}

/* 中英文混合输出函数,使用HZK16,ASC16文件,x,y为显示坐标,s为显示字符串,colour为颜色 */
void puts16(int x,int y,char *s,unsigned char colour)
{
register int i,j,k;
FILE *fpa,*fph;
char buffera[16],bufferh[32];
unsigned char qh,wh;
unsigned long location;

fpa=fopen("asc16","rb");
fph=fopen("hzk16","rb");
while(*s)
{
if(*s>0)
{
fseek(fpa,(*s)*16,0);
fread(buffera,1,16,fpa);
for(i=0;i<16;i++)
for(j=0;j<8;j++)
{
if(((buffera[i]>>(7-j))&0x1)!=NULL)
putpixel(j+x,i+y,colour);
}
s++;
x+=8;
}
else
{
qh=*s-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*32L;
fseek(fph,location,SEEK_SET);
fread(bufferh,32,1,fph);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(((bufferh[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j+k,y+i,colour);
s+=2;
x+=16;
}
}
fclose(fpa);
fclose(fph);
}

main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");

hanzi12(260,160,"疯狂甲虫乐园!",LIGHTCYAN);
hanzi16(246,200,"C语言的疯狂!",LIGHTBLUE);
puts16(120,280,"点击网址: http://www.8623.com 随时欢迎您的到来!",LIGHTRED);

getch();
closegraph();
}

 
2008-05-21 9:33

收集到的cygwin使用资料

原文地址:http://feidi.javaeye.com/blog/54461

关键字: linux,cygwin

cygwin使用心得

1.在cygwin里访问Windows盘
cd /cygdrive/c
cd c:

2.整合cygwin命令到Windows中
假设cygwin安装在d:/develop/cygwin,则将d:/develop/cygwin/bin添加到系统变量PATH中(最好加在windows前面,这样的话,有些相同的命令的话,是先执行cygwin的命令,而不是windows命令,比如find)

就可以直接在cmd.exe下面执行tar czvf xxx.tgz ./
基本上所有的命令都可以用了,包括ls,more,less,find,grep等。

3.使用TGZ备份
cygwin的BIN加入到PATH
建一个BAT文件:
@echo off
d:
cd d:\website\8thmanage
tar czvf 8thmanage.tgz 8thmanage

4.Windows使用SHELL脚本
cygwin的BIN加入到PATH
在$CYGWIN的目录/var/下面建一脚本t.sh,注意,t.sh里面的路径,都是相对于$CYGWIN的,里面需要访问C盘的,请用/cygdrive/c/
在Windows下执行:
d:\cygwin\bin\bash d:\cygwin\var\t.sh
(可以定期执行)

5.同步Windows系统用户
mkpasswd -l > /etc/passwd
mkgroup -l > /etc/group
如果有Domain的话,需要加上-d domainname

6.安装系统服务
cygrunsrv

7.cygwing下使用rsync
a.安装rsync组件
b.进入cygwin,配置服务器
vi /etc/rsyncd.conf

...screts file=/etc/tom.ipaddr.pas

配置文件,参考我写的另外一篇rsync的文章,注意:密码文件权限必须是0400
chmod 0400 /etc/tom.ipaddr.pas
c.启动服务端
rsync --daemon

d.客户端同步
在客户端的cygwin下面,运行rsync同步,具体命令,请参考另外一篇rsync的文章。

8.cygwin下使用SSHD
a.需要安装了cygrunsrc,openssh
b.运行ssh-host-config -y
一路回车,直到出现CYGWIN=时,输入tty ntsec,再回车,
(或者,增加一系统环境变量CUGWIN=nesec tty)
c.已经安装好SSHD服务到你的Windows服务中,可以直接在服务中启动,关闭。
(cygrunsrc -S sshd或者net start sshd)

9.中文显示
1. 编辑用户home目录下的文件.inputc,去除以下几行的注释:

set meta-flag on

# 关闭bash命令行8字节字符转义符的转换
set convert-meta off

# 使bash命令行支持8字节字符输出
set output-meta on
set input-meta on

2 编辑用户home目录下的文件.bash_profile,在文件末尾加上下面几行:

alias ls='ls --color --show-control-chars'
export LC_ALL=zh_CN.GB23122
export LC_CTYPE=zh_CN.GB2312
export LANG=zh_CN.GB2312
export XMODIFIERS="@im=Chinput"3
stty cs8 -istrip
stty pass8
# Update: 少了这个less就不支持中文了
export LESSCHARSET=latin1

3,经过以上过程后,重启cygwin,就应许支持中文了,当然,如果要改变home目录则要编辑cygwin.bat,具体如下:
在bash命令之前加入set HOME=<用户目录>,比用户目录设置在G:\home。

在新设定的<用户目录>里创建文件.inputc和.bash_profile
由于用惯了windows,所以想在资源管理器里创建这两个文件,
所以干脆先跑到bash里用echo
创建这两个文件。
echo a>.inputc
echo a>.bash_profile
然后用你喜爱的编辑器编辑之。

要是ls还有乱码,vi ~\.bashrc中,修改:
alias ls=’ls -hF –show-control-chars –color=tty’

cygwin.bat脚本为:
@echo off
set MAKE_MODE=UNIX



--------------------------------
安装

可 以直接到http://www.cygwin.com下载一个安装程序,setup.exe,这个程序只是一个安装程序,所有的模块将从网络下载安装。或 者,你可以下载一个cygwin.iso的镜像,直接映象成光盘,再从光盘本地安装,这样会快很多,而且不用考虑断线的问题。


X下的中文支持
locale支持
Cygwin的locale支持一直都有问题,好在X程序还可以使用XLOCALE。
建议还是使用zh_CN.gbk, 不要使用zh_CN.GB2312

在移植程序时需要注意不要让程序连接libcygwin.a里面的setlocale,而是采用libX11.a里面的_Xsetlocale。方法是:检查被移植程序的全部源代码,发现

#include
就修改为

#define X_LOCALE
#include
同时注意程序的连接库要添加-lX11.
如果对于结果没有把握,可以找个Dependency Walker查看程序是否连接到了cygwin1.dll里面的setlocale,如果是,就说明有遗漏。

中文字体
PCF点阵字体
GTK1.x 和其他一些老的X程序都是用X字体,

注意必须要有编码与locale一致的字体,比如用zh_CN.gbk就必须要由GBK编码的字体,用zh_CN.GB2312就必须要有GB2312编码的字体

如果使用zh_CN.GB2312,这里有一个RedOffice面带的点阵字体包

可以采用ttf2bdf从TTF抽取得到bdf格式,然后再用bdf2pcf得到pcf格式的字体文件。
(这里有一个Windows版本的TTF2BDF,可以将Windows TTF字体转换出BDF字体, 注意得到bdf后要手工编辑一下文件头,将编码声明修改正确)


到字体之后,放到某个目录下,执行mkfontdir生成fonts.dir,然后用xset +fp
/path/to/your/fonts将字体路径加入即可(注意与fontconfig的配置不同,这里路径是不递归的,如果有的字体放在子目录里面,
子目录也需要添加进去才行)。


TTF字体
很多新的应用程序(比如GTK2)都使用fontconfig/libxft2来显示字体,它对TTF字体的支持比较好(X以前通过freetype, xft模块也支持TTF字体,但对中日韩字体的支持不是太好,而且也在Cygwin下似乎也没有这些模块)

完全可以使用Linux下的arphic字体包. 如果没有安装Linux,可以到http://packages.debian.org下载相应的包,然后用7zip解压提取出ttf文件。

得到字体文件之后,放到某个目录之下,编辑/etc/fonts/local.conf,将字体路径加入:
/path/to/my/ttf/fonts如果只是自己使用,可以将字体文件放到~/.fonts下,不需要修改任何配置,最多三十秒fontconfig就能够发现这些字体了。



中文输入法
老黄(hzhr)移植了miniChinput到Cygwin,我也移植了fcitx-1.8.5和3.0,均可以从我的网站上找到 http://www.oliwen.com/bama...

一般设置了LC_CTYPE和XMODIFIERS就可以在程序中激活输入输入法了(除非这个程序没有XIM支持):

LC_CTYPE=zh_CN.gbk
XMODIFIERS="@im=Chinput"
export LC_CTYPE XMODIFIERS

对于fcitx而言,XMODIFIERS设置为什么都可以(但必须要设置),所以设置为"@im=Chinput"的话chinput和fcitx都可以正常使用

VI中的 Backspace 與 Delete 按鍵異常

首先確定 $TERM的設定為cygwin


echo $TERM


若不是,請設定為


TERM = cygwin
export TERM


Backspace 與 Delete這兩個鍵正常狀況下只有一個有用。可在 $HOME/.bash_profile 任選一個來使用


stty erase '^H' //ctrl+v, ctrl+h


stty erase '^?'




------------------------
Cygwin使用指南
1 引言
cygwin 是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对于学习unix/linux操 作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非 常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。本文将对其作一介绍。

2 机理
cygnus 当初首先把gcc,gdb,gas等开发工具进行了改进,使他们能够生成并解释win32的目标文件。然后,他们要把这些工具移植到windows平台上 去。一种方案是基于win32 api对这些工具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法——他们写了一个共享库(就是cygwin dll),把win32 api中没有的unix风格的调用(如fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于 win32 api写了一个unix系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主机上的交叉编译器来生成可以在 windows平台上运行的工具集。以这些移植到windows平台上的开发工具为基础,cygnus又逐步把其他的工具(几乎不需要对源代码进行修改, 只需要修改他们的配置脚本)软件移植到windows上来。这样,在windows平台上运行bash和开发工具、用户工具,感觉好像在unix上工作。
关于cygwin实现的更详细描述,请参考http://cygwin.com/cygwin-ug-net/highlights.html.

3 安装设置cygwin
3.1 安装
要安装网络版的cygwin,可以到http://cygwin.com,点击"Install Cygwin Now!"。这样会先下载一个叫做setup.exe的GUI安装程序,用它能下载一个完整的cygwin。按照每一屏的指示可以方便的进行安装。
3.2 环境变量
开始运行bash之前,应该设置一些环境变量。cygwin提供了一个.bat文件,里面已经设置好了最重要的环境变量。通过它来启动bash是最安全的办法。这个.bat文件安装在cygwin所在的根目录下。 可以随意编辑该文件。
CYGWIN变量用来针对cygwin运行时系统进行多种全局设置。开始时,可以不设置CYGWIN或者在执行bash前用类似下面的格式在dos框下把它设为tty
C:\> set CYGWIN=tty notitle glob

PATH 变量被cygwin应用程序作为搜索可知性文件的路径列表。当一个cygwin进程启动时,该变量被从windows格式(e.g. C:\WinNT\system32;C:\WinNT)转换成unix格式(e.g., /WinNT/system32:/WinNT)。如果想在不运行bash的时候也能够使用cygwin工具集,PATH起码应该包含x:\cygwin \bin,其中x:\cygwin 是你的系统中的cygwin目录。
HOME变量用来指定主目录,推荐在执行bash前定义该变量。当 cygwin进程启动时,该变量也被从windows格式转换成unix格式,例如,作者的机器上HOME的值为C:\(dos命令set HOME就可以看到他的值,set HOME=XXX可以进行设置),在bash中用echo $HOME看,其值为/cygdrive/c.
TERM变量指定终端型态。如果美对它进行设置,它将自动设为cygwin
LD_LIBRARY_PATH被cygwin函数dlopen()作为搜索.dll文件的路径列表,该变量也被从windows格式转换成unix格式。多数Cygwin应用程序不使用dlopen,因而不需要该变量。
3.3 改变cygwin的最大存储容量
Cygwin 程序缺省可以分配的内存不超过384 MB(program+data)。多数情况下不需要修改这个限制。然而,如果需要更多实际或虚拟内存,应该修改注册表的 HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER区段。田家一个DWORD键heap_chunk_in_mb并把它的值设为 需要的内存限制,单位是十进制MB。也可以用cygwin中的regtool完成该设置。例子如下:
regtool -i set /HKLM/Software/Cygnus\ Solutions/Cygwin/heap_chunk_in_mb 1024
regtool -v list /HKLM/Software/Cygnus\ Solutions/Cygwin

4 使用cygwin
这一段讲一下cygwin和传统unix系统的不同之处。
4.1 映射路径名
4.1.1 引言
cygwin 同时支持win32和posix风格的路径,路径分隔符可以是正斜杠也可以是反斜杠。还支持UNC路径名。(在网络中,UNC是一种确定文件位置的方法, 使用这种方法用户可以不关心存储设备的物理位置,方便了用户使用。在Windows操作系统,Novell Netware和其它操作系统中,都已经使用了这种规范以取代本地命名系统。在UNC中,我们不用关心文件在什么盘(或卷)上,不用关心这个盘(或卷)所 在服务器在什么地方。我们只要以下面格式就可以访问文件:
\\服务器名\共享名\路径\文件名
共享名有时也被称为文件所在卷或存储设备的逻辑标识,但使用它的目的是让用户不必关心这些卷或存储设备所在的物理位置。)
符合posix标准的操作系统(如linux)没有盘符的概念。所有的绝对路径都以一个斜杠开始,而不是盘符(如c:)。所有的文件系统都是其中的子目录。例如,两个硬盘,其中之一为根,另一个可能是在/disk2路径下。
因 为许多unix系统上的程序假定存在单一的posix文件系统结构,所以cygwin专门维护了一个针对win32文件系统的内部posix视图,使这些 程序可以在windows下正确运行。在某些必要的情况下,cygwin会使用这种映射来进行win32和posix路径之间的转换。
4.1.2 cygwin mount表
cygwin 中的mount程序用来把win32盘符和网络共享路径映射到cygwin的内部posix目录树。这是与典型unix mount程序相似的概念。对于那些对unix不熟悉而具有windows背景的的人来说,mount程序和早期的dos命令join非常相似,就是把一 个盘符作为其他路径的子目录。
路径映射信息存放在当前用户的cygwin mount表中,这个mount table 又在windows的注册表中。这样,当该用户下一次登录进来时,这些信息又从注册表中取出。mount 表分为两种,除了每个用户特定的表,还有系统范围的mount表,每个cygwin用户的安装表都继承自系统表。系统表只能由拥有合适权限的用户 (windows nt的管理员)修改。
当前用户的mount表可以在注册表"HKEY_CURRENT_USER/Software/Red Hat, Inc./Cygwin/mounts v" 下看到。系统表
存在HKEY_LOCAL_MACHINE下。
posix 根路径/缺省指向系统分区,但是可以使用mount命令重新指向到windows文件系统中的任何路径。cygwin从win32路径生成posix路径 时,总是使用mount表中最长的前缀。例如如果c:被同时安装在/c和/,cygwin将把C:/foo/bar转换成/c/foo/bar.
如果不加任何参数地调用mount命令,会把Cygwin当前安装点集合全部列出。在下面的例子中,c盘是POSIX根,而d盘被映射到/d。本例中,根是一个系统范围的安装点,它对所有用户都是可见的,而/d仅对当前用户可见。
c:\> mount
f:\cygwin\bin on /usr/bin type system (binmode)
f:\cygwin\lib on /usr/lib type system (binmode)
f:\cygwin on / type system (binmode)
e:\src on /usr/src type system (binmode)
c: on /cygdrive/c type user (binmode,noumount)
e: on /cygdrive/e type user (binmode,noumount)
还可以使用mount命令增加新的安装点,用umount删除安装点。
Cygwin 不能根据已有的安装点把某个win32路径转化为posix路径时,cygwin会自动把它转化到一个处于缺省posix路径/cygdrive下的的一 个安装点. 例如,如果Cygwin 访问Z:\foo,而Z盘当前不在安装表内,那么Z:\将被自动转化成/cygdrive/Z.
可以给每个安装点赋予特殊的属性。自动安装的分区显示为“auto”安装。安装点还可以选择是"textmode"还是 "binmode",这个属性决定了文本文件和二进制文件是否按同样的方式处理。
4.1.3 其他路径相关信息
cygpath工具提供了在shell脚本中进行win32-posix路径格式转换的能力。
HOME, PATH,和LD_LIBRARY_PATH环境变量会在cygwin进程启动时自动被从Win32格式转换成了POSIX格式(例如,如果存在从该win32路径到posix路径的安装,会把c:\cygwin\bin转为/bin)。
 
2008-05-19 10:22

代替visio画流程图的免费软件下载

http://www.ebailu.com/PageDigest.asp?id=95

来源:互联网   链接:http://www.ebailu.com   人气:3464

说到画流程图,很多人第一反应是MS visio。对于公司来讲,这确为较好的选择。但对个人偶尔应用、对于较简单的流程图,恐怕支付1000元/标准版或4000元/专业版的价格,远非良策。此时,不妨试一下免费/开源软件的替代方案。
  按软件的体积从小到大,依次介绍如下。

EVE v3.56|73kb|超小的神奇矢量绘图程序


  谁能想到一个73kb的exe,能制作出这样的效果呢?牡蛎是这样介绍EVE的:EVE:Embedded Vector Editor,可能是“世界上最小的矢量绘图软件”。菜单、对话框有些乱,可以把程序自己和绘制的图形捆绑到一个exe文件中发布,还可以创建一些交互效果。EVE Web Edition :EVE Web Edition则增加了输入/输出SVG矢量图的功能。
  主页下载(V3.56 161K含教程)|用户手册FAQ

Diagram Designer V1.18|700kb|画流程图真方便

  直接引用Zenzen的介绍吧:一个小巧免费的流程图绘制工具,Diagram Designer。速度飞快,无需安装。我想对大多数人来说,无论是画流程图,还是设计界面,还是做一些简单的演示,都够用了。我就想不通为什么一定要使用一些大型的破解软件呢,难道真的有那个必要吗?另外喜欢中文界面的朋友可以下载语言支持包。喜欢玩开源的朋友可以下一个稍微老一点的版本的 源码

以下软件特性由Zenzen译自官方网站原文

  • 自定义对象模板
  • 拼写检查
  • 导入/导出 WMF, EMF, BMP, JPEG, PNG, MNG, ICO, GIF 以及 PCX 格式
  • 幻灯片播放
  • 简单的数学公式
  • 可以解方程的高级计算器
  • 整合了MeeSoft Image Analyzer用来编辑位图以及其他扩展格式
  • 使用压缩格式,使得文件尺寸最小

Dia|10MB|跨平台的流程图绘制程序

  Dia(主页)是基于 GTK的图形(diagram)绘制程序,适用于Linux, Unix和Windows,以 GPL 许可发布。通俗的说,一个10MB量级的免费软件,代替visio基本没问题,被收入了“最好的300款免费软件”。也有些用户认为Dia很多地方不太好用,但无论如何,它是综合性能最高的免费解决方案。
  其Windows版安装包在这里下载,目前为0.96版。这里有很多截屏。说到软件性质,Dia不是freeware,而是free software。想了解更多,可点击上文的GPL链接。

OpenOffice.org|100MB|开源办公套件中的画图功能


  如同MS Office的Word/Powerpoint中有画图功能一样,OpenOffice.org也具有画图功能,并且是以独立的OpenOffice.org Draw的形式。当然,不会有人因为画流程图而装全套OOo(下载包90MB,安装后170MB),而是有了OOo再用来画图(还可以输出pdf/数据库管理/电子表格/演示文档)。OOo是一个伟大的开源软件,给Linux和Windows下的用户,无须付费便可享受高质量办公软件的自由。它与MS Office的文档兼容不错,当然也会有个别问题(名言:没有软件能100%兼容MS Office格式,MS自己也不能)。更详细的介绍见Tag:OpenOffice.org
  没有两个软件完全相同,因此,也不可能用软件A完全替代B。所谓的替代,只是用另外一种软件做同样的事——但并非以完全同样的方式。因此,用户要有一个适应和调整。xbeta的承认,MS的产品都强大易用,但花高价买一堆用不到的功能,对个人用户是很不合算的。并且,散布MS非公开格式的文档(比如 doc,xls,ppt)也是不合适的,这就意味着强迫接收者要应用或兼容MS,这是不公平的。而建议用rtf/pdf/htm等开放格式。
或许,最好的替代是“免费软件”代替“收费软件”,或“付费习惯”代替“盗版习惯”。
 
   
 
 
文章存档
 
     
 
最新文章评论
  

[表情]
 

不错哈,就是我的office软件老提示过期啊,之类的,序列号的问题
 

现实很残酷,加油!
 

回复一切随缘:这是我的理想,我的梦,好希望它能成真
 

回复最后的泪人鱼:“上善若水”语出自道德经,水善利万物而不争,故几近于道。
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu