Как получить размер и положение кнопок заголовка окна (свернуть, восстановить, закрыть)
-
20-08-2019 - |
Вопрос
Существует ли вызов API для определения размера и положения кнопок заголовка окна?Я пытаюсь нарисовать кнопки подписи в стиле Vista в окне, нарисованном владельцем.Я имею дело с c / c ++ / mfc.
Редактировать:У кого-нибудь есть пример кода для рисования кнопки закрытия?
Решение
Я нашел функцию, необходимую для определения положения кнопок в vista: WM_GETTITLEBARINFOEX
По этой ссылке также показаны системные показатели, необходимые для правильного размещения всех интервалов (жаль, что это не полное изображение диалога).Это отлично работает в Vista и в основном в XP (в XP зазор между кнопками немного великоват).
Другие советы
Получает системную метрику предоставляет всю эту информацию.Чтобы нарисовать внутри оформления окна, используйте GetWindowDC Получить windowdc.
Следующий код адаптирован из примера "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();
}
}
Получает системную метрику функция должна помочь вам с размером (параметры SM_CYSIZE и SM_CXSIZE).
Редактировать
Я не уверен, что вы сможете найти позиции с помощью этой функции, но вы могли бы взглянуть на исходный код emule, им удалось добавить кнопку к заголовку окна.