|
正在学习emwin的窗口机制,按照PC上的历程也实现了窗口移动。
只是没有开缓存设备,会有闪变效果。目前emwin通过外挂的SRAM分配了350K内存,
通过WM_SetCreateFlags(WM_CF_MEMDEV);,显示不正常。
刚开始我以为是SRAM没有配置好,但是我通过以下代码测试,完全正常。
- static GUI_MEMDEV_Handle RefLCD;
-
- RefLCD=GUI_MEMDEV_CreateEx(0,0,480,320,GUI_MEMDEV_NOTRANS);
- GUI_MEMDEV_Select(RefLCD);
-
- GUI_SetBkColor(GUI_BLUE);
- GUI_Clear();
-
- GUI_MEMDEV_CopyToLCD(RefLCD);
- // while(1);
复制代码 当执行完GUI_MEMDEV_CopyToLCD(RefLCD);后,LCD整个屏幕就蓝色了。
然后我将emwin的缓存由外部,更换为内部sram,开了50K的缓存。
这下显示效果就正常了,而且确实没有闪变效应。然后我就不知道怎么办了....
以下是代码,请高手帮帮忙,谢谢!
- //显示缓存
- static char i8DisBuf[100];
- //状态栏索引
- static WM_HWIN i32StatusBarIndex;
- static WM_HWIN i32RtcIndex;
- static void Ui_DisString(uint32_t u32MsgAddr);
- /*
- 功能:向RTC发送消息
- */
- void Ui_Msg_Send2Rtc(void)
- {
- WM_SendMessageNoPara(i32RtcIndex,UIMSG_REFSTR);
- WM_InvalidateWindow(i32RtcIndex);
- }
- /*
- 功能:RTC窗口回调
- */
- static void Ui_RtcCb(WM_MESSAGE *pMsg)
- {
- GUI_RECT Rect;
- static UiStringstr sstrRtcString=
- {
- .u16x=0,
- .u16y=0,
- .string=i8DisBuf,
- .u32CharColor=GUI_BLACK,
- .u32BkColor=GUI_WHITE,
- .EnumFont=FONT_IN_6X8,
- };
- switch(pMsg->MsgId)
- {
- case UIMSG_REFSTR:
- {
-
- RtcDataStr strRtc=Func_RtcGetVal();
-
- sprintf(i8DisBuf,"%d-%02d-%02d %02d:%02d:%02d [%d]",strRtc.u16Year,strRtc.u8Month,strRtc.u8Date,
- strRtc.u8Hour,strRtc.u8Min,strRtc.u8Second,strRtc.u8Week);
- if(strlen(sstrRtcString.string)>23)
- {
- sstrRtcString.string[22]='\0';
- }
-
- }break;
- case WM_PAINT:
- {
- // UI_TRACE("RTC PAINT WINDOW\r\n");
- WM_GetInsideRect(&Rect);
- GUI_SetBkColor(GUI_BLUE);
- GUI_SetColor(GUI_YELLOW);
- GUI_ClearRectEx(&Rect);
- GUI_DrawRectEx(&Rect);
- Ui_DisString((uint32_t)&sstrRtcString);
- }break;
- default:
- {
- WM_DefaultProc(pMsg);
- }break;
- }
- }
- /*
- 功能:状态栏回调函数
- */
- static void Ui_StatusCb(WM_MESSAGE *pMsg)
- {
- GUI_RECT Rect;
-
- switch(pMsg->MsgId)
- {
- case WM_PAINT:
- {
- WM_GetInsideRect(&Rect);
- GUI_SetBkColor(GUI_WHITE);
- GUI_SetColor(GUI_YELLOW);
- GUI_ClearRectEx(&Rect);
- GUI_DrawRectEx(&Rect);
- GUI_SetColor(GUI_BLACK);
- GUI_SetFont(&GUI_Font8x16);
- GUI_DispStringHCenterAt("Foreground window 12435", 10, 30);
- }break;
- default:
- {
- WM_DefaultProc(pMsg);
- }break;
- }
- }
- /*
- 功能:配置状态栏
- */
- static void Ui_StatusBarCfg(void)
- {
- i32StatusBarIndex=WM_CreateWindow(0,0,240,150,WM_CF_SHOW,Ui_StatusCb,0);
- i32RtcIndex=WM_CreateWindowAsChild(0,0,150,50,i32StatusBarIndex,WM_CF_SHOW,Ui_RtcCb,0);
- }
- /*
- 功能:配置桌面窗口
- */
- static void Ui_DesktopCfg(void)
- {
- WM_SetDesktopColor(GUI_RED);
- WM_SetCreateFlags(WM_CF_MEMDEV);
- }
- /*
- 功能:UI显示模块初始化
- 备注:需要在任务中初始化!
- */
- void Ui_Init(void)
- {
- //开启CRC效验
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
- //初始化GUI
- GUI_Init();
- //配置窗口
- Ui_DesktopCfg();
- Ui_StatusBarCfg();
-
- while(1)
- {
- for (int i = 0; i < 20; i++) {
- WM_MoveWindow(i32StatusBarIndex, 2, 2);
- WM_MoveWindow(i32RtcIndex, 2, 2);
- GUI_Delay(10);
- }
- for (int i = 0; i < 20; i++) {
- WM_MoveWindow(i32StatusBarIndex, -2, -2);
- WM_MoveWindow(i32RtcIndex, -2, -2);
- GUI_Delay(10);
- }
- }
- }
复制代码 |
|