c++ - que - cual es el boton restaurar
Cómo obtener el tamaño y la posición de los botones de los títulos de las ventanas(minimizar, restaurar, cerrar) (4)
¿Hay una llamada API para determinar el tamaño y la posición de los botones de título de ventana? Intento dibujar botones de leyenda tipo 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?
GetSystemMetrics ofrece todas estas informaciones. Para dibujar dentro de la decoración de la ventana, use GetWindowDC .
La función GetSystemMetrics debería ayudarlo con un tamaño (parámetros SM_CYSIZE y SM_CXSIZE).
EDITAR
No estoy seguro de que pueda encontrar posiciones con esta función, pero puede echar un vistazo al código fuente de emule , han logrado agregar un botón a un título de ventana.
El siguiente código está adaptado del ejemplo "Global Titlebar Hook" que encontré en http://www.catch22.net/content/snippets . Modifiqué el ejemplo para hacerlo 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();
}
}
Encontré la función requerida para obtener la posición de los botones en vista:
http://msdn.microsoft.com/en-us/library/aa969436.aspx (WM_GETTITLEBARINFOEX)
Este enlace también muestra las métricas del sistema requeridas para obtener todo el espaciado correcto (aunque no es una imagen de diálogo completa, es una pena). Esto funciona perfectamente en Vista, y principalmente en XP (en XP hay un espacio demasiado grande entre los botones).
http://shellrevealed.com/photos/blog_images/images/4538/original.aspx
Si ese enlace está roto, puedes probar el archivo de Internet (¡Gracias a Dan Groom !):
http://web.archive.org/web/20070301202835/http://shellrevealed.com/photos/blog_images/images/4538/original.aspx