Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

¿Como Centrar un Form MidiChild?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: ¿Como Centrar un Form MidiChild? Responder citando

Bien he buscado por varios lugares (internet, este foro, etc)
pero no he encontrado algo al respecto.

Explico mi problema para saber si alguien tiene información al respecto.

Tengo un Form Principal le llamaremos fPrincipal, est form es MidiForm, por lo tanto las seguientes ventanas son MidiChild.

la cuestion es que las opciones de que vienen en Position (poScreenCenter, poDesktopCenter, poMainFormCenter, poOwnerFormCenter)

No me son váidas. pues al crear una ventana de la siguiente manera ( una segunda ventana Form2 que llamaré VentanaChild)
Código:

TForm2 *pV2 = new TForm2(this); // <-- establesco this para indicar
pV2->Show();


y mostrar la ventana esta NO aparece en el centro de la ventana padre que es TForm1, bien si aparece, pero la posicion NO es exactamente el centro, al parecer la ventana toma otras coordeanas y se "baja" un poco mas del centro.

he buscado información y he encontrado en la ayuda de Windows las siguientes sentencias del API GetAncestor y GetParent

Según estas funciones me devuelven el Handle (HWND) de la ventana padre espesificamente GetAncestor pues segun la referencia, me regresa el Handle cuando no se espesífica el Parent en la creación.

Código:
   RECT *Ventana;
   HWND hwndPadre = ::GetAncestor((HWND)pV2,GA_PARENT);
   if( hwndPadre != NULL)
   {
      GetClientRect(hwndPadre,Ventana);
      pV2->Left = (Ventana->right + pV2->Width) / 2;
      pV2->Top = (Ventana->bottom + pV2->Height) / 2;;
   }
   else
      pV2->Position = poScreenCenter;


la segunda linea del codigo anterior la he probado de la siguiente manera que considero es la mas correcta
Código:
   HWND hwndPadre = ::GetAncestor(pV2->Handle,GA_PARENT);


pero el Parent Siempre me regresa Null, pues al tener el Parent de la ventana Padre puedo hacer la operación para calcular el lugar y poscion para establcer la ventana en el centro de la ventana Padre.

si no tiene un Parent de la cual dependa esa ventana entonces si pongo la Ventana en el Centro de la Pantalla que efectivamente SI lo hace.


Gracias.

Alguna sugerencia?
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Código:

    TForm2 *pV2 = new TForm2(this);

    TRect r;
    GetWindowRect(Application->MainForm->ClientHandle, &r);
    frm->Left = (r.Width()  - frm->Width)  / 2;
    frm->Top  = (r.Height() - frm->Height) / 2;
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola _Leo gracias por responder, comentarte que he estado realizando las pruebas con el codigo que me has dado y en algunos formularios me ha dado buenos resultados en otros, me sigue saliendo igual es decir el form-midChild se "mueve" un poco mas abajo.

Para darte una idea mejor, te comento como he habierto los forms que fallan.
- MidiForm - Principal
- MidiChild - VentanasX
- Modal - Ventana-barra-Progreso.
- Modal2 - Ventana de Seleccion Usuario

Primer caso:
Abro la ventana Modal, para simular el Splash-Screen del Sistema. (posicion en el Centro de la pantalla: Ok)

Segundo caso:
Abro una ventana Modal2 para seleccion de Usuario (centro pantalla y Ok)

ahora el caso raro:
Se abre la ventana principal, Abro una VentanaX, llamo a la funcion en el
Constructor de la Clase:
Código:
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFModulo_Productos *FModulo_Productos;
//---------------------------------------------------------------------------
__fastcall TFModulo_Productos::TFModulo_Productos(TComponent* Owner)
   : TForm(Owner)
{
   ::Inicio_Formulario(this,0,0);
}


y la ventana se presenta "un poco ma abajo", estoy pensando si es la forma en que tengo mi barra de estado de Windows, pues la tengo en la posición arriba, pongo una imagen para que sea mas explicito.



Esta es la funcion para "centrar" el formulario.

Código:
void __fastcall Inicio_Formulario(TForm *F, int ccWidth, int ccHeight)
{
   // Establecemos primero las opciones de ubicacion
   if( F->FormStyle == fsMDIChild )
   {
      TRect AreaCliente;
      GetClientRect(Application->MainForm->ClientHandle, &AreaCliente);
      F->Left = (AreaCliente.Width()  - F->Width)  / 2;
      F->Top  = (AreaCliente.Height() - F->Height) / 2;
   }
   else
      F->Position = poMainFormCenter;
   //------------------------------------------------------------------------
   if( ccsgFuentesInstaladas == true )
   {
      ::UsarFuente(F); // verificamos las fuentes instaladas
   }
   ::CopyMasterFieldToDetail = true;
   F->Constraints->MinHeight = (ccHeight > 0) ? ccHeight : F->Height;
   F->Constraints->MinWidth  = (ccWidth >  0) ? ccWidth  : F->Width;

   F->Width  = F->Constraints->MinWidth ;
   F->Height = F->Constraints->MinHeight;

   ::VerificarOpcionesPermitidas(F);

   F->ScreenSnap = true;
   F->DoubleBuffered = true;
   int pos;
   TControl *pControl;
   for( int control=0; control < F->ComponentCount; control++)
   {
      Application->ProcessMessages();
      if(F->Components[control]->InheritsFrom(__classid(TControl)) == true)
      {
         pControl = reinterpret_cast <TControl *>( F->Components[control]);
         if(pControl->Hint.Trim().IsEmpty() == false )
         {
            pControl->ShowHint = true;
         }
         Application->ProcessMessages();
      }
   }
   F->Color = clWhite;
}


PD: vaya al estar editando la imagen ( ), me he dado cuenta que lo que interefiere en el proceso de centrado son los 2 componentes (ToolBar y Label) que tengo "DENTRO" del area cliente de la ventana prinicipal. el circulo mayor era segun yo, la parte para centrar, pero la etiqueta de texto tiene la propiedad Align al igual que el tool con "alTop", y claro eso hace que la ventana tome las coordeanas que quedan libres.

Gracias. tratare de hacer un calculo para eliminar las coordenadas que se "comen" estos dos componentes, me di cuenta al copiar la figura ovalada de la parte de abajo y subirla para determinar cuanto me faltaba para hacer el centrado y eso me permite ver que es la misma distancia, por lo tanto los formularios estan centrados correctamente con la informacion del formulario principal, no siendo asi por la estética visual.

Gracias de Nuevo.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.