硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3814|回复: 9
收起左侧

[emWin] 控件使用自定义字体效果异常

[复制链接]

2

主题

16

回帖

22

积分

新手上路

积分
22
发表于 2020-2-17 15:50:20 | 显示全部楼层 |阅读模式
我使用Arial字体,18像素定义了英文字符,使用 4 bpp 抗锯齿信息 ,直接进行显示效果应该是正常的,效果如下所示。    GUI_SetFont(&GUI_FontArial18);
    GUI_SetColor(GUI_BLACK);
    GUI_DispStringAt("Digits: 127 ",20,218) ;

capture12.png


最近开始学习使用控件,我发现同样的字体在控件上(如文本框)显示很奇怪,字符被加粗了,间距也变的很密,显示效果如下:
capture2.png
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
TEXT_SetFont(hItem, &GUI_FontArial18);
TEXT_SetBkColor(hItem,USER_BACK_GRAY);
TEXT_SetTextColor(hItem,GUI_BLACK);
TEXT_SetText(hItem, "4 Digits");
TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);


我的问题:
   按理来说,使用控件和不使用显示效果应该一样的。现在在控件中显示效果明显异常,不知道是什么原因。望论坛里面的前辈能够指点一二,小弟不甚感激。


回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2020-2-17 16:52:46 | 显示全部楼层
自己先顶一下。
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2020-2-18 08:49:54 | 显示全部楼层
我发现使用standard格式两者显示效果是一样的,难道控件不能显示抗锯齿格式的字体吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-18 09:20:43 | 显示全部楼层
直接在模拟器上测试下,发个完整点的代码,我也测试下。
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2020-2-18 09:53:03 | 显示全部楼层
感谢eric的回复,下面是代码,程序很简单,就只创建了一个对话框,附件是字体的源文件。模拟器我来测试一下。

#include "BUTTON.h"
#include "FRAMEWIN.h"
#include "TEXT.h"
#include "DROPDOWN.h"

#define USER_BACK_GRAY  0xefedec
#define USER_LIGHT_BLUE 0xee9a51
#define USER_DARK_BLUE  0x985419

#define ID_FRAMEWIN_0 (GUI_ID_USER + 0x00)
#define ID_BUTTON_0 (GUI_ID_USER + 0x01)
#define ID_BUTTON_1 (GUI_ID_USER + 0x02)
#define ID_TEXT_0 (GUI_ID_USER + 0x03)
#define ID_DROPDOWN_0  (GUI_ID_USER + 0x04)
#define ID_BUTTON_2 (GUI_ID_USER + 0x05)
#define ID_BUTTON_3 (GUI_ID_USER + 0x06)
#define ID_TEXT_1 (GUI_ID_USER + 0x07)

static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] =
{
{ FRAMEWIN_CreateIndirect, "Framewin", ID_FRAMEWIN_0, 0, 0, 320, 240, 0, 0x14, 0 },
{ TEXT_CreateIndirect, "Text", ID_TEXT_0, 50, 15, 135, 24, 0, 10, 0 },/*注意,坐标是相对于客户区的*/
{ TEXT_CreateIndirect, "4 Digit", ID_TEXT_1, 205, 10, 65, 30, 0, 10, 0 },
}

static void _cbDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hItem;
int NCode;
int Id;

switch (pMsg->MsgId)
{
case WM_INIT_DIALOG:
//
// 初始化框架窗口
//
hItem = pMsg->hWin;

FRAMEWIN_SetFont(hItem, GUI_FONT_20_ASCII);//&GUI_FontArial18
FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
FRAMEWIN_SetText(hItem, "Enter Password");
FRAMEWIN_SetClientColor(hItem,USER_BACK_GRAY);


hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
TEXT_SetFont(hItem, &GUI_FontArial18);
TEXT_SetBkColor(hItem,GUI_WHITE);
TEXT_SetTextColor(hItem,GUI_BLACK);
TEXT_SetText(hItem, "0000");
TEXT_SetWrapMode(hItem,GUI_WRAPMODE_CHAR);
TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);

hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
TEXT_SetFont(hItem, &GUI_FontArial18);
TEXT_SetBkColor(hItem,USER_BACK_GRAY);
TEXT_SetTextColor(hItem,GUI_BLACK);
TEXT_SetText(hItem, "Digits");
TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);


hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
BUTTON_SetFont(hItem, &GUI_FontArial18);
BUTTON_SetFrameColor(hItem,USER_DARK_BLUE);
BUTTON_SetText(hItem, "0");



break;

case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(Id)
{
case ID_BUTTON_0:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
break;
case WM_NOTIFICATION_RELEASED:
break;
}
break;
case ID_BUTTON_1:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:

break;

case WM_NOTIFICATION_RELEASED:
;
break;
}
break;
}
break;

default:
WM_DefaultProc(pMsg);
break;
}
}

WM_HWIN CreateFramewin(void)
{
WM_HWIN hWin;
hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
return hWin;
}
int main(void)
{
SysInit();
  
  GUI_SetBkColor(USER_BACK_GRAY);//USER_BACK_GRAY
  GUI_Clear(); /*清除活动窗口*/
/* 创建对话框 */
CreateFramewin();
GUI_Exec();
}

Arial18.c

64.24 KB, 下载次数: 2

字体源文件

回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2020-2-18 11:54:25 | 显示全部楼层
我对比使用抗锯齿字体的代码执行流程,发现控件写抗锯齿字体时会进入GUIDRV_Template.c文件中的_GetPixelIndex这个函数。而我目前工程中这个函数还没写,默认返回值为0。我猜测是控件进行抗锯齿时需要读取像素点的信息,所以我的工程无法正常显示抗锯齿字体。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-18 13:31:43 | 显示全部楼层
fengzhishengzhu 发表于 2020-2-18 09:53
感谢eric的回复,下面是代码,程序很简单,就只创建了一个对话框,附件是字体的源文件。模拟器我来测试一下 ...

你发的程序里面,对话框列表里面忘了加分号了。
从测试效果来看没啥问题

QQ截图20200218133121.png
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2020-2-18 14:07:34 | 显示全部楼层
eric2013 发表于 2020-2-18 13:31
你发的程序里面,对话框列表里面忘了加分号了。
从测试效果来看没啥问题

非常感谢eric的验证(分号是程序拷贝时漏了,要不然编译也不会通过的)。我现在测试发现控件写抗锯齿字体时会调用GUIDRV_Template.c中的_GetPixelIndex读点函数,而直接显示(不用控件)是不会的。想请教eric,这两种显示方式是有这种区别吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-18 17:50:29 | 显示全部楼层
fengzhishengzhu 发表于 2020-2-18 14:07
非常感谢eric的验证(分号是程序拷贝时漏了,要不然编译也不会通过的)。我现在测试发现控件写抗锯齿字体时 ...

抗锯齿那个,在实线周围有各种虚化的线条。
回复

使用道具 举报

2

主题

16

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2020-2-19 10:23:02 | 显示全部楼层
eric2013 发表于 2020-2-18 17:50
抗锯齿那个,在实线周围有各种虚化的线条。

感谢eric的回复。控件写抗锯齿字体时确实要进行读点操作,我将读点函数添加后,显示正常了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-18 17:11 , Processed in 0.336811 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表