[C con Clase] Centrar ventana

Steven Davidson srd4121 en njit.edu
Mie Ago 13 10:01:18 CEST 2008


Hola Roberto Daniel,

Roberto Daniel Virgili wrote:
> Hola a todos
> Alguien me podria enseñar la sintaxis para centrar una ventana...?
> 
>     hwnd = CreateWindowEx (
>            0,
>            szClassName,
>            " Mi Ventana",
>            WS_OVERLAPPEDWINDOW,
>            100,150,544,375,
>            HWND_DESKTOP,
>            NULL,
>            hThisInstance,
>            NULL
>            );
> 
> Es probable que mas adelante en el curso esté, pero quiero ir
> practicando un poco con código para tomar mas animo.-
> 

Supongo que quieres centrar la ventana con respecto a las dimensiones de 
la pantalla (o las del escritorio). Tienes algunas soluciones para 
llevar a cabo esto:

1. Consulta las dimensiones del dispositivo gráfico (DC). Para esto, 
necesitarás obtener un DC e invocar 'GetDeviceCaps()'. Por ejemplo,

int nAnchuraVentana;
int nAlturaVentana;

HDC hdc = GetDC( hwnd );

int nAnchuraPantalla = GetDeviceCaps( hdc, HORZRES );
int nAlturaPantalla  = GetDeviceCaps( hdc, VERTRES );

ReleaseDC( hwnd, hdc );

MoveWindow( hwnd,
             nAnchuraPantalla/2 - nAnchuraVentana/2,
             nAlturaPantalla/2 - nAlturaVentana/2,
             nAnchuraVentana, nAlturaVentana,
             TRUE );


2. Consigue las dimensiones de la ventana del escritorio. Por ejemplo,

int nAnchuraVentana;
int nAlturaVentana;
RECT rect;

GetWindowRect( GetDesktopWindow(), &rect );

MoveWindow( hwnd,
             rect.right/2 - nAnchuraVentana/2,
             rect.bottom/2 - nAlturaVentana/2,
             nAnchuraVentana, nAlturaVentana,
             TRUE );

En el primer caso, necesitas que tu ventana principal ya esté creada 
para poder conseguir un DC a partir de ella y así consultar la 
información que nos interesa. Como alternativa, puedes combinar la 
solución #1 con la #2: consigue el DC del escritorio. Otra alternativa 
es "crear" el DC de la pantalla. Esto sería,

HDC hdc = CreateDC( "DISPLAY", NULL, NULL, NULL );

int nAnchuraPantalla = GetDeviceCaps( hdc, HORZRES );
int nAlturaPantalla  = GetDeviceCaps( hdc, VERTRES );

DeleteDC( hdc );
...

En el segundo caso, podemos obviar la función 'MoveWindow()' y 
simplemente usar estos cálculos directamente en la función 
'CreateWindowEx()'. Por ejemplo,

hwnd = CreateWindowEx( ...,
                        rect.right/2 - nAnchuraVentana/2,
                        rect.bottom/2 - nAlturaVentana/2,
                        nAnchuraVentana, nAlturaVentana,
                        ... );


Espero que todo esto te ayude.

Steven





Más información sobre la lista de distribución Cconclase