Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:
Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro

Tamaño diálogo (derivado de CFormView no CDialog)

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

Tamaño diálogo (derivado de CFormView no CDialog)

Notapor gonso el Mié Jun 13, 2007 3:34 am

Hola:

Tengo el siguiente problema...

Tengo una apliacación, la idea era tener un marco que contuviera varios diálogos al mismo tiempo (podríamos decir que debían ser diálogos no modales), así que recurrí a una aplicación MDI retocada en la que sólo hay un documento pero muchas vistas que además actúan de forma independiente...de tal manera que cada diálogo lo he derivado de un CFormView, cada uno con su correspondiente ChildFrame. Bien, uno de los diálogos contiene un reproductor de vídeo, la barra para controlar el vídeo (pausa, play, stop...) es un toolbar que se ajusta a la parte inferior de la ventana... los diálogos se ajustan al tamaño del marco "padre" de tal manera que si tengo varios diálogos abiertos no dejan ningún trozo de la zona cliente del contenedor sin ocupar, para ello al abrirlos se ajustan al tamaño del area cliente del marco principal.
Si yo modifico el tamaño en tiempo de ejecución de un diálogo modal, todo funciona correctamente, el diálogo se hace más grande (aunque los controles que hay en el comando sigan en su sitio) pero con los dialogos derivados de FormView, si el diálogo tiene que disminuir su tamaño original (cosa que no ocurre nunca, aunque lo he probado por si acaso) el toolbar se mete en medio de la ventana de vídeo, ajustándose como se le ha pedido a la parte baja de su ventana, el problema viene en si lo quiero hacer más grande....(esta es la situación real ya que depende de la resolución de la pantalla) porque entonces el frame que contiene el diálogo sólo crece hasta el tamaño que tiene el diálogo en el editor de recursos, pero internamente sabe que es más grande con lo que el toolbar se sitúa en su sitio real pero fuera de la vista del usuario ya que el frame que lo contiene no ha crecido hasta el tamaño del FormView.


Alguien podría orientarme sobre dónde tengo que informar al ChildFrame de que crezca hasta el nuevo tamaño del FormView en vez de ajustarse al tamaño del mismo en el editor de recursos? No he visto ninguna función en la clase CChildFrame que me de la pista, tengo claro que no debe ser en la clase CFormView ya que he intentado de todo, quizá debe ser en la parte del código que llama a la creación del marco contenedor del FormView...lo pongo aquí por si acaso:

CChildFrame* pFrame=new CChildFrame();
CCreateContext context;
context.m_pCurrentDoc=m_pDoc;//El unico documento de la aplicación
context.m_pNewViewClass=RUNTIME_CLASS(CDlgVideo);
context.m_pNewDocTemplate=m_pVistaVideoTemplate;//la plantilla de la vista del video
context.m_pLastView=(((CMainFrame*)m_pMainWnd)->GetActiveFrame()?((CMainFrame*)m_pMainWnd)->
GetActiveFrame()->GetActiveView():NULL);
context.m_pCurrentFrame=((CMainFrame*)m_pMainWnd)->GetActiveFrame();
if(!pFrame->LoadFrame(IDR_JRTYPE1,WS_OVERLAPPEDWINDOW|FWS_PREFIXTITLE,m_pMainWnd,&context))return;
pFrame->InitialUpdateFrame(m_pDoc,TRUE);



Cualquier sugerencia será bienvenida. Gracias de antemano
gonso
Usuario Activo
Usuario Activo
 
Mensajes: 23
Registrado: Dom Nov 05, 2006 4:00 am

Notapor gonso el Mié Jun 13, 2007 5:48 am

Cambio el planteamiento:

En una aplicación MDI cuando abres una ventana, aparece con una dimensión determinada y crea scrolls si la ventana que abre es más grande. ¿Cómo se cambia el tamaño por defecto con el que una aplicación MDI abre sus ventanas?
gonso
Usuario Activo
Usuario Activo
 
Mensajes: 23
Registrado: Dom Nov 05, 2006 4:00 am

Sugerencia

Notapor latindeveloper el Mié Jun 13, 2007 9:58 am

Una opcion es guardar la posicion actual de la ventana y recuperarla cada vez:

Para guardar:

Código: Seleccionar todo
void CMainFrame::OnClose()
{
      WINDOWPLACEMENT wndpl;
      if(GetWindowPlacement(&wndpl))
            AfxGetApp()->WriteProfileBinary( _T "Settings"),_T("WindowPlacement"), (BYTE*)&wndpl,sizeof(wndpl));

      CMDIFrameWnd::OnClose();
}


Para recuperar:

Código: Seleccionar todo
BOOL CMyApp::InitInstance()
{

   ....

      LPBYTE pData;
      UINT nBytes = 0;
      AfxGetApp()->GetProfileBinary(_T("Settings"), _T("WindowPlacement"), &pData,&nBytes);
      WINDOWPLACEMENT *pwp = (WINDOWPLACEMENT*)pData;
      if(pwp)
            m_pMainWnd->SetWindowPlacement(pwp);

      m_pMainWnd->UpdateWindow();
     return TRUE;
}


Antes de hacer m_pMainWnd->SetWindowPlacement(pwp); puedes revisar la estructura de WINDOWPLACEMENT para modificar sus valores (si son muy pequeños o grandes):

Código: Seleccionar todo
typedef struct _WINDOWPLACEMENT {
    UINT length;
    UINT flags;
    UINT showCmd;
    POINT ptMinPosition;
    POINT ptMaxPosition;
    RECT rcNormalPosition;
} WINDOWPLACEMENT;




Por otro lado para que las ventanas hijas (child windows) tengan el mismo tamaño de la ventana principal solo tienes que mostrarlas maximizadas .

Código: Seleccionar todo
BOOL TuChildWnd::OnInitialUpdate()
{
   ///....
 
  ShowWindow(SW_MAXIMIZE);
   return TRUE;
}


Con eso tu ventana siempre tendrá el tamaño de la ventana principal.

Saludos
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados