嵌入式学习小组
直播中

江松洁

7年用户 168经验值
私信 关注

WM_PAINT事件无法重绘是为什么?

我想在对话框的一个地方绘制一个渐变的矩形,初始化的时候渐变的矩形被绘制出来了,再次进WM_PAINT事件时,我想改变渐变矩形的大小,可是没有反应。部分代码如下:
case WM_PAINT:
            GUI_DrawGradientV(311,240-SpeedCurVal,320,240,GUI_WHITE,GUI_RED);
            SpeedCurVal++;
            if(SpeedCurVal == 200) SpeedCurVal = 0;
break;
在debug的时候 代码确实执行了,可是没有任何改变。
        调用WM_Paint()函数,触发重绘事件,矩形的大小会改变,可是没运行一会就死机了。
        望大神解答啊!!!!!!!!!!

回帖(2)

徐慧

2020-5-25 11:24:43
#include "GUI.h"
#include "DIALOG.h"
#include
/**********************************************************************************************************
*                                       宏定义
**********************************************************************************************************/
#define         ID_WINDOW_0                                         (GUI_ID_USER + 0x00)
#define                ID_TIMER_0                                                (GUI_ID_USER + 0x30)
/**********************************************************************************************************
*        函 数 名:
*        功能说明: 回调函数
*        形    参: pMsg   消息指针变量
*        返 回 值: 无
**********************************************************************************************************/
static void _cbCallback(WM_MESSAGE * pMsg)
{
        static int SpeedCurVal = 0;
        
    switch (pMsg->MsgId)
    {
                case WM_PAINT:
                        GUI_SetBkColor(GUI_BLACK);
                        GUI_Clear();
                        GUI_DrawGradientV(20,240 - SpeedCurVal,320,240,GUI_WHITE,GUI_RED);
                break;
               
        case WM_INIT_DIALOG:
                        WM_CreateTimer(pMsg->hWin,ID_TIMER_0,40,0);
        break;
               
                case WM_TIMER:
                        SpeedCurVal++;
            if(SpeedCurVal == 200)
                        {
                                SpeedCurVal = 0;
                        }
                        WM_RestartTimer(pMsg->Data.v, 40);
                        WM_InvalidateWindow(pMsg->hWin);
                break;
               
        default:
            WM_DefaultProc(pMsg);
    }
}
static const GUI_WIDGET_CREATE_INFO _aDialogCreateModality[] = {
        { WINDOW_CreateIndirect,    "",   ID_WINDOW_0,   0,   0, 480,272, 0, 0x0, 0 },
};
void MainTask(void)
{
        WM_SetCreateFlags(WM_CF_MEMDEV);
        GUI_Init();
        
        GUI_CreateDialogBox(        _aDialogCreateModality,
                                                        GUI_COUNTOF(_aDialogCreateModality),
                                                        &_cbCallback,
                                                        WM_HBKWIN,
                                                        0,
                                                        0);
                                                        
        while (1)
        {
                GUI_Delay(1000);
        }
}
举报

李牧喜

2020-5-25 11:43:45
我主要的问题其实是要设置我要绘制渐变矩形的那个区域无效就行了,        WM_InvalidateArea(&Rect);    //使显示器的部分区域无效         谢谢你的回答
举报

更多回帖

发帖
×
20
完善资料,
赚取积分