Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: fx700 en Julio 15, 2011, 07:08:42 pm
-
Como puedo colocar un formulario sea un form normal o un MDIchild en el StatusBar por que normalmente quedan flotando en la esquina inferior izquierda y no dentro del statusbar, ademas me gustaria algo como el estilo de windows 7, tengo en true la propiedad showintaskbar.
Nunca me habia percatado de algo asi pero me estan pidiendo eso y yo ando por las nubes.
(http://www.freeimagehosting.net/uploads/2e36cdfcfa.png)
Solo encontre este ejemplo pero no logro correrlo con los MDI aparte de estar incrustandose un control mas no un form.
http://www.recursosvisualbasic.com.ar/htm/listado-api/92-setparent-incrustar-progressbar-statusbar.htm (http://www.recursosvisualbasic.com.ar/htm/listado-api/92-setparent-incrustar-progressbar-statusbar.htm)
Edito por que creo que no me explique muy bien
-
Hola si tienes la propiedad ShowInTakbar= True y te pasa eso creo que una vez lidie con ese asunto y es por que al Formulario lo abría desde el procedimiento SubMain () , si en tu caso lo haces asi intenta cambiar desde el inicio del proyecto al form en custion y chequea!
Exitos!
-
Con este codigo el nombre y el icono del form quedan en el statusbar, pero el objeto form sigue siendo hijo del MDIForm, ojala te sirva ;)
En el formulario MDI pone este codigo
Option Explicit
Private Sub MDIForm_Load()
With StatusBar1
.Panels.Clear
.Panels.Add 1, , "Panel 1"
.Panels.Add 2, , "Panel 2"
End With
End Sub
Private Sub StatusBar1_PanelClick(ByVal panel As ComctlLib.panel)
Dim i As Long
If Len(panel.Tag) > 0 Then
For i = 0 To Forms.Count - 1
If Forms(i).Name = panel.Tag Then
Forms(i).WindowState = vbNormal
Forms(i).Visible = True
StatusBar1.Panels.Remove panel.Index
Exit For
End If
Next
End If
End Sub
Y en el formulario MDIChild pone este codigo
Option Explicit
Private Sub Form_Resize()
If Me.WindowState = vbMinimized Then
Dim sbPanel As ComctlLib.panel
Me.Visible = False
With MDIForm1.StatusBar1.Panels
Set sbPanel = .Add(.Count + 1, , Me.Caption, , Me.Icon)
With sbPanel
.Tag = Me.Name
.ToolTipText = "Formulario incrustado"
End With
End With
End If
End Sub
-
Hola lolabyte funciona muy bien tu idea, lo unico es que si se habre x veces el mismo form se generan x paneles, aunque espero solucionar eso de alguna forma, saludos
-
Hay nuevas actualizaciones disponibles, descargue ya! :P
En el MDIForm
Option Explicit
Private Declare Function CreatePopupMenu Lib "user32" () As Long
Private Declare Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal hWnd As Long, ByVal lptpm As Any) As Long
Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, phiconSmall As Long, ByVal nIcons As Long) As Long
Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Const MF_CHECKED = &H8&
Const MF_APPEND = &H100&
Const TPM_LEFTALIGN = &H0&
Const MF_DISABLED = &H2&
Const MF_GRAYED = &H1&
Const MF_SEPARATOR = &H800&
Const MF_STRING = &H0&
Const TPM_RETURNCMD = &H100&
Const TPM_RIGHTBUTTON = &H2&
Private Sub MDIForm_Load()
With StatusBar1
.Panels.Clear
.Panels.Add 1, , "Panel 1"
.Panels.Add 2, , "Panel 2"
End With
Dim f As Form
Form1.Caption = "Form1 original"
Set f = New Form1
f.Caption = "Form1 copia 2"
f.Show
Set f = New Form1
f.Caption = "Form1 copia 3"
f.Show
End Sub
Private Sub StatusBar1_PanelClick(ByVal panel As ComctlLib.panel)
Dim i As Long, j As Long, bRemove As Boolean, v
Dim lRet As Long
Dim hMenu As Long, pt As POINTAPI
If Len(panel.Tag) > 0 Then
v = Split(panel.Tag, ";")
hMenu = CreatePopupMenu()
For i = 1 To UBound(v) - 1 Step 2
AppendMenu hMenu, MF_STRING, v(i + 0), CStr(v(i + 1))
Next
GetCursorPos pt
lRet = TrackPopupMenuEx(hMenu, TPM_LEFTALIGN Or TPM_RETURNCMD Or TPM_RIGHTBUTTON, pt.x, pt.y, Me.hWnd, ByVal 0&)
DestroyMenu hMenu
If lRet > 0 Then
For i = 0 To Forms.Count - 1
If Forms(i).hWnd = lRet Then
Forms(i).WindowState = vbNormal
Forms(i).Visible = True
panel.Tag = v(0) & ";"
bRemove = True
For j = 1 To UBound(v) - 1 Step 2
If lRet <> v(j + 0) Then
panel.Tag = panel.Tag & v(j + 0) & ";" & v(j + 1) & ";"
bRemove = False
End If
Next
If bRemove Then
StatusBar1.Panels.Remove panel.Index
End If
Exit For
End If
Next
End If
End If
End Sub
Y en el MDIChild esto
Option Explicit
Private Sub Form_Resize()
Dim i As Long, bFound As Boolean, v
If Me.WindowState = vbMinimized Then
Dim sbPanel As ComctlLib.panel
Me.Visible = False
With MDIForm1.StatusBar1.Panels
bFound = False
For i = 1 To .Count
v = Split(.Item(i).Tag, ";")
If UBound(v) <> -1 Then
If v(0) = Me.Name Then
bFound = True
Exit For
End If
End If
Next
If bFound Then
Set sbPanel = .Item(i)
sbPanel.Tag = sbPanel.Tag & Me.hWnd & ";" & Me.Caption & ";"
Else
Set sbPanel = .Add(.Count + 1, , Me.Name, , Me.Icon)
With sbPanel
.Tag = Me.Name & ";" & Me.hWnd & ";" & Me.Caption & ";"
.ToolTipText = "Formulario incrustado"
End With
End If
End With
End If
End Sub
Ahora aparece un menu con los nombres de los formularios del mismo tipo ;D
-
Por fin! salio la version 2.0, la estaba esperando :P, esta bueno lo del menu.
En la consulta anterior me referia a que si hago por ejemplo 5 veces Form1.show entonces se creaban 5 paneles aunque realmente solo existe un Form1 y eso era lo que queria evitar, osea hacer equiz veces Form1.show y siempre permanesta 1 solo panel correspondiente al form1.
Repito, excelente lo del menu lo podria utilizar cuando ya no quede espacio para colocar mas paneles, me refiero al ancho de pantalla y evitar scroll's.