硬汉嵌入式论坛

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

[emWin] emwin 在子窗口显示Bmp图片不显示

[复制链接]

5

主题

13

回帖

28

积分

新手上路

积分
28
发表于 2020-12-11 14:39:12 | 显示全部楼层 |阅读模式
hMemBMP = ShowBmp("pic\\bmpcvt\\grid.bmp", 0, 0);
GUI_MEMDEV_WriteAt(hMemBMP, 0,0);
在桌面显示没问题,在桌面的子窗口显示时显示不出来

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2020-12-12 01:37:51 | 显示全部楼层
完整代码看下,方便的话,仅emWin部分即可
回复

使用道具 举报

5

主题

13

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2020-12-14 09:43:03 | 显示全部楼层
#include "DIALOG.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern void _cbCollectPage(WM_MESSAGE* pMsg);

char * _acBuffer;
GUI_HMEM hMem;
GUI_MEMDEV_Handle hMemBMP;
GUI_BITMAP Bitmap0;
GUI_LOGPALETTE Palette0;
GUI_HMEM hMemButtonBitmap0;


WM_HWIN    _hLastFrame;

#define BUTTON_CLICK_SPEED        600
#define BUTTON_CLICK_DELAY        750
#define DEFAULT_WIDGET_EFFECT     (&WIDGET_Effect_None)

#define MAIN_BKCOLOR              GUI_WHITE
#define MAIN_TEXTCOLOR            0x000000
//#define MAIN_FONT                 (&GUI_FontYahei)
#define MAIN_BORDER               0
#define MAIN_TITLE_HEIGHT         0
//#define MAIN_LOGO_BITMAP          (&bmLogo_armflySmall)
#define MAIN_LOGO_OFFSET_X        0
#define MAIN_LOGO_OFFSET_Y        0

#define FRAME_BKCOLOR             GUI_WHITE
#define FRAME_TEXTCOLOR           0x000000
//#define FRAME_FONT                (&GUI_FontYahei)
#define FRAME_EFFECT              (&WIDGET_Effect_None)
#define FRAME_BORDER              FRAME_EFFECT->EffectSize
#define FRAME_WIDTH               (LCD_GetXSize() - (FRAME_BORDER * 2) - (MAIN_BORDER * 2))
#define FRAME_HEIGHT              (LCD_GetYSize() - (FRAME_BORDER * 2) - (MAIN_BORDER + MAIN_TITLE_HEIGHT))


#define FRAME_BUTTON_BKCOLOR0     0xB8B8B8              /* Unpressed */
#define FRAME_BUTTON_BKCOLOR1     0xE0E0E0              /* Pressed   */
#define FRAME_BUTTON_BKCOLOR2     0xC0C0C0              /* Disabled  */
#define FRAME_BUTTON_COLOR0       0x000000              /* Unpressed */
#define FRAME_BUTTON_COLOR1       0x000000              /* Pressed   */
//#define FRAME_BUTTON_FONT         (&GUI_FontYahei)
#define FRAME_BUTTON_EFFECT       (&WIDGET_Effect_None)

#define MENU_ID_WINDOW_0 (GUI_ID_USER + 0x00)
#define MENU_ID_BUTTON_0 (GUI_ID_USER + 0x01)

static const GUI_WIDGET_CREATE_INFO _aDialogMenuPageCreate[] = {
        { WINDOW_CreateIndirect, "Window", MENU_ID_WINDOW_0, 0, 0, 1024, 600, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "Button", MENU_ID_BUTTON_0, 200, 100, 80, 80, 0, 0x0, 0 },
};

void _DrawDownRectEx(const WIDGET_EFFECT* pEffect, const GUI_RECT* pRect)
{
        WM_LOCK();
        pEffect->pfDrawDownRect(pRect);
        WM_UNLOCK();
}

void _DrawDownRect(const WIDGET_EFFECT* pEffect, int x0, int y0, int x1, int y1)
{
        GUI_RECT r;

        r.x0 = x0;
        r.y0 = y0;
        r.x1 = x1;
        r.y1 = y1;
        _DrawDownRectEx(pEffect, &r);
}

void _PaintFrame(void)
{
        GUI_RECT r;
        WM_GetClientRect(&r);
        GUI_SetBkColor(FRAME_BKCOLOR);
        GUI_SetColor(FRAME_TEXTCOLOR);
        //GUI_SetFont(FRAME_FONT);
        GUI_SetTextMode(GUI_TM_TRANS);
        GUI_ClearRectEx(&r);
}

WM_HWIN _CreateFrame(WM_CALLBACK* cb)
{
        int x = 0;
        int y = 0;
        x = FRAME_BORDER + MAIN_BORDER;
        y = FRAME_BORDER + MAIN_TITLE_HEIGHT;

        _hLastFrame = WM_CreateWindowAsChild(x, y, FRAME_WIDTH, FRAME_HEIGHT, WM_HBKWIN, WM_CF_SHOW, cb, 0);

        return _hLastFrame;
}

void _DeleteFrame(void)
{
        WM_DeleteWindow(_hLastFrame);
        _hLastFrame = 0;
}

WM_HWIN _CreateButton(WM_HWIN hParent, const char* pText, int Id, int x, int y, int w, int h, unsigned TextId)
{
        WM_HWIN hButton;
        hButton = BUTTON_CreateEx(x, y, w, h, hParent, WM_CF_SHOW, 0, Id);

        BUTTON_SetText(hButton, pText);
        //BUTTON_SetFont      (hButton,    FRAME_BUTTON_FONT);
        BUTTON_SetBkColor(hButton, 0, FRAME_BUTTON_BKCOLOR0);
        BUTTON_SetBkColor(hButton, 1, FRAME_BUTTON_BKCOLOR1);
        BUTTON_SetBkColor(hButton, 2, FRAME_BUTTON_BKCOLOR2);
        BUTTON_SetTextColor(hButton, 0, FRAME_BUTTON_COLOR0);
        BUTTON_SetTextColor(hButton, 1, FRAME_BUTTON_COLOR1);
        BUTTON_SetTextColor(hButton, 2, FRAME_BUTTON_COLOR0);
        WIDGET_SetEffect(hButton, FRAME_BUTTON_EFFECT);

        /* 设置接收输入焦点的能力 */
        BUTTON_SetFocussable(hButton, 1);

        return hButton;
}

void _cbBkWindow(WM_MESSAGE* pMsg)
{
        switch (pMsg->MsgId)
        {
        case WM_PAINT:
        {
                                         int x, y, w, h;

                                         GUI_SetBkColor(MAIN_BKCOLOR);
                                         GUI_SetColor(MAIN_TEXTCOLOR);
                                         //GUI_SetFont(MAIN_FONT);
                                         GUI_Clear();
                                         //x = MAIN_LOGO_OFFSET_X + MAIN_BORDER;
                                         //y = MAIN_LOGO_OFFSET_Y + ((MAIN_TITLE_HEIGHT - MAIN_LOGO_BITMAP->YSize) >> 1);
                                         //GUI_DrawBitmap(MAIN_LOGO_BITMAP, x, y);
                                         x = 0;
                                         y = 0;
                                         w = LCD_GetXSize();
                                         h = LCD_GetYSize();
                                         _DrawDownRect(FRAME_EFFECT, x, y, w, h);
        }
                break;
        default:
                WM_DefaultProc(pMsg);
        }
}

void _cbMenuPage(WM_MESSAGE* pMsg)
{
        WM_HWIN hWin = pMsg->hWin;
        WM_HWIN hItem;
        switch (pMsg->MsgId)
        {
        case WM_CREATE:

                /* 设置聚焦 */
                WM_SetFocus(hWin);

               
                        _CreateButton(hWin, "button", MENU_ID_BUTTON_0 ,
                                _aDialogMenuPageCreate[1].x0,
                                _aDialogMenuPageCreate[1].y0,
                                _aDialogMenuPageCreate[1].xSize,
                                _aDialogMenuPageCreate[1].ySize,
                                0);
       
                        hMemBMP = ShowBmp("pic\\1.bmp", 0, 0);
                        GUI_MEMDEV_WriteAt(hMemBMP, 0, 0);
                       
                break;

        case WM_KEY:
                switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                {
                case GUI_KEY_ESCAPE:
                        GUI_EndDialog(hWin, 1);
                        break;

                case GUI_KEY_TAB:
                        WM_SetFocusOnNextChild(hWin);
                        break;
                }
                break;

        case WM_PAINT:
                _PaintFrame();
                break;

        case WM_NOTIFY_PARENT:
                if (pMsg->Data.v == WM_NOTIFICATION_RELEASED)
                {
                        int Id = WM_GetId(pMsg->hWinSrc);
                        switch (Id)
                        {
                        case MENU_ID_BUTTON_0:
                                _DeleteFrame();
                                GUI_ALLOC_Free(hMemButtonBitmap0);
                                _CreateFrame(&_cbCollectPage);
                                break;
                        }
                }
                break;

        default:
                WM_DefaultProc(pMsg);
        }
}

void MainTask(void)
{
        GUI_Init();

        WM_SetCreateFlags(WM_CF_MEMDEV);

        GUI_SelectLayer(0);
        GUI_SetBkColor(GUI_WHITE);
        GUI_Clear();

        hMemBMP = ShowBmp("pic\\1.bmp", 0, 0);
        GUI_MEMDEV_WriteAt(hMemBMP, 100, 100);
        GUI_Delay(5000);

        WM_SetCallback(WM_HBKWIN, &_cbBkWindow);

        _CreateFrame(&_cbMenuPage);

        while (1)
        {
                GUI_Delay(10);
        }
}

GUI_HMEM ShowBmp(const char *filename, int x, int y)
{
        FILE * fp = NULL;
        int filesize = 0;
        int cnt = 0;
        int xSize = 0, ySize = 0;
        fp = fopen(filename, "rb");
        char *_acBuffer;

        if (fp == NULL)
        {
                printf("%sbmp文件不存在\n", filename);
                return -1;
        }
        else
        {

                fseek(fp, 0, SEEK_END);
                filesize = ftell(fp);
                fseek(fp, 0, SEEK_SET);
                hMem = GUI_ALLOC_AllocZero(filesize);
                _acBuffer = GUI_ALLOC_h2p(hMem);
                cnt = fread(_acBuffer, sizeof(char), filesize, fp);
                if (cnt != filesize)
                {
                        printf("读取%sbmp文件失败\n", filename);
                        GUI_ALLOC_Free(hMem);
                        fclose(fp);
                        return -2;
                }
                else
                {
                        xSize = GUI_BMP_GetXSize(_acBuffer);
                        ySize = GUI_BMP_GetYSize(_acBuffer);
                        hMemBMP = GUI_MEMDEV_CreateEx(0, 0, xSize, ySize, GUI_MEMDEV_NOTRANS);
                        GUI_MEMDEV_Select(hMemBMP);
                        GUI_BMP_Draw(_acBuffer, x, y);
                        GUI_MEMDEV_Select(0);
                        GUI_ALLOC_Free(hMem);
                        fclose(fp);
                        return hMemBMP;
                        //return hMem;
                }
        }
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115804
QQ
发表于 2020-12-14 13:08:49 | 显示全部楼层
不能在WM_CREATE里面绘制
case WM_CREATE:

           hMemBMP = ShowBmp("pic\\1.bmp", 0, 0);
           GUI_MEMDEV_WriteAt(hMemBMP, 0, 0);
回复

使用道具 举报

5

主题

13

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2020-12-14 14:55:12 | 显示全部楼层
好的,感谢硬汉
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 21:23 , Processed in 0.230781 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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