|
发表于 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消息 这样光标就会闪烁了 |
|