大家好,我使用硬件为:F103 + emwin + LCD 400*240(不带触摸)+ 矩阵键盘,现在课设做一个简易的PM2.5检测仪。
1、我在桌面上创建了一个大小为400*215的子窗口作为设置界面
_hLastFrame = WM_CreateWindowAsChild(0,0,400,215,WM_HBKWIN,WM_CF_SHOW,cb,0);
2、然后在创建的子窗口上,创建了2个编辑框,如下图1所示:
hEdit[0] = _CreateEdit(hWin, ID_EDIT(0), 109, 45, 40, 25, "001");
hEdit[1] = _CreateEdit(hWin, ID_EDIT(1), 109, 73, 85, 25, "浓度/m3");
//创建编辑框
static WM_HWIN _CreateEdit(WM_HWIN hParent, int Id, int x, int y, int w, int h, const char* pText)
{
WM_HWIN hEdit;
hEdit = EDIT_CreateEx(x, y, w, h, hParent, WM_CF_SHOW, 0, Id, 40);
EDIT_SetText(hEdit, pText);
EDIT_SetTextAlign(hEdit, GUI_TA_LEFT | GUI_TA_VCENTER);
EDIT_SetBkColor(hEdit,0,GUI_RED);
EDIT_SetBkColor(hEdit,1,GUI_WHITE);
EDIT_SetBkColor(hEdit,2,GUI_BLUE);
EDIT_SetFont(hEdit, &GUI_FontWRYH_26);
//EDIT_EnableBlink(hEdit,300,1);//来设置光标的闪烁
//WM_DisableWindow(hEdit);//不显示光标
return hEdit;
}
3、按上下键能够实现光标在2个编辑框内切换,如下图2、3所示:
4、想做成的效果是,当光标在edit0时,按下确认键后、再按上下键,就能改变edit0内数值的大小;然后再按返回键就退出edit0,此后再按上下键,又能在2个编辑框之间来回切换光标。
5、但是现在做出来的效果是,当光标在edit0时,按下确认键,001的位置就变成了灰色了,如下图4所示:
试了很久,不知道该怎么办,下面是我写的实现功能的函数
//编辑框回调函数
static void _cbEdit(WM_MESSAGE * pMsg)
{
WM_MESSAGE Msg;
//WM_HWIN hWin = pMsg->hWin;
int a = 1;
switch (pMsg->MsgId)
{
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
{
case GUI_KEY_ESCAPE:
break;
case GUI_KEY_UP:
a++;
break;
case GUI_KEY_DOWN:
a--;
break;
case GUI_KEY_LEFT: //返回键
EDIT_SetText(hEdit[0], "002");
WM_DisableWindow(hEdit[0]);
WM_SetFocus(_hLastFrame);//设置聚焦
break;
}
break;
}
//EDIT_Callback(pMsg);//自带的回调函数
}
//设置界面
static void _cbSetView(WM_MESSAGE* pMsg)
{
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId)
{
case WM_CREATE:
WM_SetFocus(hWin);//设置聚焦
_CreateText(hWin, ID_TEXT( 0),36,GUI_GREEN,GUI_LIGHTGRAY,TEXT_CF_LEFT, 0, 0, 400, 40 ," 设置界面");
//2个text控件
_CreateText(hWin, ID_TEXT( 1),26,GUI_WHITE,GUI_BLUE,TEXT_CF_LEFT, 24, 45, 85, 25 ,"测量位置:");
_CreateText(hWin, ID_TEXT( 2),26,GUI_WHITE,GUI_BLUE,TEXT_CF_LEFT, 24, 73, 85, 25 ,"测量模式:");
//2个edit控件
hEdit[0] = _CreateEdit(hWin, ID_EDIT(0), 109, 45, 40, 25, "001");
hEdit[1] = _CreateEdit(hWin, ID_EDIT(1), 109, 73, 85, 25, "浓度/m3");
break;
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
{
case GUI_KEY_ESCAPE: break;
case GUI_KEY_BACKTAB:
WM_SetFocusOnPrevChild(hWin);
break;
case GUI_KEY_TAB:
WM_SetFocusOnNextChild(hWin);
break;
//确定键,进入各个设置项,设置具体参数
case GUI_KEY_ENTER:
WM_SetFocus(hEdit[0]);
WM_SetCallback(hEdit[0],_cbEdit); //按下确定键后,给edit0建立创建回调函数
//hItem=WM_GetFocusedWindow(); //获得当前聚焦的控件句柄,使用的emwin 5.32里面找不到WM_GetFocusedWindow这个函数
break;
}
break;
case WM_PAINT://窗口变为无效并应重绘时,发送到窗口
_PaintFrame();//重绘
break;
case WM_NOTIFY_PARENT://子窗口中发生了某些改变告知父窗口
switch(WM_GetId(pMsg->hWinSrc))//识别控件ID
{
case ID_EDIT(0): //编辑框发来的消息
switch(pMsg->Data.v) //识别消息类型
{
case WM_NOTIFICATION_CLICKED: //
break;
case WM_NOTIFICATION_RELEASED: //
break;
case WM_NOTIFICATION_VALUE_CHANGED: //
break;
}
break;
case ID_EDIT(1):
switch(pMsg->Data.v)
{
case WM_NOTIFICATION_CLICKED: break;
case WM_NOTIFICATION_RELEASED: break;
case WM_NOTIFICATION_VALUE_CHANGED: break;
}
break;
}
break;
case WM_TIMER: //定时器消息 Sensor_Voltage_Converted
//WM_RestartTimer(pMsg->Data.v, 1000);
break;
case WM_APP_SHOW_TEXT:
//WM_HideWindow(hEdit[0]);
WM_InvalidateWindow(hWin);
//WM_CreateTimer(hWin, 0, 1000, 0);
break;
default:WM_DefaultProc(pMsg);break;
}
}
//在桌面上建立一个子窗口,大小 w=400,h=215
static WM_HWIN _CreateFrame(WM_CALLBACK* cb)
{
_hLastFrame = WM_CreateWindowAsChild(0,0,400,215,WM_HBKWIN,WM_CF_SHOW,cb,0);
//_hLastFrame = WM_CreateWindow(0,0,400,215,WM_CF_SHOW,cb,0);
return _hLastFrame;
}
//GUI
void MainTask(void)
{
/* 初始化 */
GUI_Init();
GUI_UC_SetEncodeUTF8();/* 使能UTF8解码 */
WM_SetCreateFlags(WM_CF_MEMDEV);//窗口使用内存设备
GUI_SetBkColor(GUI_BLUE);//设置背景色
GUI_Clear();//清全屏
/* 设置背景窗口的回调函数 */
WM_SetCallback(WM_HBKWIN, &_cbBkWindow);
_CreateFrame(&_cbSetView);//首先进入开机界面
}
自己感觉是回调函数_cbSetView和_cbEdit没有写对,但是又不知道修改哪里,有哪位知道接下来我该怎么做?
|