emwin的WM_PAINT

Posted ys77

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了emwin的WM_PAINT相关的知识,希望对你有一定的参考价值。

 1 //界面实现
 2 static void _cbDummy(WM_MESSAGE* pMsg)
 3     int Id, NCode;
 4     int hour, min, second, tim;
 5     WM_HWIN hWin;
 6     char temp[4], temp1[4];
 7     char tim_t[10];
 8     hWin = pMsg->hWin;
 9 //    create_basePage(); 
10     switch (pMsg->MsgId) 
11       case WM_CREATE:
12         WM_CreateTimer(hWin, 0, 1000, 0);
13         break;
14       case WM_TIMER:
15         WM_RestartTimer(pMsg->Data.v, 1000);
16         //时间格式转换
17         break;
18       case WM_PAINT:
19         create_basePage();  //每次都重绘背景和标题
20         break;
21 
22       case WM_NOTIFY_PARENT:
23         Id = WM_GetId(pMsg->hWinSrc);
24         NCode = pMsg->Data.v;
25         switch(Id) 
26         case ID_BUTTON_0:  //设置
27             switch(NCode) 
28               case WM_NOTIFICATION_CLICKED:
29                 break;
30               case WM_NOTIFICATION_RELEASED:
31                   if(controlSet==0) 
32                     controlSet = 1;
33                     BUTTON_SetText(setbutton, Font_Back);
34                     //BUTTON_SetText(setbutton, "返回");
35                     hWinSet1 = CreateSetWindow();
36                     BUTTON_SetBitmapEx(setbutton, BUTTON_BI_UNPRESSED, &bmstart1, 32, 2);
37                   else 
38                     controlSet = 0;
39                     BUTTON_SetText(setbutton, Font_Set);
40                     //BUTTON_SetText(setbutton, "设置");
41                     WM_DeleteWindow(hWinSet1);
42                     BUTTON_SetBitmapEx(setbutton, BUTTON_BI_UNPRESSED, &bmstart, 32, 2);
43                   
44                 break;
45             
46             break;
47 
48          case ID_BUTTON_1:  //启动/停止
49             switch(NCode) 
50               case WM_NOTIFICATION_CLICKED:
51                 break;
52               case WM_NOTIFICATION_RELEASED:
53                 if(startOrStop==0)
54                     startOrStop = 1;
55                     printf("start\n");
56                 else 
57                     startOrStop = 0;
58                     printf("stop\n");
59                 
60                 invalidStartButton(hWin);
61                 break;
62             
63             break;
64         
65         break;
66 
67     default:
68         WM_DefaultProc(pMsg);
69         break;
70     
71 
72 
73 
74 WM_HWIN CreateWindow(void) 
75     //get_gif(); //显示开机动画
76     BUTTON_SetDefaultSkinClassic(); //使用经典皮肤
77     hWinBase = WM_CreateWindow(0,  0, 480, 320, WM_CF_SHOW, _cbDummy, 0);
78     return hWinBase;
79 

emwin中自己创建窗口,并且将所有的界面都放在WM_PAINT下面,运行定时器的时候,总是卡死,一直找不到原因,最后发现可能是内存不足,找到原因是

create_basePage(); //每次都重绘背景和标题

每次都重绘整个页面然后又没有清除导致内存不足,进行不断的尝试,发现create_basePage();放在WM_PAINT之外,不能画矩形设置背景色,并且按钮的监听也有问题,

最后只能重写,写完之后,WM_PAINT只需要放置画矩形,需要重绘的控件就能实现功能,并且也不会内存不足,引以为戒!

case WM_PAINT:
    GUI_Clear();
    GUI_DrawGradientV(0, 0, LCD_GetXSize(), LCD_GetYSize(), GUI_LIGHTGREEN, 0x71B33C);  //渐变色填充
    GUI_SetPenSize(1); //画笔像素 1
    GUI_SetColor(GUI_BLACK);  //画笔颜色黑色
    GUI_DrawRect(1, 1, 388, 52); //绘制矩形

    //画边框
    GUI_DrawRect(388, 70, 478, 250);

    //告警栏
    GUI_DrawRect(388, 125, 478, 184);

    //频率显示栏
    GUI_DrawRect(1, 52, 388, 270);

    //数据显示栏
    GUI_DrawRect(1, 270, 388, 318);

    //数据显示分栏
    GUI_DrawRect(126, 270, 252, 318);

    //画启动框
    //GUI_DrawRect(388, 220, 479, 319);

    //重绘
    //重绘倒计时
    if(strlen(time_buffer)==0 || !strcmp(time_buffer, "00:00:00"))
        TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_7), "00:00:00");
    else 
        controlTime = 1;
        TEXT_SetText(WM_GetDialogItem(pMsg->hWin, ID_TEXT_7), time_buffer);
    

 

以上是关于emwin的WM_PAINT的主要内容,如果未能解决你的问题,请参考以下文章

第3版emWin教程第3章 emWin介绍

第3版emWin教程第27章 emWin6.x支持的字体简介

emWin 2天速成实例教程000_如何快速入门ucGUI/emWin

第3版emWin教程第40章 emWin6.x支持的颜色格式

第3版emWin教程第12章 emWin6.x文本显示

emwin创建的窗口,怎么删除