Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   AnimateWindow() y Position=poDesktopCenter (https://www.clubdelphi.com/foros/showthread.php?t=73674)

aams01 09-05-2011 06:51:22

AnimateWindow() y Position=poDesktopCenter
 
Hola cada dia un nuevo problema perdón si parece que soy dependienta, pero por mas que le busco no encuentro.
Mi problema en cuestión es el siguiente.
Necesito la Forma en el puro centro de la pantalla por lo cual hago lo sig.
en forma de diseño pongo la opción de la forma en position=poDesktopCenter
Cuando se muestra la forma tengo los efectos de AnimateWindow() el siguiente codigo
Código:

        Randomize();
        int is= Random(4);
        if(is==0)
                AnimateWindow( Handle, 400, AW_ACTIVATE || AW_SLIDE || AW_VER_POSITIVE );
        if(is==1)
                AnimateWindow( Handle, 400, AW_ACTIVATE || AW_SLIDE || AW_VER_NEGATIVE );
        if(is==2)
                AnimateWindow( Handle, 400, AW_CENTER);
        if(is==3)
                AnimateWindow( Handle, 400, AW_BLEND);

El error gráfico que provoca es el siguiente
aparece la forma en un lugar diferente al de poDesktopCenter (aparece en el lugar de diseño) después hace el efecto que corresponde y por ultimo centra la ventana
Quisiera centrar primero y despues efecto se podra?

escafandra 09-05-2011 08:07:06

El problema es que Builder coloca como posición inicial la de diseño. Cuando seleccionas poScreenCenter Builder cambia a esa posición y luego muestra el Form. A nuestros ojos la ventana se creó en el centro aunque en realidad no fue así.

Para solventar el problema deberás colocar el Form donde te interesa (aunque no sea visible de momento) y luego aplicar AnimateWindow.

Te muestro un ejemplo simple:
Código:

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  // Centro la ventana...
  if(Position == poScreenCenter){
    Left = (Screen->Width - Width)/2;
    Top  = (Screen->Height - Height)/2;
  }
  AnimateWindow(Handle, 400, AW_ACTIVATE | AW_SLIDE | AW_HOR_POSITIVE);
}

Por cierto, no se si fue un error tipográfico o no, de todas formas aclaro que el operador or binario es una sola barra |. El or lógico son dos ||

Saludos.

aams01 09-05-2011 17:24:25

Con respecto al problema sigue haciendo lo mismo aun después de poner tu código alguna sugerencia?
Muy cierto eso de || fue error de escritura.

Otra pregunta yo había visto Left = (Screen->Width - Width)/2; sin necesidad de decir que es Form1->Left
A como se le llama este uso y como funciona?

aams01 09-05-2011 17:53:54

Gracias por Todo

Soy un mentiroso de lo peor ya funciona con una modificacion
Código:

Left = (Screen->Width - Width)/2;
    Top  = (Screen->Height - Height)/2;
        AnimateWindow( Handle, 400, AW_BLEND);

con solo retirar el if, y en modo diseño poner la position = poDesigned

escafandra 09-05-2011 18:08:18

Cita:

Empezado por aams01 (Mensaje 399434)
Con respecto al problema sigue haciendo lo mismo aun después de poner tu código alguna sugerencia?...mmm, pues es curioso porque lo he probado en dos PCs con Builder 5 y en uno funciona como se esperaba y en el otro no.

Usemos pues la API:

Código:

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  // Centro la ventana...
  SetWindowPos(Handle, HWND_TOP, (Screen->Width - Width)/2, (Screen->Height - Height)/2, 0, 0, SWP_NOSIZE);
  AnimateWindow(Handle, 400, AW_ACTIVATE | AW_SLIDE | AW_HOR_POSITIVE);
}

Cita:

Empezado por aams01 (Mensaje 399434)
...Left = (Screen->Width - Width)/2; sin necesidad de decir que es Form1->Left
A como se le llama este uso y como funciona?

Eso es posible porque estamos en un método de la clase TForm1, el compilador sobreentiende que Left es Form1->Left. Desde un método ajeno a la clase no se puede hacer.

Quizás te interese esto como alternativa a AnimateWindow

Saludos.

escafandra 09-05-2011 20:30:01

Cita:

Empezado por aams01 (Mensaje 399436)
Gracias por Todo

Soy un mentiroso de lo peor ya funciona con una modificacion
Código:

Left = (Screen->Width - Width)/2;
    Top  = (Screen->Height - Height)/2;
        AnimateWindow( Handle, 400, AW_BLEND);

con solo retirar el if, y en modo diseño poner la position = poDesigned

No me di cuenta de este mensaje tuyo previo a mi respuesta...
Bueno, el condicional es para que se centre solo si Position es poScreenCenter. Si lo quieres centrar siempre, de todas todas, pues lo retiras y listo.

Mira mi mensaje anterior, la API suele ser una buena opción.

Saludos


La franja horaria es GMT +2. Ahora son las 17:55:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi