如何获取窗口标题按钮的大小和位置(最小化、恢复、关闭)

发布于 2024-07-12 21:55:12 字数 117 浏览 11 评论 0原文

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

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

Is there an API call to determine the size and position of window caption buttons? I'm trying to draw vista-style caption buttons onto an owner drawn window. I'm dealing with c/c++/mfc.

Edit: Does anyone have a code example to draw the close button?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

灼痛 2024-07-19 21:55:15

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

编辑

我不确定您是否可以找到具有此功能的职位,但您可以查看emule 源代码,他们成功地在窗口标题中添加了一个按钮。

GetSystemMetrics function should help you with a size (SM_CYSIZE and SM_CXSIZE parameters).

EDIT

I'm not sure you can find positions with this function but you might take a look at emule source code, they've managed to add a button to a window caption.

怎樣才叫好 2024-07-19 21:55:14

以下代码改编自我在 http://www.catch22 找到的“全局标题栏挂钩”示例。净/内容/片段。 我修改了该示例以使其适合 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();
 }
}

The following code is adapted from the "Global Titlebar Hook" example I found at http://www.catch22.net/content/snippets. I modified the example to make it MFC-friendly. It returns the X-coordinate of the leftmost titlebar button but it could easily be modified to find the position of any of the buttons.

#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();
 }
}
柠北森屋 2024-07-19 21:55:13

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

GetSystemMetrics gives all these informations. To draw within the window decoration, use GetWindowDC.

最冷一天 2024-07-19 21:55:12

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

此链接还显示了使所有间距正确所需的系统指标(遗憾的是它不是完整的对话框图片)。 这在 Vista 中完美运行,并且大多数在 XP 中(在 XP 中按钮之间的间隙稍微太大)。

来自 http: //shellrevealed.com/photos/blog_images/images/4538/original.aspx

I've found the function required to get the position of the buttons in vista: WM_GETTITLEBARINFOEX

This link also shows the system metrics required to get all the spacing correct (shame it's not a full dialog picture though). This works perfectly in Vista, and mostly in XP (in XP there is slightly too much of a gap between the buttons).

From http://shellrevealed.com/photos/blog_images/images/4538/original.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文