Как получить размер и положение кнопок заголовка окна (свернуть, восстановить, закрыть)
Есть ли вызов API для определения размера и положения кнопок заголовка окна? Я пытаюсь нарисовать кнопки с надписями в стиле Vista на нарисованном владельцем окне. Я имею дело с c/ C++/mfc.
Редактировать: у кого-нибудь есть пример кода для рисования кнопки закрытия?
4 ответа
Я нашел функцию, необходимую для определения положения кнопок в Vista: WM_GETTITLEBARINFOEX
Эта ссылка также показывает системные метрики, необходимые для получения правильного интервала (но, к сожалению, это не полная картинка диалога). Это прекрасно работает в Vista, и в основном в XP (в XP между кнопками слишком большой зазор).
GetSystemMetrics предоставляет всю эту информацию. Чтобы нарисовать в оформлении окна, используйте GetWindowDC.
Следующий код адаптирован из примера "Global Titlebar Hook", который я нашел по адресу 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).
РЕДАКТИРОВАТЬ
Я не уверен, что вы можете найти позиции с помощью этой функции, но вы можете взглянуть на исходный код эмули, им удалось добавить кнопку в заголовок окна.