|
发表于 2019-6-18 01:06:08
|
显示全部楼层
非常感谢eric2013 老师耐心解答。
个人觉得 针对这个问题有以下几种解决办法。
1.在 WM_PAINT 中取值。
case WM_PAINT:
WM_GetWindowRect(&Rect);
printf("111%d",Rect.x0); /*重要 要将值利用一下 不然编译器会优化掉*/
printf("111%d",Rect.y0);
break;
2. 调用这个函数 WM_GetWindowRectEx(hItem,&Rect);
static void _cbDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hItem;
int NCode;
int Id;
GUI_RECT Rect;
switch (pMsg->MsgId)
{
case WM_PAINT:
break;
case WM_INIT_DIALOG:
// 初始化框架窗口
// 初始化按钮控件
// 初始化按钮控件
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(Id)
{
case ID_BUTTON_0:
switch(NCode)
{
/* 点击此按钮后,LED1点亮 */
case WM_NOTIFICATION_CLICKED:
hItem = pMsg->hWin;
WM_GetWindowRectEx(hItem,&Rect); /*执行这句话后 能返回正确坐标*/
bsp_LedOn(1);
break;
/* 松手后,LED1熄灭 */
case WM_NOTIFICATION_RELEASED:
bsp_LedOff(1);
break;
}
break;
default:
WM_DefaultProc(pMsg);
break;
}
}
3.调用 WM_SelectWindow 函数。
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch(Id)
{
case ID_BUTTON_0:
switch(NCode)
{
case WM_NOTIFICATION_CLICKED:
break;
/* 松手后,在窗口上绘制梯度图形 */
case WM_NOTIFICATION_RELEASED:
/*
设置要进行绘制操作的目标窗口
注意,创建的对话框主体函数是框架窗口,所以要调用函数 WM_GetClientWindow 获取客
户区窗口,如果主体是窗口 Window,无需调用此函数。此函数返回的是之前的目标窗口。
*/
hWinOld = WM_SelectWindow(WM_GetClientWindow(pMsg->hWin));
/* 在对话框客户区窗口绘制梯度图形 */
GUI_DrawGradientRoundedH(35, 100, 180, 130, 5, 0x0000FF, 0x00FFFF);
/* 配置回之前选择的目标窗口 */
WM_SelectWindow(hWinOld);
break;
}
break;
}
break;
推荐采用第三种方法。具体教程看 安富莱_STM32-V6开发板emWin教程(V2.0).pdf 第2023 页
第65章 STemWin 窗口中任意绘制 2D 图形
教程下载地址
http://www.armbbs.cn/forum.php?mod=viewthread&tid=19834
|
|