|
本帖最后由 mhlyjay 于 2013-6-10 12:04 编辑
uCGUI 在 12864(ST7920)上的运行效果,还不错!用于自动售货机,告别 12864 死板的界面。
这个帖子,我想展示的是 ,即便是只有128x64个点的黑白 屏,一样可以做出不错的 人性化 GUI ,提供较好的用户体验,这是一个好的产品开发人员所必需的理念!
下面贴几张图和一个视频展示下效果,如果觉得这种想法可以借鉴的,顶一下吧。至于源代码到处都有,就没啥很多技术含量了,我就不再啰嗦了,ucGUI的论坛都有无数个源代码的帖了。
http://v.youku.com/v_show/id_XNTY1NTk2NTg4.html
我说下几个移植uCGUI的重点,个人经验总结:
以移植12864为例,先写好 画点函数LCD12864_PixSet(xPhys,yPhys,PixelIndex);, 读点函数 LCD12864_PixGet(xPhys,yPhys); ,然后找到uCGUI 中源代码中 下面的这个的红色标识地方,
改成 你自己的 12864 读写点的 函数,就这么简单,初步移植主要就这些工作。
然后看项目需要,要求高的话,再对显示驱动做下运行效率优化。
/*********************************************************************
*
* LCD_L0_SetPixelIndex
*
* Purpose:
* Sets the index of the given pixel. The upper layers
* calling this routine make sure that the coordinates are in range, so
* that no check on the parameters needs to be performed.
*/
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {
GUI_USE_PARA(x);
GUI_USE_PARA(y);
GUI_USE_PARA(PixelIndex);
/* Convert logical into physical coordinates (Dep. on LCDConf.h) */
#if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
int xPhys = LOG2PHYS_X(x, y);
int yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
/* Write into hardware ... Adapt to your system */
{
LCD12864_PixSet(xPhys,yPhys,PixelIndex);
/* ... */
}
}
/*********************************************************************
*
* LCD_L0_GetPixelIndex
*
* Purpose:
* Returns the index of the given pixel. The upper layers
* calling this routine make sure that the coordinates are in range, so
* that no check on the parameters needs to be performed.
*/
unsigned int LCD_L0_GetPixelIndex(int x, int y) {
LCD_PIXELINDEX PixelIndex;
GUI_USE_PARA(x);
GUI_USE_PARA(y);
/* Convert logical into physical coordinates (Dep. on LCDConf.h) */
#if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
int xPhys = LOG2PHYS_X(x, y);
int yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
/* Read from hardware ... Adapt to your system */
{
//PixelIndex = 0;/* ... */
PixelIndex = LCD12864_PixGet(xPhys,yPhys);
}
return PixelIndex;
}
至于 在 uC GUI 的窗口界面中,如何出来消息,下面copy一部分项目中的源代码,(因为是商业项目,不便把这个源代码全部公开,但是,下面的精华都贴出来 了,大家可以看到消息是如何处理的,至少给后来开发者一个少走弯路的帮助吧!)
/////Sub10Menu/////
static const GUI_WIDGET_CREATE_INFO _aDialogCreateS10[] = {
{ FRAMEWIN_CreateIndirect, "快捷补货", 0, 14, 4, 100,56, FRAMEWIN_CF_MOVEABLE,0},
{ BUTTON_CreateIndirect, "确定", GUI_ID_BUTTON0, 10, 20, 32, 16, 0,0},
{ TEXT_CreateIndirect, "自动补货成功!", GUI_ID_TEXT0, 6, 5, 80, 12, 0,0},
{ PROGBAR_CreateIndirect, NULL, GUI_ID_PROGBAR0, 13, 2, 70, 16, 0,0},
{ BUTTON_CreateIndirect, "About : 492364042@qq.com", GUI_ID_BUTTON1, 46, 20, 42, 16, 0,0}
};
void PaintDialogS10(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin;
}
void InitDialogS10(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin;
//
//FRAMEWIN
//
FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
FRAMEWIN_AddMaxButton(hWin, FRAMEWIN_BUTTON_RIGHT, 1);
FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
//
//GUI_ID_TEXT0
//
WM_HideWindow(WM_GetDialogItem(hWin,GUI_ID_TEXT0));
//
//GUI_ID_PROGBAR0
//
WM_HideWindow(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0));
TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0),"确定自动补货?");
WM_ShowWindow( WM_GetDialogItem(hWin,GUI_ID_TEXT0) );
WM_Paint(WM_GetDialogItem(hWin,GUI_ID_TEXT0));
}
static void _cbCallbackS10(WM_MESSAGE * pMsg)
{
int i = 0;
u8 err;
int NCode, Id;
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId)
{
case WM_PAINT:
PaintDialogS10(pMsg);
WM_SetFocus(hWin);
break;
case WM_INIT_DIALOG:
InitDialogS10(pMsg);
break;
case WM_KEY:
switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
{
case GUI_KEY_ESCAPE:
GUI_EndDialog(hWin, 1);
break;
case GUI_KEY_ENTER:
break;
}
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
{
}
break;
case WM_NOTIFICATION_GOT_FOCUS:
{
BUTTON_SetPressed(WM_GetFocussedWindow(),1);
}
break;
case WM_NOTIFICATION_LOST_FOCUS :
{
BUTTON_SetPressed(WM_GetFocussedWindow(),0);
}
break;
}
switch (Id)
{
case GUI_ID_OK:
if(NCode==WM_NOTIFICATION_RELEASED)
GUI_EndDialog(hWin, 0);
break;
case GUI_ID_CANCEL:
if(NCode==WM_NOTIFICATION_RELEASED)
GUI_EndDialog(hWin, 0);
break;
case GUI_ID_BUTTON0:
if(NCode==WM_NOTIFICATION_RELEASED)
{
TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0),"正在自动补货...");
WM_ShowWindow(WM_GetDialogItem(hWin,GUI_ID_TEXT0));
delay_ms(100);
WM_HideWindow(WM_GetDialogItem(hWin,GUI_ID_TEXT0));
WM_ShowWindow(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0));
/* Modify progress bar */
for (i = 0; i <= 100; i= i + 9) //i++)
{
PROGBAR_SetValue(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0), i);
WM_Paint(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0));
//GUI_Delay(1);
delay_ms(5);
}
PROGBAR_SetValue(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0), 100);
delay_ms(50);
/* Delete progress bar */
//PROGBAR_Delete(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0));
WM_HideWindow(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0));
PROGBAR_SetValue(WM_GetDialogItem(hWin,GUI_ID_PROGBAR0), 0);
OneKeyforShort();
CPTGoodsRTStock();
ColList_WRSAVE();
TEXT_SetText(WM_GetDialogItem(hWin,GUI_ID_TEXT0),"自动补货完成!");
WM_ShowWindow(WM_GetDialogItem(hWin,GUI_ID_TEXT0));
WM_Paint(WM_GetDialogItem(hWin,GUI_ID_TEXT0));
////OSSemPend(sem_Speak,0,&err);
SYN_FrameInfo(1,"补货完成") ;
////OSSemPost(sem_Speak);
BUTTON_SetText(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),"成功");
WM_Paint(WM_GetDialogItem(hWin,GUI_ID_BUTTON0));
//GUI_Delay(20);
//GUI_EndDialog(hWin, 0);
}
break;
case GUI_ID_BUTTON1:
if(NCode==WM_NOTIFICATION_RELEASED)
{
//hDialog =
hWndS100 = GUI_CreateDialogBox(_aDialogCreateS100, GUI_COUNTOF(_aDialogCreateS100), &_cbCallbackS100, hWndS10, 0, 0);
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|