请教下,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:
效果图片2:
|