titulo restaurar que minimizar menus maximizar cual cerrar botón botones boton barra ayuda c++ winapi mfc windows-vista uxtheme

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?



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