Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Enero 20, 2013, 06:40:57 am

Título: Manejo de Ventana MDIForm
Publicado por: YAcosta en Enero 20, 2013, 06:40:57 am
Tengo un programa que usa un MDIForm y varios Form hijos.
Al MDIForm le oculto los iconos de minimizar, maximizar y restaurar con este codigo:
Código: (VB) [Seleccionar]
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const WS_CLOSEBOX As Long = &H80000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const GWL_STYLE As Long = (-16)

y lo invoco con esto en el MDIForm:
Código: (VB) [Seleccionar]
Private Sub MDIForm_Initialize()
  '------------- quitar icono del form ---------------
  Dim lWnd As Long
 
  lWnd = GetWindowLong(Me.hWnd, GWL_STYLE)
  lWnd = lWnd And Not (WS_MINIMIZEBOX)
  lWnd = lWnd And Not (WS_MAXIMIZEBOX)
  lWnd = lWnd And Not (WS_CLOSEBOX)
  lWnd = SetWindowLong(Me.hWnd, GWL_STYLE, lWnd)
  '--------------------------------------------------
End Sub

Ahora, las ventanas hijas que abro tienen el BorderStyle en 0 por aprovechar el máximo espacio y ademas porque estéticamente no me gusta ver dos barras de ventanas, ademas que el proyecto real lo tengo totalmente copado, no me serviría activar la barra del form hijo para resolver este problema: el problema que tengo es que cada vez que abro una ventana hijo necesito cambiar el caption del MDIForm, pero si hago eso los botones del MDIform se vuelven a activar quedándome así:
ANTES
(http://i.snag.gy/oEUEj.jpg)

DESPUÉS
(http://i.snag.gy/L2spk.jpg)

Ya probé invocando de nuevo el codigo del initialize pero nada (quiza lo estoy haciendo mal), ¿se puede lograr esto? o de plano ya no debo tocar el caption del formulario MDI?

Gracias
Título: Re:Manejo de Ventana MDIForm
Publicado por: raul338 en Enero 20, 2013, 12:59:42 pm
No sé si funcione, pero de primera dejaria de usar la propiedad caption y usaria el API SetWindowText (http://allapi.mentalis.org/apilist/SetWindowText.shtml) (fijate el primer ejemplo)

Decis que no funciona llamar a SetWindowLong despues de cambiar el caption? ... Y si pones un DoEvents en el medio? como para que refresque :P
Título: Re:Manejo de Ventana MDIForm
Publicado por: Albertomi en Enero 20, 2013, 03:55:05 pm
Estimado YACosta
 
Usa el siguiente código
 
Option Explicit
Private Const WS_CLOSEBOX As Long = &H80000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const GWL_STYLE As Long = (-16)

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

 
Private Sub Command1_Click()
  MDIForm1.Caption = "Ventana Form1"
  Form1.Show
  YAcostaStyleForm MDIForm1.hWnd
End Sub

 
Private Sub MDIForm_Initialize()
  YAcostaStyleForm Me.hWnd
End Sub

 
Private Sub YAcostaStyleForm(ByVal hWnd As Long)
  Dim lWnd As Long
 
  lWnd = GetWindowLong(hWnd, GWL_STYLE)
  lWnd = lWnd And Not (WS_MINIMIZEBOX)
  lWnd = lWnd And Not (WS_MAXIMIZEBOX)
  lWnd = lWnd And Not (WS_CLOSEBOX)
  lWnd = SetWindowLong(hWnd, GWL_STYLE, lWnd)
End Sub

 
 
Saludos, desde algún lugar de Lima-Perú
 
Título: Re:Manejo de Ventana MDIForm
Publicado por: Albertomi en Enero 20, 2013, 04:03:32 pm
Estimado YAcosta
 
 
Espero esto sea lo que necesitas
 
(http://www.technetperu.org/webdrive/EA64835D2E2E41F9AF85EBE06318BC87/YAcostaStyleForm.JPG)
 
Código fuente del proyecto de ejemplo:
 http://www.technetperu.org/webdrive/EA64835D2E2E41F9AF85EBE06318BC87/YAcostaStyleForm.rar (http://www.technetperu.org/webdrive/EA64835D2E2E41F9AF85EBE06318BC87/YAcostaStyleForm.rar)
 
 
Saludos desde algun lugar de Lima-Perú
Título: Re:Manejo de Ventana MDIForm
Publicado por: YAcosta en Enero 20, 2013, 06:22:30 pm
Muchas gracias Albertomi, ya vi mi error, funciono perfecto, moví el sub (lo volvi publico) a un modulo junto con las declaraciones porque sucede que cuando el Form1 llama al Form2 volvian a aparecer los botones y el alcance no daba, ya con eso funciono perfecto.

Muchas gracias mi amigo.
Título: Re:Manejo de Ventana MDIForm
Publicado por: Waldo en Enero 21, 2013, 11:52:01 am
Hola gente, es mi primer mensaje por aca.

Y no te sirve usar la propiedad ControlBox del form?
que justamente oculta los botones que mencionas.

ControlBox=False

Saludos
Título: Re:Manejo de Ventana MDIForm
Publicado por: YAcosta en Enero 21, 2013, 04:26:38 pm
Hola gente, es mi primer mensaje por aca.

Y no te sirve usar la propiedad ControlBox del form?
que justamente oculta los botones que mencionas.

ControlBox=False

Saludos

Bienvenido al foro.

Amigo, no te has percatado bien del pedido que yo hacia y que ya está resuelto. El ControlBox que tu mencionas no existe en formularios MDI, eso existe solo en formularios normales, checalo y verás.

Saludos
Título: Re:Manejo de Ventana MDIForm
Publicado por: k_arlytos en Enero 21, 2013, 09:24:28 pm
Pero al estar maximizado y darle doble click el mdi ya no se reajusta a la pantalla
Título: Re:Manejo de Ventana MDIForm
Publicado por: YAcosta en Enero 22, 2013, 12:12:54 am
Pero al estar maximizado y darle doble click el mdi ya no se reajusta a la pantalla

Asi es, no quiero que se reajuste a la pantalla con el doble click.