Cómo obtener el tamaño y la posición de los botones de subtítulos de la ventana (minimizar, restaurar, cerrar)
-
20-08-2019 - |
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?
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).
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();
}
}
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.