硬汉嵌入式论坛

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

[emWin] emwin内存设备使用问题

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2020-2-1 19:53:57 | 显示全部楼层 |阅读模式
请教大神们,使用WM_SetCreateFlags(WM_CF_MEMDEV) 开启内存设备后创建的窗口,在WM_PAINT消息中是不是不能再使用内存设备了?我现在在WM_PAINT消息中创建的内存设备,然后使用GUI_MEMDEV_Select(GUI_MEMDEV_GetWindowDevice(pMsg->hWin));或者GUI_MEMDEV_Select(0);或者GUI_SelectLCD();选择LCD,均不能把创建的内存设备绘制到LCD上
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-1 21:11:41 | 显示全部楼层
正常是没问题的,可以先在模拟器上试试。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2020-2-2 13:27:28 | 显示全部楼层

模拟器直接不能使用内存设备,是不是哪里没有配置好



回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2020-2-2 19:01:48 | 显示全部楼层
在模拟器上测试,5.48版本的按照论坛上画倒影的方法无效,5.30版本的可以的,但是还是不能使用WM_SetCreateFlags(WM_CF_MEMDEV) 开启内存设备,否则倒影无效
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-3 00:17:30 | 显示全部楼层
qq690846034 发表于 2020-2-2 19:01
在模拟器上测试,5.48版本的按照论坛上画倒影的方法无效,5.30版本的可以的,但是还是不能使用WM_SetCreate ...

方便的话,发下模拟器上的测试代码,仅发你写的测试部分即可
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2020-2-4 15:50:04 | 显示全部楼层
eric2013 发表于 2020-2-3 00:17
方便的话,发下模拟器上的测试代码,仅发你写的测试部分即可

#include "DIALOG.h"
#include "stdint.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"

static WM_HTIMER hTimer;
GUI_MEMDEV_Handle hMem;

enum
{
        ID_WINDOW_0 = (GUI_ID_USER + 0x00),
        ID_BTN_CLOSE,
};


static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
  { BUTTON_CreateIndirect, "", ID_BTN_CLOSE, 460, 0, 20, 20, 0, 0, 0 },
};

static void _cbCloseButton(WM_MESSAGE * pMsg)
{
        int     Id;
        GUI_RECT Rect;
        switch (pMsg->MsgId)
        {
        case WM_PAINT:
                Id = WM_GetId(pMsg->hWin);
                WM_GetClientRect(&Rect);
                switch (Id)
                {
                case ID_BTN_CLOSE:
                        GUI_SetColor(GUI_RED);
                        GUI_FillRectEx(&Rect);
                        GUI_SetColor(GUI_WHITE);
                        GUI_SetFont(GUI_FONT_16B_ASCII);
                        GUI_SetTextMode(GUI_TM_TRANS);
                        GUI_DispStringInRect("X", &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER);
                        break;
                }
                break;
        default:
                BUTTON_Callback(pMsg);
                break;
        }
}

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

        static uint8_t Index = 0;
        static uint8_t timer_count = 0;
        char buf[10];
        int16_t r = 120;

        int16_t x, y;
        int16_t x1, y1;
        int16_t x2, y2;
        float xs;

        switch (pMsg->MsgId)
        {
        case WM_INIT_DIALOG:
                hItem = WM_GetDialogItem(pMsg->hWin, ID_BTN_CLOSE);
                WM_SetHasTrans(hItem);
                WM_SetCallback(hItem, _cbCloseButton);

                hTimer = WM_CreateTimer(pMsg->hWin, 0, 20, 0);

                //                        GUI_MEMDEV_Select(0);
                //                        hMem = GUI_MEMDEV_Create(0,0,280,210);
                //                        GUI_MEMDEV_Select(hMem);
                //                        GUI_SetBkColor(GUI_BLACK);
                //                        GUI_ClearRect(0,0,GUI_MEMDEV_GetXSize(hMem) - 1,GUI_MEMDEV_GetYSize(hMem) - 1);
                //                        GUI_EnableAlpha(1);
                //                        GUI_AA_SetFactor(6);
                //                        GUI_SetPenSize(1);
                //                        for(uint8_t i = 0;i < 20;i ++)
                //                        {
                //                                GUI_SetAlpha(i * 12.5);
                //                                GUI_SetColor(GUI_GREEN);
                //                                GUI_AA_DrawArc(140,150,r - i - 1,r - i - 1,50,210);
                //                                GUI_SetColor(GUI_ORANGE);
                //                                GUI_AA_DrawArc(140,150,r - i - 1,r - i - 1,10,50);
                //                                GUI_SetColor(GUI_RED);
                //                                GUI_AA_DrawArc(140,150,r - i - 1,r - i - 1,-30,10);
                //                        }
                //                        GUI_SetAlpha(0);
                break;
        case WM_PAINT:
                GUI_SetBkColor(GUI_BLACK);
                GUI_ClearRect(0, 0, 479, 271);
                GUI_SetColor(GUI_BLUE);
                GUI_SetPenSize(1);
                GUI_DrawRect(0, 0, 479, 271);
                GUI_FillRect(0, 0, 479, 19);
                GUI_SetColor(GUI_WHITE);
                GUI_SetFont(GUI_FONT_16B_ASCII);
                GUI_SetTextMode(GUI_TM_TRANS);
                GUI_DispStringAt("yibiaopan", 2, 2);

                GUI_EnableAlpha(1);
                GUI_AA_SetFactor(6);
                GUI_SetPenSize(4);
                for (uint8_t i = 0; i < 20; i++)
                {
                        GUI_SetAlpha(i * 12.5);
                        GUI_SetColor(GUI_GREEN);
                        GUI_AA_DrawArc(240, 195, r - i - 1, r - i - 1, 50, 210);
                        GUI_SetColor(GUI_ORANGE);
                        GUI_AA_DrawArc(240, 195, r - i - 1, r - i - 1, 10, 50);
                        GUI_SetColor(GUI_RED);
                        GUI_AA_DrawArc(240, 195, r - i - 1, r - i - 1, -30, 10);
                }
                GUI_SetAlpha(0);
                //GUI_SetPenSize(20);
                //GUI_SetColor(GUI_GREEN);
                //GUI_AA_DrawArc(240,195,r - 10,r - 10,50,210);
                //GUI_SetColor(GUI_ORANGE);
                //GUI_AA_DrawArc(240,195,r - 10,r - 10,10,50);
                //GUI_SetColor(GUI_RED);
                //GUI_AA_DrawArc(240,195,r - 10,r - 10,-30,10);

//                        GUI_MEMDEV_WriteAt(hMem, 140, 45);

                GUI_AA_SetFactor(6);
                GUI_SetColor(GUI_WHITE);
                GUI_SetPenSize(2);
                GUI_AA_DrawArc(240, 195, r + 2, r + 2, -30, 210);

                GUI_SetFont(GUI_FONT_16B_ASCII);
                for (uint8_t i = 0; i <= 12; i++)
                {
                        xs = cos((float)(i * 20 - 30) / 180 * 3.1415926);
                        x = xs * (r + 2) + 240.5;
                        x1 = xs * (r - (i % 2 ? 10 : 19)) + 240.5;
                        x2 = xs * (r - 28) + 240.5;
                        xs = sin((float)(i * 20 - 30) / 180 * 3.1415926);
                        y = 195.5 - xs * (r + 2);
                        y1 = 195.5 - xs * (r - (i % 2 ? 10 : 19));
                        y2 = 195.5 - xs * (r - 28);
                        GUI_AA_DrawLine(x, y, x1, y1);
                        if (i % 2 == 0)
                        {
                                sprintf(buf, "%d", (6 - i / 2));
                                GUI_DispStringAt(buf, x2 - 4, y2 - 8);
                        }
                        if (i == 12)
                        {
                                GUI_DispStringAt("rpm", x2 + 10, y2 - 8);
                                GUI_DispStringAt("x1000", x2 + 10, y2 + 10);
                        }
                }

                GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_BOTTOM);
                GUI_SetFont(GUI_FONT_D48);
                GUI_DispStringAt("240", 240, 180);

                hMem = GUI_MEMDEV_Create(0, 0, 120, 50);
                GUI_MEMDEV_Select(hMem);
                GUI_MEMDEV_Clear(hMem);
                GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_BOTTOM);
                GUI_SetFont(GUI_FONT_D48);
                GUI_SetColor(GUI_WHITE);
                GUI_SetTextMode(GUI_TM_TRANS);
                GUI_DispStringAt("240", 60, 49);
                GUI_SetColor(GUI_BLACK);
                for (uint8_t i = 0; i < 50; i++)
                {
                        GUI_SetAlpha(i * 5);
                        GUI_DrawLine(0, i, 119, i);
                }
                GUI_SetAlpha(0);
                //GUI_MEMDEV_Select(GUI_MEMDEV_GetWindowDevice(pMsg->hWin));
                GUI_MEMDEV_Select(0);
                //                        GUI_SelectLCD();
                GUI_MEMDEV_WriteExAt(hMem, 180, 182, 1000, -500, 200);
                //GUI_MEMDEV_CopyToLCDAt(hMem,180,180);
                GUI_MEMDEV_Delete(hMem);
                break;
        case WM_NOTIFY_PARENT:
                Id = WM_GetId(pMsg->hWinSrc);
                NCode = pMsg->Data.v;
                switch (Id)
                {
                case ID_BTN_CLOSE:
                        switch (NCode)
                        {
                        case WM_NOTIFICATION_CLICKED:
                                break;
                        case WM_NOTIFICATION_RELEASED:
                                WM_DeleteTimer(hTimer);
                                WM_DeleteWindow(pMsg->hWin);
                                break;
                        }
                        break;
                }
                break;
        case WM_TIMER:

                WM_RestartTimer(pMsg->Data.v, 20);
                break;
        default:
                WM_DefaultProc(pMsg);
                break;
        }
}

WM_HWIN CreateYibiaopanWindow(void);
WM_HWIN CreateYibiaopanWindow(void) {
        WM_HWIN hWin;

        hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
        return hWin;
}

void MainTask(void) {
        GUI_Init();
        //WM_SetCreateFlags(WM_CF_MEMDEV);
        CreateYibiaopanWindow();
        while (1) {
                //
                // If an animation has been created, process it
                //

                GUI_Delay(50);
        }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-4 20:15:36 | 显示全部楼层
qq690846034 发表于 2020-2-4 15:50
#include "DIALOG.h"
#include "stdint.h"
#include "stdio.h"

效果是这样的吗
QQ截图20200204201556.png
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2020-2-4 23:50:11 | 显示全部楼层
是的,然后再把WM_SetCreateFlags(WM_CF_MEMDEV);打开试试
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-2-5 02:46:51 | 显示全部楼层
qq690846034 发表于 2020-2-4 23:50
是的,然后再把WM_SetCreateFlags(WM_CF_MEMDEV);打开试试

QQ截图20200205024637.png
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2020-2-5 12:36:47 | 显示全部楼层

谢谢硬汉哥,可以了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 14:38 , Processed in 0.284218 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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