【问题标题】:How to get size and position of window caption buttons (minimise, restore, close)如何获取窗口标题按钮的大小和位置(最小化、恢复、关闭)
【发布时间】:2010-10-03 12:30:01
【问题描述】:

是否有 API 调用来确定窗口标题按钮的大小和位置?我正在尝试将 vista 样式的标题按钮绘制到所有者绘制的窗口上。我正在处理 c/c++/mfc。

编辑:有人有绘制关闭按钮的代码示例吗?

【问题讨论】:

    标签: c++ winapi mfc windows-vista uxtheme


    【解决方案1】:

    我找到了获取 vista 中按钮位置所需的函数:WM_GETTITLEBARINFOEX

    此链接还显示了正确设置所有间距所需的系统指标(可惜它不是完整的对话框图片)。这在 Vista 中非常有效,并且主要在 XP 中(在 XP 中,按钮之间的间隙有点太大了)。

    【讨论】:

      【解决方案2】:

      GetSystemMetrics 提供所有这些信息。要在窗口装饰内绘制,请使用GetWindowDC。

      【讨论】:

      • 如果是自己绘制控件,不应该根据需要自己选择这些值吗?
      • 好吧,我正在绘制自己的背景等,在 XP 上我们绘制自己的最小/恢复/关闭按钮 - 但是在 Vista 上,我们希望在正确的位置绘制正确的 vista 按钮。
      【解决方案3】:

      以下代码改编自我在http://www.catch22.net/content/snippets 找到的“全局标题栏挂钩”示例。我修改了示例以使其对 MFC 友好。它返回最左侧标题栏按钮的 X 坐标,但可以轻松修改它以查找任何按钮的位置。

      #define B_EDGE 2
      
      int CMyWindow::CalcRightEdge()
      {
       if(GetStyle() & WS_THICKFRAME)
        return GetSystemMetrics(SM_CXSIZEFRAME);
       else
        return GetSystemMetrics(SM_CXFIXEDFRAME);
      }
      
      
      int CMyWindow::findNewButtonPosition()
      {
       int   nButSize  = 0;
       DWORD dwStyle   = GetStyle();
       DWORD dwExStyle = GetExStyle();
      
       if(dwExStyle & WS_EX_TOOLWINDOW)
       {
        int nSysButSize = GetSystemMetrics(SM_CXSMSIZE) - B_EDGE;
      
        if(GetStyle() & WS_SYSMENU) 
         nButSize += nSysButSize + B_EDGE;
      
        return nButSize + CalcRightEdge();
       }
       else
       {
        int nSysButSize = GetSystemMetrics(SM_CXSIZE) - B_EDGE;
      
       // Window has Close [X] button. This button has a 2-pixel
       // border on either size
        if(dwStyle & WS_SYSMENU) 
         nButSize += nSysButSize + B_EDGE;
      
       // If either of the minimize or maximize buttons are shown,
       // Then both will appear (but may be disabled)
       // This button pair has a 2 pixel border on the left
        if(dwStyle & (WS_MINIMIZEBOX | WS_MAXIMIZEBOX) )
         nButSize += B_EDGE + nSysButSize * 2;
      
       // A window can have a question-mark button, but only
       // if it doesn't have any min/max buttons
        else if(dwExStyle & WS_EX_CONTEXTHELP)
         nButSize += B_EDGE + nSysButSize;
      
       // Now calculate the size of the border...aggghh!
        return nButSize + CalcRightEdge();
       }
      }
      

      【讨论】:

      • 我很欣赏这个答案,但看到他们没有包含绘制按钮的代码令人难以置信的失望。
      【解决方案4】:

      GetSystemMetrics 函数应该可以帮助您确定尺寸(SM_CYSIZE 和 SM_CXSIZE 参数)。

      编辑

      我不确定您是否可以使用此功能找到职位,但您可以查看emule source code,他们已经设法在窗口标题中添加了一个按钮。

      【讨论】:

        猜你喜欢
        • 2012-12-16
        • 1970-01-01
        • 2015-07-21
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多