|
如图,左上角白色窗口使用了存储设备进行绘制。
该窗口是单独用GUI_CreateDialogBox()再创建的一个窗口h_track。在h_track的WM_INIT_DIALOG消息里面,
调用track_display_init()创建了存储设备,源代码见后面。
然后在h_track的WM_PAINT消息里面调用track_display()用于实时显示2D轨迹。
由于是在WM_PAINT里面实时显示,然后就在主循环里面每200ms调用一次无效化h_track进行显示。
同时,调用add_track()增加一些轨迹。
现在的实际效果就是,白色框h_track会有些屏闪,而且如果在GUI_Init()之后使用WM_SetCreateFlags(WM_CF_MEMDEV);时,会闪的更厉害更明显。
不知道是不是存储设备没用好还是哪里的问题,按说,MCU驱动这个7寸屏应该是没什么压力的吧,而且还是16bit的,这个窗口大小也只有320*280.
把窗口高小成200*100时,屏闪也差不多,并没有什么变化。
这个会是些什么原因呢?
static void track_display_init(void)
{
h_mem_track = GUI_MEMDEV_CreateEx(0,0,WIN1_H,WIN1_V,GUI_MEMDEV_HASTRANS);
GUI_MEMDEV_Select(h_mem_track);
GUI_SetBkColor(GUI_WHITE);
GUI_Clear();
GUI_SetFont(&GUI_Font24_ASCII);
GUI_SetColor(GUI_BLACK);
//GUI_SetBkColor(GUI_WHITE);
GUI_DispStringAt("X:",10,0);
GUI_DispStringAt("Y:",100,0);
GUI_MEMDEV_Select(0);
}
void add_track(int x0,int y0,int x1,int y1)
{
char coord[8];
GUI_MEMDEV_Select(h_mem_track);
GUI_SetFont(&GUI_Font24B_ASCII);
GUI_SetBkColor(GUI_WHITE);
GUI_SetColor(GUI_BLACK);
GUI_DispStringAt("hello world",20+x1,50+y1);
// GUI_SetColor(GUI_RED);
sprintf(coord,"%d",x1);
GUI_DispStringAt(" ",20,0);
GUI_DispStringAt(coord,20,0);
sprintf(coord,"%d",y1);
GUI_DispStringAt(" ",120,0);
GUI_DispStringAt(coord,120,0);
GUI_MEMDEV_Select(0);
}
static void track_display(void)
{
GUI_MEMDEV_Select(0);
GUI_MEMDEV_WriteAt(h_mem_track,WIN1_X0,WIN1_Y0);
}
源代码主要就是这3个函数了,然后就是在主循环里面
while(1)
{
GUI_Delay(200);
add_track(x0,y0,x1,y1);
WM_InvalidateWindow(h_track);
x0 = x1;
y0 = y1;
if(x1>200 || y1>200)
{
add_dec = 1;
}
if(x1<3 || y1<4)
{
add_dec = 0;
}
if(add_dec)
{
x1 -= 3;
y1 -= 4;
}
else
{
x1 += 3;
y1 += 4;
}
} |
|