| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Sab 22 Dic, 2018 9:47 am Asunto: Minimizar Ventanas |
|
|
Buenas..
Es posible minimizar dos ventanas Padre e Hija a la vez y poder recuperar las dos al maximizar, me daria igual si la ventana Hija es modal o no (si es Modal muchisimo mejor).
Gracias |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Dom 23 Dic, 2018 10:50 am Asunto: |
|
|
Buenas..
Supongo que muchos habreis pensado al leer mi Consulta "este tio es tonto al minimizar una ventana padre o hija , las dos se minimizan y al volver a activarlas (barra de tareas ) las dos se maximizan" efectivamente, el problema era que solo veia maximizada la padre ya que la hija estaba debajo de esta y no la podia ver
Aun asi me surge otra cuestion: al maximizar las ventanas como puedo poner el foco sobre la hija para que se posicione sobre la ventana Padre.
Gracias |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Lun 24 Dic, 2018 10:26 am Asunto: |
|
|
Hola Otra vez..
Sigo dandole vuelata al tema de minimizar ventanas ,he intentado minimizar una aplicacion desde una ventana hija showmodal, con
| Código: | Application->Minimize(); |
pero solo minimiza la hija.
¿Como puedo minimizar una aplicacion desde una ventatan hija showmodal haciendo click en el boton minimizar de la misma, y desde que evento de esta tengo que actuar?
Gracias. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 24 Dic, 2018 5:16 pm Asunto: |
|
|
Prueba de esta forma que te explico. Reescribe la función virtual WndProc del formulario que re verá como ShowModal.
En esta función vamos a interceptar los mensajes WM_SYSCOMMAND de forma que controlemos SW_MINIMIZE, SW_RESTORE y SC_CLOSE. Con ello obligaremos a la ventana principal de nuestra app a reaccionar momo nos interesa.
Lo siguiente es como quedaría un archivo de cabecera del formulario ShowModal
| Código: |
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published: // IDE-managed Components
private:
void __fastcall WndProc(TMessage& msg);
public: // User declarations
__fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif
|
Ahora te muestro la función WndProc
| Código: | void __fastcall TForm2::WndProc(TMessage& msg)
{
if(msg.Msg == WM_SYSCOMMAND){
if(msg.WParam == SC_MINIMIZE)
ShowWindow(Application->MainForm->Handle, SW_MINIMIZE);
if(msg.WParam == SC_RESTORE || msg.WParam == SC_CLOSE){
ShowWindow(Application->MainForm->Handle, SW_RESTORE);
SetWindowPos(Handle, Application->MainForm->Handle, 0,0,0,0, SWP_NOSIZE | SWP_NOREPOSITION);
}
}
TForm::WndProc(msg);
}
|
Espero que te ayude.
Saludos. |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Mar 25 Dic, 2018 11:20 am Asunto: |
|
|
Muchisimas gracias por Contestar..
Lo he probado y no funciona realmente como yo quiero, pero el problema no esta en tu codigo si no en mi planteamiento del problema.
Para ser exactos el flujo de ventanas en mi aplicacion funciona de la siguiente manera:
Form Principal ForMenu, desde este se llama a un FomHijo1(SHOWMODAL): se muestra form hijo1 sobre ForMenu (este se queda oculto).
Desde FormHijo1 se llama a FormHijo2(showmodal), el FormHijo2 se muestra sobre una Parte de FormHijo1 con los botones minimizar,maximizar.En este form se realizaran una serie de calculos que pueden llevar mucho tiempo.
Mi objetivo es que si el usuario lo desea minetras FormHijo2 realiza los calculos pueda minimizarlo y con el tambien minimizar tanto FormHijo1 como ForMenu.
Gracias por tu tiempo. Felices Fiestas a todos. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 26 Dic, 2018 1:34 pm Asunto: |
|
|
En ese caso lo hacemos en cadena. Ten en cuenta que para crear y visualizar los Forms modeles deberás hacerlo de la siguiente forma para que el código funcione:
| Código: |
TForm2 *Form = new TForm2(this);
Form->ShowModal();
delete Form;
|
Esto es así porque el siguiente código usa el Owner para localizar el Form previo. Otra forma un poco más compleja sería enumerar todas las ventanas pero lo que te expongo se entiende mejor y es mucho más simple:
| Código: |
void __fastcall TForm3::WndProc(TMessage& msg)
{
HANDLE MainHandle = Application->MainForm->Handle;
TForm* AOwner = (TForm*)Owner;
if(msg.Msg == WM_SYSCOMMAND){
if(msg.WParam == SC_MINIMIZE){
ShowWindow(MainHandle, SW_MINIMIZE);
do{
ShowWindow(AOwner->Handle, SW_MINIMIZE);
AOwner = (TForm*)AOwner->Owner;
}while(AOwner->Handle != MainHandle);
}
if(msg.WParam == SC_RESTORE || msg.WParam == SC_CLOSE){
ShowWindow(MainHandle, SW_RESTORE);
do{
ShowWindow(AOwner->Handle, SW_RESTORE);
AOwner = (TForm*)AOwner->Owner;
}while(AOwner->Handle != MainHandle);
}
}
TForm::WndProc(msg);
}
|
Saludos. |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Mie 26 Dic, 2018 6:12 pm Asunto: |
|
|
Gracias por contestar...
Funciona perfectamente,al minimizar la ventana3, minimiza la tres ventanas y al maximizar maximiza todas las ventanas, la unica pega que le pongo es que al minimizar la ventana3 muestra las tres ventanas minimizadas (aunque la unica maximizable es la tercera)..
Es posible que solo se muestra una minimacion y sea en la barra de tareas, como hace al minimizar el form Padre.
Gracias otra vez. Feliz Año a Todos. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 26 Dic, 2018 8:55 pm Asunto: |
|
|
Las ventanas modales son un poco especiales y se niegan a desaparecer o a ceder el control. Para el caso que tu comentas vamos a hacer una trampa a windows que va a consistir en hacer transparente Form3 mientras esté minimizada, de esa forma no se ve en el escritorio y quedará representada unicamente en la barra de tareas. A las demás ventanas simplemente las haremos invisibles.
| Código: |
void __fastcall TForm3::WndProc(TMessage& msg)
{
HANDLE MainHandle = Application->MainForm->Handle;
TForm* AOwner = (TForm*)Owner;
if(msg.Msg == WM_SYSCOMMAND){
if(msg.WParam == SC_MINIMIZE){
ShowWindow(MainHandle, SW_HIDE);
do{
ShowWindow(AOwner->Handle, SW_HIDE);
AOwner = (TForm*)AOwner->Owner;
}while(AOwner->Handle != MainHandle);
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, NULL, 0, LWA_ALPHA);
}
if(msg.WParam == SC_RESTORE || msg.WParam == SC_CLOSE){
ShowWindow(MainHandle, SW_RESTORE);
do{
ShowWindow(AOwner->Handle, SW_RESTORE);
AOwner = (TForm*)AOwner->Owner;
}while(AOwner->Handle != MainHandle);
SetLayeredWindowAttributes(Handle, NULL, 255, LWA_ALPHA);
}
}
TForm::WndProc(msg);
}
|
Saludos. |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Vie 28 Dic, 2018 12:29 pm Asunto: |
|
|
Buenas..
Sencillamente Perfecto, era exactamente lo que buscaba... un crack..
Gracias. |
|
| Volver arriba |
|
 |
|