|

楼主 |
发表于 2020-4-16 20:03:55
|
显示全部楼层
上次的问题解决了,,但是发现将图片绘制到内存设备, 绘图到显示器的事件,比直接使用DTA文件还长一点。所以最终还是使用DTA文件绘制。原因是绘制到内存设备是32位的,比DTA文件的16位当然是慢了很多。
今天打算制作一个时钟。。
:在WM_HBKWIN的上半部 绘制时间等,,,因为考虑到数字的形状比较特殊,因此使用贴图的方式。也就是时间是一个一个的数字图片贴上去的。
使用GUI_CreateDialogBox 创建,
发现两个问题,
1. 窗体不能透明。。 尽管已经使用 WM_SetTransState(pMsg->hWin,WM_CF_HASTRANS);。
什么都不做就是白色的。
case WM_PAINT:
GUI_SetBkColor(GUI_TRANSPARENT);
GUI_SetColor(GUI_TRANSPARENT);
GUI_Clear();
加上面的函数-背景就变成黑色的。就是不能够透明。
但是使用 WM_CreateWindow(500,500,200,200,WM_CF_MOTION_X|WM_CF_SHOW|WM_CF_HASTRANS,_cbMtime,0);
这个窗口却是透明的。
2. 上面数字的WM_NOTIFY_PARENT事件没办法传达。。尽管 TOUCH和PID事件已经输出。
我怀疑是窗体对象搞错了。。可参考了很多代码,,没找到破绽。
相关函数
static const GUI_WIDGET_CREATE_INFO _aDialogCreateTime[] = {
{ WINDOW_CreateIndirect,"Tim",ID_WINDOW_Timer, 0, 0, 720, 256, WM_CF_HASTRANS|WM_CF_SHOW, 0x0, 0 },
{ IMAGE_CreateIndirect, "hH",ID_IMAGE_HH,Dt_TxS,Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
{ IMAGE_CreateIndirect, "hL",ID_IMAGE_HL,(Dt_TxS+1*Dt_TSizeX),Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
{ IMAGE_CreateIndirect, ":", ID_IMAGE_mao,(Dt_TxS+2*Dt_TSizeX),Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
{ IMAGE_CreateIndirect, "mH", ID_IMAGE_MH,(Dt_TxS+3*Dt_TSizeX),Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
{ IMAGE_CreateIndirect, "mL", ID_IMAGE_ML,(Dt_TxS+4*Dt_TSizeX),Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
{ IMAGE_CreateIndirect, "Y1", ID_IMAGE_Year1, Dt_DxS,Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "Y2", ID_IMAGE_Year2, (Dt_DxS+1*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "Y3", ID_IMAGE_Year3, (Dt_DxS+2*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "Y4", ID_IMAGE_Year4, (Dt_DxS+3*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "-", ID_IMAGE_YearP, (Dt_DxS+4*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "M1", ID_IMAGE_Mouth1,(Dt_DxS+5*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "M2", ID_IMAGE_Mouth2,(Dt_DxS+6*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "-", ID_IMAGE_MouthP,(Dt_DxS+7*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "D1", ID_IMAGE_Date1, (Dt_DxS+8*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "D2", ID_IMAGE_Date2, (Dt_DxS+9*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
{ IMAGE_CreateIndirect, "WK", ID_IMAGE_Week, (Dt_DxS+11*Dt_DSizeX),Dt_Dy-6,140,33, IMAGE_CF_AUTOSIZE, 0, 0 },
}
/* 创建一个对话框,用于显示时间 */
hWinTime=GUI_CreateDialogBox(_aDialogCreateTime, GUI_COUNTOF(_aDialogCreateTime), &_cbShowTime, WM_HBKWIN, 0,0);
//-----回调
static void _cbShowTime(WM_MESSAGE * pMsg)
{WM_HWIN hWinT;
int NCode;
int Id;
switch (pMsg->MsgId)
{case WM_INIT_DIALOG://init
PrintTime_Work(pMsg);
IMAGE_SetDTA(WM_GetDialogItem(pMsg->hWin,ID_IMAGE_mao),UI_Nor_Addr[UI_DigtalNum_Bigm],UI_Nor_Size[UI_DigtalNum_Bigm]);
IMAGE_SetDTA(WM_GetDialogItem(pMsg->hWin,ID_IMAGE_Year1),UI_Nor_Addr[UI_DigtalNum_Lit0+2],UI_Nor_Size[UI_DigtalNum_Lit0+2]);
IMAGE_SetDTA(WM_GetDialogItem(pMsg->hWin,ID_IMAGE_YearP),UI_Nor_Addr[UI_DigtalNum_LitP],UI_Nor_Size[UI_DigtalNum_LitP]);
IMAGE_SetDTA(WM_GetDialogItem(pMsg->hWin,ID_IMAGE_MouthP),UI_Nor_Addr[UI_DigtalNum_LitP],UI_Nor_Size[UI_DigtalNum_LitP]);
break;
case WM_TIMER:
//GUI_SetBkColor(GUI_TRANSPARENT);
PrintTime_Work(pMsg);
WM_RestartTimer(pMsg->Data.v, 1000);
break;
case WM_PAINT:
//WM_SetTransState(pMsg->hWin,WM_CF_HASTRANS);
//GUI_SetBkColor(GUI_TRANSPARENT);
//GUI_SetColor(GUI_TRANSPARENT);
//GUI_Clear();
break;
case WM_NOTIFY_PARENT://触摸上面的IMAGE 图片,不能产生事件,,从GUI的说明上是能产生3个事件的。
Id = WM_GetId(pMsg->hWinSrc);//GUI_SetAlpha(0);
NCode = pMsg->Data.v;
switch(Id)
{case ID_IMAGE_HH:
case ID_IMAGE_HL:
case ID_IMAGE_mao:
case ID_IMAGE_ML:
case ID_IMAGE_MH:
break;
default:break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
|
|