PDA

Ver la Versión Completa : AnimateWindow() y Position=poDesktopCenter


aams01
09-05-2011, 06:51:22
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
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:
__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
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
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:

__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);
}

...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 (http://www.delphiaccess.com/forum/trucos-y-consejos-16/(multilenguaje)-ventana-desplegable-translucida-una-alternativa-a-animatewindow/) como alternativa a AnimateWindow

Saludos.

escafandra
09-05-2011, 20:30:01
Gracias por Todo

Soy un mentiroso de lo peor ya funciona con una modificacion
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 (http://clubdelphi.com/foros/showpost.php?p=399456&postcount=6), la API suele ser una buena opción.

Saludos