硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2358|回复: 4
收起左侧

[emWin] 请教下,V6-607_STemWin实验_窗口中任意绘制2D图形,不限制在WM_PAINT消息里面(RTOS)历程里面增加绘制bmp图片显示不正常?

[复制链接]

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
发表于 2018-5-18 23:26:36 | 显示全部楼层 |阅读模式
请教下,V6-607_STemWin实验_窗口中任意绘制2D图形,不限制在WM_PAINT消息里面(RTOS)历程里面增加绘制bmp图片显示不正常?

具体描述如下:

static const unsigned short _ac272x272[] = {
  0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
  0xFFFF, 0xFFFF,
... ... 省略

};


GUI_CONST_STORAGE GUI_BITMAP bm272x272 = {
  272, // xSize
  272, // ySize
  544, // BytesPerLine
  16, // BitsPerPixel
  (unsigned char *)_ac272x272,   // Pointer to picture data
  NULL,  // Pointer to palette
  GUI_DRAW_BMP565
};



// 显示 bmp 图片在 lcd 上

void GUI_MEMDEV_Test(void)
{
    GUI_MEMDEV_Handle hMem1;
   
    /* 创建内存设备,并将RGB565格式的位图绘制到内存设备上 */
    hMem1 = GUI_MEMDEV_CreateFixed(0, 0, 272, 272, GUI_MEMDEV_NOTRANS, // GUI_MEMDEV_HASTRANS, 透明性
                                                                                                                                // GUI_MEMDEV_NOTRANS 无透明性
                                                     GUI_MEMDEV_APILIST_16,
                                                     GUI_COLOR_CONV_565);   
    GUI_MEMDEV_Select(hMem1);
    GUI_DrawBitmap(&bm272x272 , 0, 0);  // 绘制数据到内存
    GUI_MEMDEV_Select(0);
    GUI_MEMDEV_WriteAt(hMem1, 742, 70);   //此函数用于将存储设备的内容绘制到 LCD 显示屏上
   

      // 显示如下字符正常

      GUI_LCD_DispStringAt(50, 450,
                                GUI_WHITE, 0xc0c0c0,
                                GUI_TM_NORMAL, &GUI_FontHZ16,
                                (const char *) "clock picture 客户区显示测试");   
   
}






static void _cbDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem, hWinOld;
    int     NCode;
    int     Id;

    switch (pMsg->MsgId)
    {
        case WM_INIT_DIALOG:
            //
            // 初始化框架窗口
            //
            hItem = pMsg->hWin;
            FRAMEWIN_SetFont(hItem, GUI_FONT_32B_ASCII);
            FRAMEWIN_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            FRAMEWIN_SetText(hItem, "hpdell");

            //
            // 初始化按钮控件
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
            BUTTON_SetFont(hItem, GUI_FONT_24B_ASCII);
            BUTTON_SetText(hItem, "LED1");
            break;
        
        case WM_PAINT:
            /* 重绘消息处理,重绘背景色并显示一条红色直线 */
            GUI_SetBkColor(0xc0c0c0);
            GUI_Clear();
            GUI_SetColor(GUI_RED);
            GUI_DrawLine(35, 10, 185, 10);
        
        
            break;
            
        case WM_NOTIFY_PARENT:
            Id    = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id)
            {
                case ID_BUTTON_0:
                    switch(NCode)
                    {
                        static U8 i = 0;
                        
                        case WM_NOTIFICATION_CLICKED:
                           
                            break;
                        
                        /* 松手后,在窗口上绘制梯度图形 */                        
                        case WM_NOTIFICATION_RELEASED:
                           
                            i++;
                          if(i>=4)
                                i=0;
                        
                            /*
                               设置要进行绘制操作的目标窗口
                               注意,创建的对话框主体函数是框架窗口,所以要调用函数WM_GetClientWindow获取客
                               户区窗口,如果主体是窗口Window,无需调用此函数。此函数返回的是之前的目标窗口。
                            */
                            hWinOld = WM_SelectWindow(WM_GetClientWindow(pMsg->hWin));

                            /* 在对话框客户区窗口绘制梯度图形 */
                            GUI_DrawGradientRoundedH(35, 100, 180, 130, 5, _BkColor, _BkColor_2);
                            GUI_LCD_DispStringAt(50, 400,
                                                    GUI_WHITE, 0xc0c0c0,
                                                    GUI_TM_NORMAL, &GUI_FontHZ16,
                                                    (const char *) "GUI MaskTask Str 客户区显示测试");               
                           
                           
                         GUI_MEMDEV_Test();            // 在框架里面显示,图片上半部分显示异常,下半部分显示基本正常,但是貌似显示的图片都下移了1/4左右, ?????????
                                                                      // 效果图片2                           
                           
                            /* 配置回之前选择的目标窗口 */
                            WM_SelectWindow(hWinOld);
                            break;
                    }
                    break;
            }
            break;
            
        default:
            WM_DefaultProc(pMsg);
            break;
    }
}









/*
*********************************************************************************************************
*    函 数 名: CreateFramewin
*    功能说明: 创建对话框        
*    形    参: 无
*    返 回 值: 返回对话框句柄
*********************************************************************************************************
*/
WM_HWIN CreateFramewin(void)
{
    WM_HWIN hWin, hWinOld;

    GUI_MEMDEV_Test();            // 显示方法 1  ok  在创建 框架前显示,效果图片 1
    GUI_Delay(1000);
   
   
    hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
   
    /* 创建对话框后,将其立即绘制出来 */
    GUI_Exec();
   
    /*
       设置要进行绘制操作的目标窗口
       注意,创建的对话框主体函数是框架窗口,所以要调用函数WM_GetClientWindow获取客户区窗口,如果主体是
       窗口Window,无需调用此函数。此函数返回的是之前的目标窗口。
    */
    hWinOld = WM_SelectWindow(WM_GetClientWindow(hWin));
   
    /* 在刚创建的对话框客户区窗口上面绘制梯度图形 */
    GUI_DrawGradientRoundedH(35, 170, 180, 200, 5, GUI_GREEN, GUI_RED);
    /* 配置回之前选择的目标窗口 */
    WM_SelectWindow(hWinOld);

    return hWin;   
   
}


效果图片1:
ok-1.png


效果图片2:
fail.png










回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-5-19 01:29:05 | 显示全部楼层
将变量 GUI_MEMDEV_Handle hMem1;设置成全局变量

而函数GUI_MEMDEV_Test仅在GUI_Init后调用一次即可

使用应用的时候,仅需调用函数GUI_MEMDEV_WriteAt进行显示。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-5-19 08:02:33 | 显示全部楼层
eric2013 发表于 2018-5-19 01:29
将变量 GUI_MEMDEV_Handle hMem1;设置成全局变量

而函数GUI_MEMDEV_Test仅在GUI_Init后调用一次即可

我自己捣鼓了好久没有搞出来,你领导一句话就给我摆平了啊,多谢多谢

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-5-19 10:32:37 | 显示全部楼层
hpdell 发表于 2018-5-19 08:02
我自己捣鼓了好久没有搞出来,你领导一句话就给我摆平了啊,多谢多谢

有时候,emWin使用中要注意的问题较多。不容易发现错误的地方。
回复

使用道具 举报

681

主题

3485

回帖

5553

积分

论坛元老

积分
5553
 楼主| 发表于 2018-5-19 10:35:16 | 显示全部楼层
本帖最后由 hpdell 于 2018-5-19 16:30 编辑
eric2013 发表于 2018-5-19 10:32
有时候,emWin使用中要注意的问题较多。不容易发现错误的地方。

是啊, 感觉这个 emwin 的 套路太深啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-16 18:47 , Processed in 0.243488 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表