 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 19 Sep, 2008 10:24 am Asunto: ¿Como Centrar un Form MidiChild? |
|
|
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? _________________
 |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Sab 20 Sep, 2008 8:47 pm Asunto: |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Dom 21 Sep, 2008 5:46 pm Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|