Как насчет позиции?

ли вызов API для определения размера и положения кнопок заголовка окна? Я пытаюсь нарисовать кнопки с надписями в стиле Vista на нарисованном владельцем окне. Я имею дело с c / c ++ / mfc.

Редактировать: у кого-нибудь есть пример кода для рисования кнопки закрытия?

Ответы на вопрос(4)

Решение Вопроса

WM_GETTITLEBARINFOEX

Эта ссылка также показывает системные метрики, необходимые для получения правильного интервала (хотя, к сожалению, это не полная диалоговая картинка). Это отлично работает в Vista, и в основном в XP (в XP между кнопками слишком большой зазор).

GetSystemMetrics Функция должна помочь вам с размером (параметры SM_CYSIZE и SM_CXSIZE).

РЕДАКТИРОВАТЬ

Я не уверен, что вы можете найти позиции с помощью этой функции, но вы могли бы взглянуть наэмулировать исходный кодим удалось добавить кнопку в заголовок окна.

 Mark Ingram26 янв. 2009 г., 11:41
Как насчет позиции?

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 дает всю эту информацию. Чтобы нарисовать в оформлении окна, используйтеGetWindowDC.

 Mark Ingram26 янв. 2009 г., 11:36
Как насчет позиции?
 fbonnet26 янв. 2009 г., 12:04
Если вы рисуете свои собственные элементы управления, разве вы не должны выбирать эти значения самостоятельно в соответствии со своими потребностями?
 Mark Ingram26 янв. 2009 г., 12:25
Ну, я рисую свои собственные фоны и т. Д., А в XP мы рисуем наши собственные кнопки min / restore / close - однако в Vista мы хотим нарисовать правильные кнопки Vista в правильном месте.

Ваш ответ на вопрос