2009-01-26 17 views

Respuesta

6

que he encontrado la función requerida para obtener la posición de los botones de vista:

http://msdn.microsoft.com/en-us/library/aa969436.aspx (WM_GETTITLEBARINFOEX)

Este enlace también muestra las medidas del sistema necesarios para conseguir todo el espacio correcto (es una pena que es aunque no es una imagen completa de diálogo). 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 vínculo se rompe se puede tratar el Archivo de Internet (Gracias a Dan Groom!):
http://web.archive.org/web/20070301202835/http://shellrevealed.com/photos/blog_images/images/4538/original.aspx

+0

Lamentablemente, el enlace shellrevealed ahora está roto. Si tiene esta información en otro lugar, ¿podría agregarla directamente en la respuesta? Gracias. –

3

GetSystemMetrics da todas estas informaciones. Para dibujar dentro de la decoración de la ventana, use GetWindowDC.

+0

¿Qué ocurre con la posición? –

+0

Si está dibujando sus propios controles, ¿no debería elegir estos valores usted mismo según sus necesidades? – fbonnet

+0

Bueno, estoy dibujando mis propios fondos, etc., y en XP dibujamos nuestros propios botones min/restaurar/cerrar, sin embargo, en Vista queremos dibujar los botones de vista adecuados en el lugar correcto. –

0

GetSystemMetrics función debería ayudarlo con un tamaño (parámetros SM_CYSIZE y SM_CXSIZE).

EDITAR

No estoy seguro de que usted puede encontrar posiciones con esta función pero es posible echar un vistazo a emule source code, que han conseguido añadir un botón a un título de la ventana.

+0

¿Qué hay de la posición? –

1

El código siguiente es una adaptación de la "barra de título enlace global" ejemplo 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(); 
} 
} 
Cuestiones relacionadas