Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: wolf_kof en Julio 05, 2010, 01:37:25 am
-
Alguien sabe como quitar el boton maximizar de un mdiform?
-
Propiedad Maxbutton = False?
-
Bueno me voy a contestar solito (YvanB ;D), despues de mucho buscar, miren me encontre con este codigo que manipula api para quitar los bonotes minimaz y maximizar de un MDIFORM, aparte encontre un codigo que hace que el MDIFORM se ejecute en vista Maxima osea en toda la pantalla (creo que le serviria bastante a IvanB) voy con el codigo.
Codigo Sencillo para quitar los Botones Maximizar y Minimizar
se declara en el encabezado del MDIFORM
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
y esto se coloca en la propiedad load
Dim L As Long
L = GetWindowLong(Me.hwnd, GWL_STYLE)
L = L And Not (WS_MINIMIZEBOX)
L = L And Not (WS_MAXIMIZEBOX)
L = SetWindowLong(Me.hwnd, GWL_STYLE, L)
increiblemente funciona
Este codigo es mejor por que pone a la resolución maxima del monitor que tengas el MDIForm y lo maximia a toda su expresión (Pantalla completa)
se declara
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE As Long = -16
Private Const GWL_EXSTYLE As Long = -20
Private Const WS_OVERLAPPEDWINDOW As Long = &HCF0000
Private Const WS_EX_APPWINDOW As Long = &H40000
y en la propiedad load se coloca lo siguiente:
Private Sub MDIForm_Load()
SetWindowLong hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) And Not WS_OVERLAPPEDWINDOW
SetWindowLong hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) And Not WS_EX_APPWINDOW
End Sub
Espero que a alguien le sirva
-
Hola Wolf, voy a probar tu código y ya te mande el link del servidor donde esta alojado el proyecto "VB6-Firebird" que estuvimos conversando.
Saludos.
-
ok graxias YvanB prueba el codigo esta rebuenisimo a mi me sirvio genial (COOL)
-
Bueno me voy a contestar solito (YvanB ;D)
Jajajajaja... Esto si me causo risa...! ::)
Esta muy bueno el codigo Wolf, buen aporte...!
-
jejeje, si ta buena. Lo bueno es que el tema ya esta superado y conversamos directamente con acceso remoto, "comparticion" de código y links de chicas calatas (no mentira) jejee.
-
Excelente...!
-
;) yo me apunto para lo de las chicas cuando quieras, tengo muy buenos enlaces 8)
-
Se que el tema es antiguo pero lo retomo porque en un nuevo proyecto necesito quitar el MAX del MDI, no use en su momento este codigo porque use un truco que hacia poner el form MDI mas arriba de la pantalla y no dejo ver la barra, pero para este proyecto no puedo hacer eso, asi que hice esto
Declaracion en el MDIFORM
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
y esto se coloca en el evento Load
Dim L As Long
L = GetWindowLong(Me.hwnd, GWL_STYLE)
L = L And Not (WS_MINIMIZEBOX)
L = L And Not (WS_MAXIMIZEBOX)
L = SetWindowLong(Me.hwnd, GWL_STYLE, L)
Pero no funciona, es decir, los botones siguen alli... ¿que puede estar pasando?. Adicionalmente habría que comentar que el usuario tampoco pueda maximizar haciendo doble click sobre la barra.
Gracias
EDICION: Encontre en la web que faltaba poner en la declaracion esto:
Const WS_MINIMIZEBOX = &H20000
Const WS_MAXIMIZEBOX = &H10000
Const GWL_STYLE = (-16)
Pero tampoco me funciono, seguire indagando.
EDICION 2 Probe esto tambien y nada.. que raro!!!, en la declaracion:
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
' Funciones para cambiar el estilo
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Const MF_BYPOSITION = &H400&
y en el Load:
Dim Aux As Long
Dim hSysMenu As Long, nCnt As Long
'Elimina los botones
Aux = GetWindowLong(me.hwnd, GWL_STYLE)
SetWindowLong frmBASE.hwnd, GWL_STYLE, aux Xor (WS_MAXIMIZEBOX Or WS_MINIMIZEBOX)
'Elimina los elementos en el menu
hSysMenu = GetSystemMenu(me.hwnd, False)
If hSysMenu Then
nCnt = GetMenuItemCount(hSysMenu)
If nCnt Then
RemoveMenu hSysMenu, nCnt - 3, MF_BYPOSITION
RemoveMenu hSysMenu, nCnt - 4, MF_BYPOSITION
End If
End If
Voy por un trago pq ya me maree.
-
Bien aqui completo el asunto que no pude resolver.
http://www.youtube.com/watch?v=2u1JxzSnxrU (http://www.youtube.com/watch?v=2u1JxzSnxrU)
Probe las siguientes forma encontradas en la web:
Forma 1
DECLARACION
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Const WS_MINIMIZEBOX = &H20000
Const WS_MAXIMIZEBOX = &H10000
Const GWL_STYLE = (-16)
FORM LOAD
Dim L As Long
L = GetWindowLong(frmBASE.hwnd, GWL_STYLE)
L = L And Not (WS_MINIMIZEBOX)
L = L And Not (WS_MAXIMIZEBOX)
L = SetWindowLong(frmBASE.hwnd, GWL_STYLE, L)
Forma 2
DECLARACION
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
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 GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000
Private Const WS_POPUP = &H80000000
Private Const WS_BORDER = &H800000
Private Const WS_SYSMENU = &H80000
Private Const WS_POPUPWINDOW = (WS_POPUP Or WS_BORDER Or WS_SYSMENU)
Private Const MF_BYPOSITION = &H400&
Private Const MF_REMOVE = &H1000&
FORM LOAD (Solo inhabilita el cerrar)
Dim lEstilo As Long
Dim hMenu As Long
lEstilo = GetWindowLong(Me.hwnd, GWL_STYLE)
lEstilo = lEstilo And WS_POPUPWINDOW Or WS_CAPTION
Call SetWindowLong(Me.hwnd, GWL_STYLE, lEstilo)
hMenu = GetSystemMenu(Me.hwnd, 0)
Call RemoveMenu(hMenu, 3, MF_REMOVE Or MF_BYPOSITION)
Call RemoveMenu(hMenu, 3, MF_REMOVE Or MF_BYPOSITION)
Call RemoveMenu(hMenu, 3, MF_REMOVE Or MF_BYPOSITION)
Call RemoveMenu(hMenu, 3, MF_REMOVE Or MF_BYPOSITION)
DrawMenuBar Me.hwnd
Forma 3
DECLARACION
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
' Funciones para cambiar el estilo
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Const MF_BYPOSITION = &H400&
FORM LOAD
Dim aux As Long
Dim hSysMenu As Long, nCnt As Long
' Elimina los botones
aux = GetWindowLong(frmBASE.hwnd, GWL_STYLE)
SetWindowLong frmBASE.hwnd, GWL_STYLE, aux Xor (WS_MAXIMIZEBOX Or WS_MINIMIZEBOX)
' Elimina los elementos en el menu
hSysMenu = GetSystemMenu(frmBASE.hwnd, False)
If hSysMenu Then
nCnt = GetMenuItemCount(hSysMenu)
If nCnt Then
RemoveMenu hSysMenu, nCnt - 3, MF_BYPOSITION
RemoveMenu hSysMenu, nCnt - 4, MF_BYPOSITION
End If
End If
Y ninguna de las 3 me funciona como lo demuestro en el video... ¿En que estoy mal? Quiero quitar solamente el boton Maximizar y que tampoco funcione el doble clic sobre la barra para maximizar
-
A mi este codigo (similar al primero) me anda perfecto
Option Explicit
Private Declare Function SetWindowLongA Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLongA Lib "user32" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const WS_MAXIMIZEBOX = &H10000
Private Const GWL_STYLE As Long = -16
Private Sub MDIForm_Load()
Call SetWindowLongA(hwnd, GWL_STYLE, GetWindowLongA(hwnd, GWL_STYLE) And Not WS_MAXIMIZEBOX)
End Sub
Será que lo estas volviendo a poner despues del Form_Load?
PD: Poniendo el mismo codigo del Form_Load, en un boton, el cambio no "se ve" hasta que mueva el form :P
-
Hola Raul
Tu código funciono perfecto al 66.66% (jeje)
Mira:
Punto 1: El botón sale inhabilitado: Perfecto.
Punto 2: Al hacer doble clic sobre la barra del MDI no se maximiza: Perfecto.
Punto 3: Al hacer click derecho y sale el menú emergente, en ese menú hay la opción de maximizar y se maximiza.
Solo bastaría que hacer desaparecer esa opción del menú emergente y quedaría de 100. Estuve viendo esto ayer casi todo el dia y como no lo pude resolver tome el consejo de xkiz y ya empece a usar formularios con parents en picture, es un poco mas de trabajo pero ni modo, solo me queda la duda si haciéndolo así pierdo algo: performance, memoria, o es igual, si me pudieran aclarar eso les agradecería.
-
solo hay que hacerle un agregado al codigo de raul, obtener el menu del form a traves de la api GetSystemMenu y eliminar la opcion maximizar a traves de su id SC_MAXIMIZE.
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
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
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 MF_BYCOMMAND = &H0
Private Const SC_MAXIMIZE As Long = &HF030&
Private Const GWL_STYLE& = (-16)
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Sub MDIForm_Load()
DisableMaxButton
End Sub
Public Sub DisableMaxButton()
Dim hMenu As Long
Dim OldStyle As Long
OldStyle = GetWindowLong(Me.hWnd, GWL_STYLE)
SetWindowLong Me.hWnd, GWL_STYLE, OldStyle And (Not WS_MAXIMIZEBOX)
hMenu = GetSystemMenu(Me.hWnd, 0&)
If hMenu Then
Call DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND)
Call DrawMenuBar(Me.hWnd)
End If
End Sub
Fuente: removing max button on mdi parent (http://www.vbforums.com/showpost.php?p=2305692&postcount=2)
saludos.
-
Ya por fin: 100%, el codigo va perfecto y cubre los 3 casos.
Como ya vengo avanzando con setparent, pregunta:
Sebas y usar el setparent?? (para evitar el midform) tendria algun problema'?? aparte de un poquito mas de chamba, algun inconveniente podre tener??? o debo cuidar algo??
-
Mira vos, no sabia eso, gracias seba por compartir :P
Sebas y usar el setparent?? (para evitar el midform) tendria algun problema'?? aparte de un poquito mas de chamba, algun inconveniente podre tener??? o debo cuidar algo??
Nunca lo probe yo, pero yo creo, CREO, que puede haber problemas con el Minimizar del formulario que queda hijo. Probalo, pero yo tengo ese presentimiento xD
-
Si ese es el único problema que pudiera haber, entonces no hay problema pq yo nunca minimizo los formularios hijos, nunca doy esa opción al usuario y en los formularios hijos quito la Barra de Titulos, ni siquiera con el MDI. Chevere.
-
Saludos a Todos 8)!!!
YvanB, no tendrías problema alguno con la API SetParent. En mi caso, una aplicación que estaba desarrollando, la estaba iniciando con el condenado MDIForm de VB 6.0, hasta que me harté de que ese dichoso tipo de form que es muy rígido y casi no se puede hacer un co... con él.
Fue entonces que le planteé el divorcio con separación de bienes (je, je !!!) ;D a ese MDI. Personalicé mis forms utilizando el SetParent... aparte de que suprimí la barra de título quitando cualquier tipo de botones, cree una barra personalizada (para simular una barra de titulo) con un "botón X" (eso sí, lo que no gasté en código, me lo tuve que gastar creando el fondo para que la barra no se viera así como "insípida" por decirlo así, y dibujar también un botón X como si fuese un pintor !!! -me quedó presentable +/- experimentando claro.) La barra la diseñé en un Control ActiveX, y le agregué las API's SendMessage y ReleaseCapture, debido a que como todos sabemos que cuando a un form se le suprime la barra de título, este no se puede mover. Con las API's que nombré se resuelve ese detalle. La barra me quedó 'decente', no es una cosa que se diga: Microsoft, Lynux, se jod... ya no sigan que llegué yo !!! (je, je !!!) no claro que no, pero se deja ver.
Eso sí, así como usas el SetParent, hay que liberar el form al cerrarlo, porque aunque se descargue permanece la referencia en memoria.
Espero que esto pueda servirles de algo !!!
Saludos.
Manuel F. Borrego S.
Barcelona, Venezuela.
-
Ah !!! olvidé un pequeño y mísero "detallito" ::)
Mi estimado YvanB, te habías quejado un poco, que con el VB .Net se hacía lo mismo que en VB 6.0 pero con más código... Pareciera ser cierto, por las primeras impresiones.
Pero que tal, En el VB 9.0 (VB 2008) escoges el Form que quieras, y en la propiedad IsMdiContainer la colocas en True, y listo ya tienes un flamante MDIForm, ah pero todavía hay más ;D...!!! si ud. llama en los próximos 10 minutos le daremos absolutamente gratis las propiedades MaximizeBox y MinimizeBox, las cuales al usted colocarlas en False... listo !!! como por arte de magia (si del mago Microsoft, claro) tiene ud un espléndido MDIForm con solo el Botón X !!! ahhhh y se ahorra toneladas de código, que solo le harán cambiar sus lentes y gastar su teclado !!! (Je, Je !!!)
Y de paso, puedes hacer prácticamente lo que te de la gana con el MDIForm (muchisimo más que con el del VB 6.0)
Así que llamé ya al 0800-MIGRATEAVBNET-YA y recibirás todas estas ofertas !!!
Je, Je, Je Toda una broma Hermano, y para todos ustedes en este foro !!! ah eso sí, con respecto a lo del MDI en VB 2008, es cierto !!!
Saludos.
Manuel F. Borrego S. 8)
Barcelona, Venezuela
-
Bien Dr ADONAIRAFA, gracias por la recomendacion sobre el .Net.
Y sobre lo del SetParent gracias también y solo pedirte una consulta. Pa no chuparme la memoria de la maquina del cliente, lo mejor es descargar de memoria, alli como seria? asi?
Set Fomulario = Nothing
Con eso es sufi?? gracias
-
Saludos Compadre !!!
Lo anterior era bromeando ;D(porque pa' lo de Dr. me falta demasiado, uds son prácticamente unos gurús en este negocio del VB 6.0 :o), mire que yo soy su "padawan" en la gran Orden Firebird (je, je !!!)
Con respecto a lo que me pediste, sencillamente justo antes de la descarga (Form_Unload) colocas:
Call SetParent(Frm.hwnd, 0) '// el parámetro (handle) del Form padre, lo llevas 0. Ahí lo liberas...
y despues:
Set Form = Nothing '// (agregas lo que habías propuesto)
y listo.
Espero te sirva !!! (y para mi es satisfactorio poderles ser útil en algo a los maestros de este foro, porque en verdad he aprendido mucho de uds !!!)
Saludos.
Manuel F. Borrego S. 8)
PD: Por cierto, estuve curioseando un poco acerca de la promo que
haces de tu software Quentas, y se ve fenomenal !!! Enhorabuena !!!
-
No creas a mi también me falta muchísimo.
Voy a ver sobre esta linea: Call SetParent(Frm.hwnd, 0)
P.D: Gracias por lo del soft, allí le vamos dando para ir mejorándolo. Ahora estoy trabajando una nueva versión del mismo q dirigiré a otro sector, veremos que tal va.
Saludos
-
Voy a ver sobre esta linea: Call SetParent(Frm.hwnd, 0)
Saludos compadre !!!
Un detalle: en el parámetro Frm.hwnd, "Frm" representa el nombre del Form 'hijo', debí haber puesto: Form1.hwnd, aclarando por si acaso no se entiende bien.
Un olvido lo tiene cualquiera ::), sobre todo en mi país (Venezuela) donde tenemos como presidente al papá de Humala :o... el grandísimo y nunca bien ponderado del desgraciado, CDSM y HP (no Hewlett Packard !!! Je, Je, Je !!!) del Chávez :P!!!
Tienes que comprender !!! Je, Je !!!
Saludos
Manuel F. Borrego S.
Barcelona, Venezuela.
-
jajaja, ok, comprendido doc. Saludos
-
Cuando hago esto:
Call SetParent(Form1.hwnd, 0)
Me saca el formulario del picture. Entonces, veo que tendría que hacer esto?
Call SetParent(Form1.hwnd, 0)
Unload Form1
Set Form1 = Nothing
Pero al hacer eso me da un ligero parpadeo al irse, porque lo saca y lo descarga. Esta bien si trabajo solo asi?
Unload Form1
Set Form1 = Nothing
Gracias
-
Tienes razón, pensé que era mi PC, pero el detalle ese del parpadeo, no he podido quitárselo, aún jugando con las líneas de instrucción que te suministré :-[ !!!
Manuel F. Borrego S.
Barcelona, Venezuela.