硬汉嵌入式论坛

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

[emWin] GUI_GetClientRect得到的结果不对?

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2017-10-26 16:58:23 | 显示全部楼层 |阅读模式
把STemwin5.32移植到了自己的429试验板上,今天写程序的时候,用函数GUI_GetClientRect(&rect),发现得到的rect的数值跟实际的不对。我实际用的屏幕是800x480的,得到的rect.x0=0,    rect.y0=0,    rect.x1=16382,    rect.y1=16382.这是啥情况造成的呢?哪里配置的问题吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2017-10-27 02:10:21 | 显示全部楼层
底层接口中:
LCD_SetSizeEx (0, g_LcdWidth, g_LcdHeight);
LCD_SetVSizeEx(0, g_LcdWidth, g_LcdHeight * NUM_VSCREENS);

这两个函数的配置是否与实际大小匹配。
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2017-10-27 14:03:18 | 显示全部楼层
我是按照你的教材一步一步移植的,你说的两个函数,我通过硬件仿真,观察给的参数没有问题。不知道问题出在哪里?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2017-10-28 01:28:06 | 显示全部楼层

回 likezk 的帖子

likezk:我是按照你的教材一步一步移植的,你说的两个函数,我通过硬件仿真,观察给的参数没有问题。不知道问题出在哪里? (2017-10-27 14:03) 
可以新建一个窗口,在窗口的WM_PAINT消息里面测试这个函数看看。按说范围已经设置了的话,是不会再有问题的。
回复

使用道具 举报

84

主题

407

回帖

679

积分

金牌会员

积分
679
QQ
发表于 2019-6-16 23:17:18 | 显示全部楼层
在综合例子里面建了一个窗口,我也出现了同样问题。
回复

使用道具 举报

84

主题

407

回帖

679

积分

金牌会员

积分
679
QQ
发表于 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


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 19:44 , Processed in 0.243954 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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