在前几次的实验中,已经将GUI和操作系统都移植完成。这次就做了一个简单的涂鸦板。功能:能调整画笔的粗细,任意涂鸦并能清屏。
基于上一个实验的代码继续编写代码:
重要的两个任务是:
void GUI_TOUCH_TASK(void *pdata)
{
pdata = pdata;
for(;;)
{
OSTimeDly(TIMEDELAY_TOUCH);
GUI_TOUCH_Exec(); //触屏检测
}
}
void GUI_EEPW_TASK(void *pdata)
{
pdata = pdata;
for(;;)
{
OSTimeDlyHMSM(0,0,1,0);
}
}
void GUI_GD32_TASK(void *pdata)
{
pdata = pdata;
GUI_TaskFunc();
for(;;)
{
WM_Exec(); //GUI重绘
OSTimeDly(TIMEDELAY_PAINT);
}
}
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "GD32", 0, 0, 0, 240,320,FRAMEWIN_CF_MOVEABLE,0},
{ SLIDER_CreateIndirect, NULL, GUI_ID_SLIDER0, 1, 264,160,26, 0,0},
{ BUTTON_CreateIndirect, "CLEAR", GUI_ID_BUTTON0, 167,264,68, 26, 0,0}
};
void InitDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin;
//
//FRAMEWIN
//
FRAMEWIN_SetClientColor(hWin,0xffff80);
FRAMEWIN_SetFont(hWin,&GUI_FontHZ16);
FRAMEWIN_AddMinButton(hWin, FRAMEWIN_BUTTON_RIGHT, 2);
FRAMEWIN_SetTitleHeight(hWin,17);
//
//GUI_ID_SLIDER0
//
SLIDER_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),0xffff80);
SLIDER_SetRange(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),1,10);
SLIDER_SetValue(WM_GetDialogItem(hWin,GUI_ID_SLIDER0),10);
//
//GUI_ID_BUTTON0
//
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),BUTTON_CI_UNPRESSED,0x8080ff);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontHZ16);
}
回调函数是整个功能的核心:
static void _cbCallback(WM_MESSAGE * pMsg)
{
int NCode, Id;
static u16 x_draw,y_draw;
static u16 length_fram;
GUI_PID_STATE GUI_PID_DRAW;
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId)
{
case WM_CREATE:
length_fram = FRAMEWIN_GetTitleHeight(hWin);
break;
case WM_PAINT:
PaintDialog(pMsg);
GUI_SetColor(GUI_RED);
if(x_draw < 200 && x_draw > 40 && y_draw < 200 + length_fram && y_draw > 20 + length_fram)
{
GUI_SetPenSize(SLIDER_GetValue(WM_GetDialogItem(hWin,GUI_ID_SLIDER0)));
GUI_DrawPoint(x_draw,y_draw - length_fram);
DrawFlag = 0;
}
break;
case WM_INIT_DIALOG:
InitDialog(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:
GUI_EndDialog(hWin, 0);
break;
}
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
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)
{
DrawFlag = 0;
x_draw = 0;
y_draw = 0;
WM_InvalidateRect(WM_GetClientWindow(hWin),&RectDraw);
}
break;
}
break;
case WM_TOUCH:
GUI_TOUCH_GetState(&GUI_PID_DRAW);
x_draw = GUI_PID_DRAW.x;
y_draw = GUI_PID_DRAW.y;
if(x_draw < 200 && x_draw > 40 && y_draw < 200 + length_fram && y_draw > 20 + length_fram)
{
DrawFlag = 1;
WM_InvalidateRect(WM_GetClientWindow(hWin),&RectDraw);
}
break;
default:
WM_DefaultProc(pMsg);
}
}
看看效果图:
我要赚赏金
