硬汉嵌入式论坛

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

[emWin] 关于控件EDIT扁平化后黑色边框如何去除的问题请教!

[复制链接]

15

主题

53

回帖

98

积分

初级会员

积分
98
发表于 2017-8-22 09:20:49 | 显示全部楼层 |阅读模式
在新版本中控件EDIT的默认背景中最外层是一个1像素的黑色边框,由于不能对EDIT控件进行换肤处理,不知道如何去除该黑色边框,或者更改边框颜色,请教有什么办法可以解决此类问题。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-22 10:31:54 | 显示全部楼层
有这种需求的话,直接用Text文本控件是不是更方便些。如果一定要用这个控件的话,只能设置EDIT控件的自定义回调函数了。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2017-8-22 10:51:48 | 显示全部楼层
硬汉说的对,你的创建EDIT控件 都调用一下自己定义的回调函数,回调函数的WM_PAINT消息中绘制自己想要的EDIT的效果,其他消息都保持默认状态,不过这样EDIT的部分功能也会消失,比如打开光标和闪烁功能后并不能有效果,这样就需要自己来实现光标的效果了
举个例子如下

static void _cbEdit(WM_MESSAGE * pMsg) {

    WM_HWIN hWin = pMsg->hWin;
    static GUI_RECT Rect;
  static uint8_t DispCursorFlag = 0;
    int i,Id,CursorX,CursorY;
    char Text[200];
    //const GUI_FONT* defaultfont;

    WM_GetClientRect(&Rect);

    switch (pMsg->MsgId) {

    case WM_PID_STATE_CHANGED:
        if((((const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p)->State == 1)){
            WM_SetFocus(pMsg->hWin);
            KeyBoardType.SelEditFlag = 0;
        }
    if ((((const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p)->State == 0)&&(((const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p)->StatePrev == 1)) {
        
                if(WM_HasFocus(pMsg->hWin))
                {
                    if(!WM_IsWindow(_hKeyBoardWin)){
                            KeyBoardType.Type = TotalKeyBoard;
                            KeyBoardType.hWinSrc = pMsg->hWin;
                            EDIT_GetText(pMsg->hWin,KeyBoardType.Buf,sizeof(KeyBoardType.Buf));//»ñè¡μ±Ç°D¡1¤¾ßμÄÄúèY
                            _CreateKeyBoard(WM_GetDesktopWindow());
                    }
                    else{
                        KeyBoardType.ClrEditValue = 0;
                    }
                    
                }
    }
    break;
        
    case WM_PAINT:

            GUI_SetBkColor(GUI_SetupBkColor);
            GUI_Clear();
   
            if(!WM_IsEnabled(pMsg->hWin)){
                GUI_SetColor(GUI_SetupTitleColor);   
                GUI_FillRoundedRect(Rect.x0, Rect.y0,    Rect.x1, Rect.y1, 3);                                 //»æÖƱ߿ò   
            }
            
            if(!KeyBoardType.SelEditFlag){
               
                GUI_SetTextMode(GUI_TEXTMODE_TRANS);
            }
            else{
               
                GUI_SetBkColor(GUI_BLUE);
            }

            if(!WM_HasFocus(pMsg->hWin))
            GUI_SetColor(GUI_TextColor);
            else
            GUI_SetColor(GUI_DaoHIconSelected);            
            GUI_DrawRoundedRect(Rect.x0, Rect.y0,    Rect.x1, Rect.y1, 3);                                 //»æÖƱ߿ò   
        
            /*»æÖÆ1a±ê*/
            if(WM_HasFocus(pMsg->hWin)){
                if(DispCursorFlag){
                    EDIT_GetCursorPixelPos(hWin,&CursorX,&CursorY);   //»ñè¡1a±êλÖÃ
                    GUI_SetColor(GUI_DaoHIconSelected);
                    GUI_DrawLine(CursorX-4,CursorY,CursorX-4,Rect.y1-2);
                }
               
            }
            GUI_SetColor(GUI_WHITE);
            EDIT_GetText(hWin, Text, sizeof(Text));
        GUI_SetFont(&GUI_FontHZSongti24);   //ÏÔê¾Îı¾
            if(Message.PassWordMode){
               
                memset(Text,'\\0',sizeof(Text));
                for(i=0;i<EDIT_GetNumChars(pMsg->hWin);i++)
                    strcat(Text,"*");
            }
            GUI_DispStringInRect(Text,&Rect,GUI_TA_HCENTER|GUI_TA_VCENTER);
   
      
        break;
    case WM_UPDATEVALUE:

                DispCursorFlag = !DispCursorFlag;
          WM_InvalidateRect(pMsg->hWin,&Rect);
            break;
    default:
        EDIT_Callback(pMsg); // The original callback
        break;
    }
}

在外部窗口的一个TIMER消息中可以一直向有焦点的EDIT框 发送WM_UPDATEVALUE消息  这样光标就会闪烁了
回复

使用道具 举报

15

主题

53

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2017-8-23 11:36:50 | 显示全部楼层

回 eric2013 的帖子

eric2013:有这种需求的话,直接用Text文本控件是不是更方便些。如果一定要用这个控件的话,只能设置EDIT控件的自定义回调函数了。 (2017-08-22 10:31) 
为了定时器快速刷新,不再重绘。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-23 11:39:00 | 显示全部楼层

回 ljc8000 的帖子

ljc8000:为了定时器快速刷新,不再重绘。
 (2017-08-23 11:36) 
Text文本控件也不需要重绘的,它也是个控件。
回复

使用道具 举报

15

主题

53

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2017-8-23 11:40:13 | 显示全部楼层

回 古骨config 的帖子

古骨config:硬汉说的对,你的创建EDIT控件 都调用一下自己定义的回调函数,回调函数的WM_PAINT消息中绘制自己想要的EDIT的效果,其他消息都保持默认状态,不过这样EDIT的部分功能也会消失,比如打开光标和闪烁功能后并不能有效果,这样就需要自己来实现光标的效果了
举个例子如下

static vo .. (2017-08-22 10:51) 
谢谢拉,不过调用回调函数的话,定时器设置50ms的话,又要来不及刷新了。
回复

使用道具 举报

15

主题

53

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2017-8-23 11:41:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:有这种需求的话,直接用Text文本控件是不是更方便些。如果一定要用这个控件的话,只能设置EDIT控件的自定义回调函数了。 (2017-08-22 10:31) 
发现在50ms或者以下的定时器中进行重绘窗口,整个绘制过程都超过50ms,480*320 16位,所以想通过控件更新数据,这样快。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-24 00:52:23 | 显示全部楼层

回 ljc8000 的帖子

ljc8000:发现在50ms或者以下的定时器中进行重绘窗口,整个绘制过程都超过50ms,480*320 16位,所以想通过控件更新数据,这样快。 (2017-08-23 11:41) 
Text就是控件,直接用它就行。
回复

使用道具 举报

15

主题

53

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2017-8-25 09:09:03 | 显示全部楼层

回 eric2013 的帖子

eric2013:Text就是控件,直接用它就行。 (2017-08-24 00:52) 
恩,可以用,就是没有数值显示,相比EDIT控件复杂一点
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117635
QQ
发表于 2017-8-26 03:01:38 | 显示全部楼层

回 ljc8000 的帖子

ljc8000:恩,可以用,就是没有数值显示,相比EDIT控件复杂一点 (2017-08-25 09:09) 
使用sprintf,非常方便,即是用EDIT也推荐用sprintf转换,然后调用EDIT_SetText文本函数显示,这样就省去掌握那么多其他函数的麻烦了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-19 22:00 , Processed in 0.053056 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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