【发布时间】:2010-10-03 12:30:01
【问题描述】:
是否有 API 调用来确定窗口标题按钮的大小和位置?我正在尝试将 vista 样式的标题按钮绘制到所有者绘制的窗口上。我正在处理 c/c++/mfc。
编辑:有人有绘制关闭按钮的代码示例吗?
【问题讨论】:
标签: c++ winapi mfc windows-vista uxtheme
是否有 API 调用来确定窗口标题按钮的大小和位置?我正在尝试将 vista 样式的标题按钮绘制到所有者绘制的窗口上。我正在处理 c/c++/mfc。
编辑:有人有绘制关闭按钮的代码示例吗?
【问题讨论】:
标签: c++ winapi mfc windows-vista uxtheme
我找到了获取 vista 中按钮位置所需的函数:WM_GETTITLEBARINFOEX
此链接还显示了正确设置所有间距所需的系统指标(可惜它不是完整的对话框图片)。这在 Vista 中非常有效,并且主要在 XP 中(在 XP 中,按钮之间的间隙有点太大了)。
【讨论】:
GetSystemMetrics 提供所有这些信息。要在窗口装饰内绘制,请使用GetWindowDC。
【讨论】:
以下代码改编自我在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();
}
}
【讨论】:
GetSystemMetrics 函数应该可以帮助您确定尺寸(SM_CYSIZE 和 SM_CXSIZE 参数)。
编辑
我不确定您是否可以使用此功能找到职位,但您可以查看emule source code,他们已经设法在窗口标题中添加了一个按钮。
【讨论】: