子窗体如何得到自己在父窗体中的位置?

解决方案 »

  1.   

    如:
    CRect rect;
    m_edit.GetWindowRect(&rect);
    ScreenToClient(&rect);rect == 这就是相对父窗口你的控件位置。
      

  2.   

    GetClientRect()的得到的左上角永远是(0,0)点。如何转换为子窗体当前在父窗体的RECT?
      

  3.   

    就是,没看到ScreenToClient进行屏幕与窗口坐标转换
      

  4.   

    你自己完全可以实现以下函数:
    BOOL GetWindowRectInParentCoordinates(HWND hwnd, PRECT prc)
    {
      // 参数合法性检查
      if(!hwnd || !prc || !IsWindow(hwnd))
        return FALSE;  RECT rc;
      if(!GetWindowRect(hwnd, &rc))
        return FALSE;  //
      // 如果不是子窗口,则返回以屏幕坐标为准的窗口位置信息,否则将
      // 坐标映射为父窗口的客户区坐标返回
      //  if((GetWindowLong(hwnd, GWL_STYLE) & WS_CHILD))
      {
        if(!MapWindowPoints(HWND_DESKTOP, GetParent(hwnd), (LPPOINT)&rc, 2))
          return FALSE;
      }  *prc = rc;
      return TRUE;
    }
      

  5.   

    要是代码里有很多处用到这个功能呢?每次都减一遍岂不是太累?
    而且代码也不复杂啊,只不过你的是 MFC,我的是 SDK,所以用不了 ScreenToClient(PRECT),又不想两次调用 ScreenToClient(PPOINT),就用了个不太常用的 API 而已。
      

  6.   

    看清楚我上面所说的话里的参数类型啊,你把一个矩形传到 SDK 的 ScreenToClient() API 函数里执行试试看。还有,严格的说来,你的代码虽然没有问题,但是有点答非所问。楼主问的是:子窗体如何得到自己在父窗体中的位置?你回答的问题是:父窗口如何得到子窗口在自己客户区内的位置。
      

  7.   

    我不想再说了,稍微有意识一看就知道。GetParent()->ScreenToClient()
      

  8.   

    我也不想再说了,GetParent()->ScreenToClient() 就是你所谓的 SDK 编程啊。
      

  9.   

    晕~~我真的是不想再说了,程序员是木脑袋啊???
    如果这都无法变通,回去种田算了。ScreenToClient(GetParent(hWnd/*Child window HWND*/), &rect)
      

  10.   

    GetWindowRect(父窗口)
    GetWindowRecr(自己)
    然后一减
      

  11.   

    晕~~我真的是不想再说了,程序员光有脑袋也没有用啊,动动手好不好?
    如果对自己不知道的东西别人说了以后连实践一下都懒得弄,回去种田算了。ScreenToClient(GetParent(hWnd/*Child window HWND*/), &rect)上面这行代码你要能在 SDK 程序里调用 API 通过,我老人家从此不再写程序。
      

  12.   

    多谢两位 dandycheung(珠穆朗玛)和mynamelj(夏娃的诱惑)