VincentWei / MiniGUI

A modern and mature cross-platform window system for embedded systems and smart IoT devices.
http://www.minigui.com
GNU General Public License v3.0
676 stars 157 forks source link

你好3.0升级到5.0以后有个接口变化想要咨询一下 #96

Closed htk719809837 closed 1 year ago

htk719809837 commented 1 year ago

GetTabbedTextExtentPoint接口的变化是否影响了各个出参,应用中发现字符宽度的计算变化很大

VincentWei commented 1 year ago

先关注下逻辑字体风格以及相关接口的变化,看看是不是因为在创建逻辑字体时,使用一些已经废弃的逻辑字体风格导致的:

https://gitlab.fmsoft.cn/VincentWei/minigui-docs/-/blob/master/supplementary-docs/Using-Enhanced-Font-Interfaces.md

htk719809837 commented 1 year ago

还有一个问题,使用3.0的时候EDIT的插入符位置正常,但是使用5.0的时候,插入符光标会跑到当前字的中间,字体使用的是自定义的字体。当然只有中文会出现,英文还是正常的,3.0就不会出现这个问题。当然当edit一开始就要显示文字,比如勾销,那么插入符号的位置正确,当我再次点击勾销的勾,插入符就跑乱了 截取图片_20221028151652 截取图片_20221028151700 截取图片_20221028151706

esleft_input_char_refresh是不是这个函数修改引起的?

VincentWei commented 1 year ago

esleft_input_char_refresh是不是这个函数修改引起的?

有可能,我们排查一下。

多谢反馈!

htk719809837 commented 1 year ago

请问插入符有定位到问题吗

VincentWei commented 1 year ago

我们使用变宽字体测试,未能重现您提到的现象。我们注意到您提到使用的是自定义字体,所以还需要排查设备字体中的信息有误的情况。比如,字体的 bouding box 信息和 advance 信息不正确的情况。

能否告知如下信息:

  1. 设备字体格式是什么?比如 UPF 还是 TTF。
  2. 逻辑字体名称是什么?
  3. 文本的编码是什么?比如 GB2312 还是 UTF-8 之类的。
htk719809837 commented 1 year ago

ttf 微软雅黑做过删减 GB2312

VincentWei commented 1 year ago

我们使用 ttf 字体仍然无法重现。检查了 GetTabbedTextExtentPoint 函数的实现,和 3.0 相比未发现明显区别,只有几行多余的处理,移除了。请从 rel-5-0 分支更新后看看是否解决。

如果该问题仍然存在,可替换为未定制的字体文件,看是否是字体文件本身的缺陷造成的。还可以使用 UTF-8 编码,看看是否是因为字符编码而导致的。如果还存在,则需要提供可以复现该问题的代码以及字体,才能定位问题。

htk719809837 commented 1 year ago

你好,目前我在ubuntu上使用c:windows/fonts下面的微软雅黑字体,将其复制到ubuntu上,分别会有三个子字体,用这三个子字体进行测试,就会出现问题,同样的使用楷体就不会

截取图片_20221107103141 截取图片_20221107103211 截取图片_20221107103237

目前代码是这样的

include

include <minigui/common.h>

include <minigui/minigui.h>

include <minigui/gdi.h>

include <minigui/window.h>

include <minigui/control.h>

static PLOGFONT caption_font;

static LRESULT HelloWinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case MSG_CREATE: hWnd = CreateWindowEx(CTRL_SLEDIT, "微软雅黑", WS_VISIBLE, WS_EX_TRANSPARENT, 401, 48, 15, 176, 25, hWnd,0); caption_font= CreateLogFont(NULL, "times", "GB2312", FONT_WEIGHT_BOOK , FONT_SLANT_ROMAN, FONT_FLIP_NIL, FONT_OTHER_AUTOSCALE, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 18, 0); SetWindowFont(hWnd, caption_font); SetWindowElementAttr(hWnd, WE_FGC_WINDOW, 0x00ff00); return 0;

    case MSG_DESTROY:
        DestroyAllControls (hWnd);
        return 0;

    case MSG_CLOSE:
        DestroyMainWindow (hWnd);
        PostQuitMessage (hWnd);
        return 0;
}

return DefaultMainWinProc(hWnd, message, wParam, lParam);

}

int MiniGUIMain (int argc, const char* argv[]) { MSG Msg; HWND hMainWnd; MAINWINCREATE CreateInfo;

ifdef _MGRM_PROCESSES

JoinLayer(NAME_DEF_LAYER , "mycontrol" , 0 , 0);

endif

CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = "Hello, world";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = HelloWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 480;
CreateInfo.by = 480;
CreateInfo.iBkColor = COLOR_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;

hMainWnd = CreateMainWindow (&CreateInfo);

if (hMainWnd == HWND_INVALID)
    return -1;

ShowWindow(hMainWnd, SW_SHOWNORMAL);

while (GetMessage(&Msg, hMainWnd)) {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}

MainWindowThreadCleanup (hMainWnd);

return 0;

}

ifdef _MGRM_THREADS

include <minigui/dti.c>

endif

MINIGUI.cfg 对字体的配置如下: [truetypefonts] font_number=1 name0=ttf-times-rrncnn-*-64-ISO8859-1,ISO8859-2,ISO8859-5,ISO8859-7,ISO8859-8,ISO8859-9,UTF-8,GB2312-0,GBK fontfile0=/usr/local/share/minigui/res/font/simkai.ttf

name1=ttf-Source Sans Pro,SansSerif-rrncnn-0-0-ISO8859-1,UTF-8

fontfile1=font/SourceSansPro-Regular.ttf

htk719809837 commented 1 year ago

这个问题比较着急,大概什么时候可以修复好呢? 可以的话麻烦尽快回复一下,谢谢!

htk719809837 commented 1 year ago

另外的,对于阿拉伯语的BIDISLEDIT中文本的删除,现在会在插入符的地方多一个?

VincentWei commented 1 year ago

这个问题比较着急,大概什么时候可以修复好呢? 可以的话麻烦尽快回复一下,谢谢!

收到上述重新代码,排查和修复应该会很快!多谢!

另外的,对于阿拉伯语的BIDISLEDIT中文本的删除,现在会在插入符的地方多一个?

不太明白所指,如果是 3.0 正常,那就等等上面这个问题的修复。

VincentWei commented 1 year ago

已修复。该问题在逻辑字体使用多个设备字体文件时会重现。

htk719809837 commented 1 year ago

多个设备字体文件是什么意思呢,我刚按照提交记录更新了一下发现好像还没有修复(网络问题,暂时克隆不了完整的代码),不知道是不是前几次提交仍有修改。不过可以确定,GetTabbedTextExtentPoint 我们这边用来计算字符串长度是错误的,正常长度为40的字符串,计算出来只有20多,和插入符可能同属于一个问题,希望可以再查一下看看。

在还有就是前面提到的。使用BIDISLEDIT,对阿拉伯语进行删除,会出现问号,这个字体同样使用上面的,demo我这边目前没时间调,希望在帮忙查一下。 截取图片_20221108094605 截取图片_20221108094616

htk719809837 commented 1 year ago

目前下了最新版本的代码,插入符问题已经修复 另外这个插入符貌似是透明色的,以前3.0我们edit背景是白色的,代码没有变过,但是现在插入符颜色变为了透明(我们透明像素就会显示摄像头预览界面,所以插入符还是可见的),有没有办法控制插入符颜色呢

VincentWei commented 1 year ago

好,bidiedit 和插入符透明的问题,我们这边排查一下。

htk719809837 commented 1 year ago

GetTabbedTextExtentPoint 我们这边用来计算字符串长度是错误, 这个问题有眉目了吗

VincentWei commented 1 year ago

GetTabbedTextExtentPoint 我们这边用来计算字符串长度是错误, 这个问题有眉目了吗

GetTabbedTextExtentPoint 这个函数和 GetTextExtentPoint 有相同的问题,其中 GetTextExtentPoint 的缺陷导致了编辑框插入符的问题。已经同步修复。如果这个函数还有问题,麻烦提供复现代码,否则很难排查。

另外,建议一个 Issue 中只提一个问题,还要描述清楚问题,最好给出复现代码。这样我们好排查、跟踪和管理,否则会降低我们的沟通效率。比如这个 Issue 当中,把 GetTabbedTextExtentPoint 的问题和插入符问题放在一起说,我们一直以为说的是同一个问题……

htk719809837 commented 1 year ago

好的,目前还剩两个问题

1、bidisledit,最好使用上面提到的微软雅黑测试 2、 插入符透明,我们这边根窗口用的是透明色 pWinInfo->iBkColor = PIXEL_transparent; 如果插入符有设置颜色的方法,可以先提供一下,我这边应急设置为黑色

VincentWei commented 1 year ago

这两个问题都已修复,见 rel-5-0 分支。

插入符透明的问题,是由于屏幕颜色包含有 Alpha 分量,执行亦或操作后就变透明了。现针对含有 Alpha 分量的情形做了特别处理——保留原始的 Alpha 分量信息。

htk719809837 commented 1 year ago

这个提交好像提交到了master分支......

VincentWei commented 1 year ago

这个提交好像提交到了master分支......

嗯 ,的确。已经同步到 rel-5-0 分支。