Cómo obtener el tamaño y la posición de los botones de subtítulos de la ventana (minimizar, restaurar, cerrar)

StackOverflow https://stackoverflow.com/questions/479332

Pregunta

¿Hay una llamada API para determinar el tamaño y la posición de los botones de subtítulos de la ventana? Estoy tratando de dibujar botones de título de estilo vista en una ventana dibujada por el propietario. Estoy tratando con c / c ++ / mfc.

Editar: ¿Alguien tiene un ejemplo de código para dibujar el botón de cerrar?

¿Fue útil?

Solución

He encontrado la función requerida para obtener la posición de los botones en vista: WM_GETTITLEBARINFOEX

Este enlace también muestra las métricas del sistema necesarias para obtener todo el espacio correcto (lástima que no sea una imagen de diálogo completa). Esto funciona perfectamente en Vista, y principalmente en XP (en XP hay un espacio demasiado pequeño entre los botones).

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

Otros consejos

GetSystemMetrics proporciona toda esta información. Para dibujar dentro de la decoración de la ventana, use GetWindowDC .

El siguiente código está adaptado de " Global Titlebar Hook " ejemplo que encontré en http://www.catch22.net/content/snippets . Modifiqué el ejemplo para que sea compatible con MFC. Devuelve la coordenada X del botón de la barra de título más a la izquierda, pero podría modificarse fácilmente para encontrar la posición de cualquiera de los botones.

#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();
 }
}
La función

GetSystemMetrics debería ayudarlo con un tamaño (SM_CYSIZE y Parámetros SM_CXSIZE).

EDIT

No estoy seguro de que pueda encontrar posiciones con esta función, pero puede echar un vistazo a código fuente emule , han logrado agregar un botón a un título de ventana.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top