• Domingo 22 de Diciembre de 2024, 15:58

Autor Tema:  Formularios Mdi  (Leído 2532 veces)

chryobcn

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Formularios Mdi
« en: Jueves 29 de Abril de 2004, 00:56 »
0
Saludos

Necesito poder inhabilitar los controles de maximizado/restaurar y minimizar de formularios mdi padre e hijos (los formularios siempre tienen que estar maximizados).

La solucion chapuza es forzando el estado en el form_resize pero...

Navegando por los foros encontre la siguiente funcion pero solo me inhabilita el control de cerrar el formulario, he intentado hacer varias pruebas pero siempre con el mismo resultado.

La funcion es:
Citar
Option Explicit

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long

'Constantes
Const SC_SIZE = &HF000
Const SC_MOVE = &HF010
Const SC_MINIMIZE = &HF020
Const SC_MAXIMIZE = &HF030
Const SC_CLOSE = &HF060
Const SC_RESTORE = &HF120

Const MF_SEPARATOR = &H800
Const MF_BYPOSITION = &H400
Const MF_BYCOMMAND = &H0

Private Sub MDIForm_Load()
Dim hwnd&, hMenu&, Success&
Dim i%
hwnd = Me.hwnd
hMenu = GetSystemMenu(hwnd, 0)
'Quitar todos (va de 0 a 8)
For i = 8 To 0 Step -1
Success = DeleteMenu(hMenu, i, MF_BYPOSITION)
Next
Exit Sub
'Usa esto para quitar los menús que te interesen:
Success = DeleteMenu(hMenu, SC_SIZE, MF_BYCOMMAND)
Success = DeleteMenu(hMenu, SC_MOVE, MF_BYCOMMAND)
Success = DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
'Success = DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND)
'Success = DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND)
'Success = DeleteMenu(hMenu, SC_RESTORE, MF_BYCOMMAND)
End Sub

ROBER.29

  • Miembro MUY activo
  • ***
  • Mensajes: 421
    • Ver Perfil
    • http://www.contrapixel.com
Re: Formularios Mdi
« Respuesta #1 en: Jueves 29 de Abril de 2004, 09:33 »
0
Utiliza el siguiente código:

Código: Text
  1.  
  2. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  3. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  4.  
  5. Const WS_MINIMIZEBOX = &H20000
  6. Const WS_MAXIMIZEBOX = &H10000
  7. Const GWL_STYLE = (-16)
  8.  
  9. Const MF_BYPOSITION = &H400
  10. Const MF_REMOVE = &H1000
  11. Private Declare Function DrawMenuBar Lib "user32" _
  12. (ByVal hwnd As Long) As Long
  13. Private Declare Function GetMenuItemCount Lib "user32" _
  14. (ByVal hMenu As Long) As Long
  15. Private Declare Function GetSystemMenu Lib "user32" _
  16. (ByVal hwnd As Long, _
  17. ByVal bRevert As Long) As Long
  18. Private Declare Function RemoveMenu Lib "user32" _
  19. (ByVal hMenu As Long, _
  20. ByVal nPosition As Long, _
  21. ByVal wFlags As Long) As Long
  22.  
  23. Private Sub MDIForm_Load()
  24.     Dim L As Long
  25.     Dim hMenu As Long
  26.     Dim menuItemCount As Long
  27.    
  28.    
  29.     'para que no se vean los botones
  30.     L = GetWindowLong(Me.hwnd, GWL_STYLE)
  31.     L = L And Not (WS_MINIMIZEBOX)
  32.     L = L And Not (WS_MAXIMIZEBOX)
  33.     L = SetWindowLong(Me.hwnd, GWL_STYLE, L)
  34.     'para quitar las opciones del menu de sistemas
  35.     'Obtenemos un handle al menú de sistema del formulario
  36.     hMenu = GetSystemMenu(Me.hwnd, 0)
  37.     If hMenu Then
  38.         'eliminamos tamaño
  39.         Call RemoveMenu(hMenu, 2, MF_REMOVE Or MF_BYPOSITION)
  40.         'eliminamos minimizar (ahora está en el 3)
  41.         Call RemoveMenu(hMenu, 2, MF_REMOVE Or MF_BYPOSITION)
  42.         'Eliminamos el elemento maximizar (ahora está en el 3)
  43.         Call RemoveMenu(hMenu, 2, MF_REMOVE Or MF_BYPOSITION)
  44.         'Forzamos el redibujado del menú. Esto refresca la barra de título
  45.         Call DrawMenuBar(Me.hwnd)
  46.     End If
  47. End Sub
  48.  
  49.  

Espero que te sirva un saludo.
Roberto García
Moderador de Visual Basic.
Gerente
[contra]PixeL S.L.
Valladolid

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Formularios Mdi
« Respuesta #2 en: Jueves 29 de Abril de 2004, 10:00 »
0
Hola chryobcn.

¿De verdad piensas que usar windowstate es una chapuza?... pues no sé que será más chapucero: usar ese método inhabilitando el MaxButton, o tener una aplicación MDI todo el rato maximizada...

Abur.

chryobcn

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Re: Formularios Mdi
« Respuesta #3 en: Jueves 29 de Abril de 2004, 11:49 »
0
Saludos

Gracias Rover.29 por tu respuesta, en el formulario mdi padre funciona perfectamente, pero el problema viene dado en el formulario child que si desactivo el control de maximizado no se me muestra el formulario, el que si me deja deshabilitar es el de minimizar. Ahora me hago la siguiente pregunta... vb 6 permite mostrar un form child sin el boton de maximizar??


Acerca de lo comentado Brroz, no necesito el funcionamiento esplicito de los formularios mdi, ya que no quiero que se puedan abrir dos formularios hijos a la vez ya que para el programa que estoy haciendo podria ser un gran problema al atacar a la base de datos constantemente... es simplemente que el diseño de las interficies queda muy majo a mi gusto :P y eso los profesores lo puntuan....

Por lo del tema de chapuza, al restaurar se ve como el formulario se minimiza y luego se vuelve a maximizar... francamente lo veo feo

Gracias

ROBER.29

  • Miembro MUY activo
  • ***
  • Mensajes: 421
    • Ver Perfil
    • http://www.contrapixel.com
Re: Formularios Mdi
« Respuesta #4 en: Viernes 30 de Abril de 2004, 10:07 »
0
Hola,

Siento decirte que creo que no es posible que se deshabilite el control maximizar de un formulario hijo de un MDI, yo también lo estuve probando en su día pero si quitaba el botón no se me abría luego, por lo tanto te aconsejo que desistas en tu búsqueda por querer quitar el botón maximizar del hijo porque yo personalmente creo que no lo vas a encontrar ya que estoy completamente seguro de que no se puede.

Si por el contrario lo encuentras o lo consiges hacer me gustaría que me dijeras como.

Un saludo.

PD.- Espero que no sigais la discusión entre Brozz y tu.
Roberto García
Moderador de Visual Basic.
Gerente
[contra]PixeL S.L.
Valladolid

chryobcn

  • Miembro activo
  • **
  • Mensajes: 26
    • Ver Perfil
Re: Formularios Mdi
« Respuesta #5 en: Viernes 30 de Abril de 2004, 21:00 »
0
Saludos

Siento que haya parecido una discusion, solo estaba comentando mi punto de vista y el porque me interesaba hacerlo de esa manera, nada mas.

Hasta Otra