[mw_shl_code=c,true]//字模数据暂存数组,单个字模的最大字节数
//单个字模最大为1024
#define BYTES_PER_FONT 1024 //32*32=1024,最大显示32*32点阵字库
U8 GUI_FontDataBuf[BYTES_PER_FONT];
//中文字体路径
const TCHAR GBK12_PATH[] = "0:/SYSTEM/FONT/GBK12.FON";
const TCHAR GBK16_PATH[] = "0:/SYSTEM/FONT/GBK16.FON";
const TCHAR GBK24_PATH[] = "0:/SYSTEM/FONT/GBK24.FON";
FIL f12;
[mw_shl_code=c,true] GUI_SetBkColor(GUI_BLUE);
GUI_Clear();
GUI_SetColor(GUI_RED);
GUI_SetFont(&GUI_FontHZ12);
GUI_DispStringAt("12号字体:测试例程",10,10);
GUI_SetFont(&GUI_FontHZ16);
GUI_DispStringAt("16号字体:测试例程",10,30);
GUI_SetFont(&GUI_FontHZ24);
GUI_DispStringAt("24号字体:测试例程",10,50);
在主函数显示
OS_CPU_SR cpu_sr=0;
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
GUI_SetFont(&GUI_FontHZ12);
GUI_DispStringAt("12号字体:测试例程 test",10,100);
// GUI_SetFont(&GUI_FontHZ16);
// GUI_DispStringAt("16号字体:测试例程",10,30);
// GUI_SetFont(&GUI_FontHZ24);
// GUI_DispStringAt("24号字体:测试例程",10,50);
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
任务中显示[/mw_shl_code]
FIL f16;
FIL f24;
//获取字模数据
static void GUI_GetDataFromMemory(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c)
{
unsigned char qh,ql;
unsigned char i;
unsigned long foffset;
unsigned char t;
unsigned char *mat;
u8 size,csize;//字体大小
UINT ret;
U16 BytesPerFont;
GUI_FONT EMWINFONT;
OS_CPU_SR cpu_sr=0;
EMWINFONT = *GUI_pContext->pAFont;
BytesPerFont = GUI_pContext->pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每个字模的数据字节数
if (BytesPerFont > BYTES_PER_FONT) BytesPerFont = BYTES_PER_FONT;
//判断字体的大小
if(memcmp(&EMWINFONT,&GUI_FontHZ12,sizeof(GUI_FONT)) == 0) size=12; //12字体
else if(memcmp(&EMWINFONT,&GUI_FontHZ16,sizeof(GUI_FONT)) == 0) size=16; //16字体
else if(memcmp(&EMWINFONT,&GUI_FontHZ24,sizeof(GUI_FONT)) == 0) size=24; //24字体
csize = (size/8+((size%8)?1:0))*(size); //得到字体一个字符对应点阵集所占的字节数
if (c < 0x80) //英文字符地址偏移算法
{
switch(size)
{
case 12:
for(t=0;t<12;t++) GUI_FontDataBuf[t]=emwin_asc2_1206[c-0x20][t];
break;
case 16:
for(t=0;t<16;t++) GUI_FontDataBuf[t]=emwin_asc2_1608[c-0x20][t];
break;
case 24:
for(t=0;t<48;t++) GUI_FontDataBuf[t]=emwin_asc2_2412[c-0x20][t];
break;
}
}
else
{
ql=c/256;
qh=c%256;
if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非常用汉字
{
for(i=0;i<(size*2);i++) *mat++=0x00;//填充满格
return; //结束访问
}
if(ql<0x7f)ql-=0x40;
else ql-=0x41;
qh-=0x81;
foffset=((unsigned long)190*qh+ql)*csize;//得到字库中的字节偏移量
switch(size)
{
case 12:
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
ret = f_open(&f12,GBK12_PATH,FA_READ);
//if(ret)printf("ret12 =%d\r\n",ret);
f_lseek(&f12, 0);
f_lseek(&f12, foffset);
f_read(&f12, GUI_FontDataBuf, csize, &ret);
f_close(&f12);
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
break;
case 16:
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
ret = f_open(&f16,GBK16_PATH,FA_READ);
//if(ret)printf("ret16 =%d\r\n",ret);
f_lseek(&f16, 0);
f_lseek(&f16, foffset);
f_read(&f16, GUI_FontDataBuf, csize, &ret);
f_close(&f16);
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
break;
case 24:
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
ret = f_open(&f24,GBK24_PATH,FA_READ);
//if(ret)printf("ret24 =%d\r\n",ret);
f_lseek(&f24, 0);
f_lseek(&f24, foffset);
f_read(&f24, GUI_FontDataBuf, csize, &ret);
f_close(&f24);
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
break;
}
}
}
这是获取字体的函数[/mw_shl_code]
最后面的压缩文件是最终的,可以直接下载到战舰板子上测试。。。