Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

¿Como hago un popup estilo MSN?

Estas en el tema de ¿Como hago un popup estilo MSN? en el foro de Visual Basic clásico en Foros del Web. hoa, alguien tiene alguna idea de como hacer esos po-ups, estaba pensando en ahcer un form sin borde que este siempre arriba de todo, pero ...
  #1 (permalink)  
Antiguo 17/11/2005, 19:07
Avatar de (Pato)²  
Fecha de Ingreso: noviembre-2005
Mensajes: 130
Antigüedad: 19 años
Puntos: 1
¿Como hago un popup estilo MSN?

hoa, alguien tiene alguna idea de como hacer esos po-ups, estaba pensando en ahcer un form sin borde que este siempre arriba de todo, pero no se como hacer que aparesca siempre abajo a la derecha, porque si cambian por una resolucion mas grande no queda en ese lugar.
Bueno, ademas si hago eso aparece de una, y no de abajo para arriba como los del MSN...
¿alguien sabe que puedo hacer?

Muchas Gracias!!!
  #2 (permalink)  
Antiguo 18/11/2005, 07:58
Avatar de The_Pretorian  
Fecha de Ingreso: diciembre-2004
Ubicación: Lima - Peru
Mensajes: 267
Antigüedad: 20 años
Puntos: 0
Buenos Dias
Hace poco tuve ese requerimiento y me ayudaron con este ejemplo... lo modifique a mis necsidades y para que me saco del apuro. Espero te sirva
Cita:
Option Explicit
Dim varNumSeg As Long
Private Const HWND_TOPMOST = -1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Public Sub SlideForm(FRM As Form, Direction As Long)
Select Case Direction
Case 0 'Deliza un formulario hacia arriba
FRM.Show
Do Until FRM.Top = (Screen.Height - FRM.Height) - 435
FRM.Top = FRM.Top - 1
DoEvents
Loop
Case 1 'Deliza un formulario hacia abajo
Do Until FRM.Top = Screen.Height + (FRM.Height)
FRM.Top = FRM.Top + 1
DoEvents
Loop
End Select
End Sub

Private Sub ComAceptar_Click()
FrmDetalle.Show vbModal
End Sub

Private Sub ComCancelar_Click()
SlideForm Me, 1
Unload Me
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim CtrlDown As Long
CtrlDown = (Shift And vbCtrlMask) > 0
If KeyCode = vbKeyEscape Then
ComCancelar_Click
ElseIf KeyCode = vbKeyReturn Then
ComAceptar_Click
End If
End Sub

Private Sub Form_Load()
Me.ScaleMode = 3
'Ubica la ventana justo sobre el Tray, arriba del reloj
Me.Move (Screen.Width - Me.Width) - 500, Screen.Height
SlideForm Me, 0
TopMost Me 'ventana por encima de las demas
End Sub

Sub TopMost(Ventana As Form)
'MANTIENE LA VENTANA POR ENCIMA DE LAS DEMAS
'typically called in the form load
Call SetWindowPos(Ventana.hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
End Sub

Private Sub ImaCerrar_Click()
SlideForm Me, 1
Unload Me
End Sub

Private Sub TimAlerta_Timer()
varNumSeg = varNumSeg + 1
LblDeta01(2).Caption = "El Mensaje se cerrara en " & 10 - varNumSeg & " seg."
If varNumSeg = 10 Then
ImaCerrar_Click
End If
End Sub
Atte
Jorge Diaz
__________________
Creo que todas las cosas suceden por algo, no es eso que los demas llaman 'Destino'. Definitivamente Dios no juega a los dados...
  #3 (permalink)  
Antiguo 18/11/2005, 18:55
Avatar de (Pato)²  
Fecha de Ingreso: noviembre-2005
Mensajes: 130
Antigüedad: 19 años
Puntos: 1
gracias... use eso modificandolo un poco....
pero tengo un plroblema, cuando se esta deslisando apra abajo pasa por arriba del systray.
Sabes cmo solucionarlo?
gracias de nuevo

(Pato)²
  #4 (permalink)  
Antiguo 19/11/2005, 06:41
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
De acuerdo

Cita:
Iniciado por (Pato)²
gracias... use eso modificandolo un poco....
pero tengo un plroblema, cuando se esta deslisando apra abajo pasa por arriba del systray.
Sabes cmo solucionarlo?
gracias de nuevo

(Pato)²
Puedes simplemente ir "cortando" el Form a medida que pasa por el Systray (P.D.: creo que envés de usar constantes para saber la altura del Systray ya que ésto es modificable yo usaría FindWindow para obtener su hWnd y con GetWindowRect obtendría su altura)
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 19/11/2005, 11:36
Avatar de (Pato)²  
Fecha de Ingreso: noviembre-2005
Mensajes: 130
Antigüedad: 19 años
Puntos: 1
Cita:
Iniciado por David el Grande
Puedes simplemente ir "cortando" el Form a medida que pasa por el Systray (P.D.: creo que envés de usar constantes para saber la altura del Systray ya que ésto es modificable yo usaría FindWindow para obtener su hWnd y con GetWindowRect obtendría su altura)
muchas gracias che... la verdad que pabo que no me avive antes... ejjeje
le puse esto y quedo e 10:
Código:
If Not FRM.Height = 1 Then FRM.Height = FRM.Height - 1
me gusto muchi lo que dijiste de que al altura del systray puede cambiar, y esa solucion que diste debe andar, pero no sé como usar esas funciones de la API, no me podrias explicar
Es que soy muy nuevo con el vb (este es recien mi 1º programa), y todo lo que hago lo tengo que aprender :P

salusoy y gracias

(Pato)²
  #6 (permalink)  
Antiguo 21/11/2005, 13:12
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
De acuerdo

Cita:
Iniciado por (Pato)²
muchas gracias che... la verdad que pabo que no me avive antes... ejjeje
le puse esto y quedo e 10:
Código:
If Not FRM.Height = 1 Then FRM.Height = FRM.Height - 1
me gusto muchi lo que dijiste de que al altura del systray puede cambiar, y esa solucion que diste debe andar, pero no sé como usar esas funciones de la API, no me podrias explicar
Es que soy muy nuevo con el vb (este es recien mi 1º programa), y todo lo que hago lo tengo que aprender :P

salusoy y gracias

(Pato)²
Código:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Private Sub Form_Load()
Dim hWnd As Long
Dim buffRECT As RECT
hWnd& = FindWindow("Shell_TrayWnd", "")
If hWnd > 0 Then
    Dim res As Long
    res = GetWindowRect(hWnd, buffRECT)
    If res > 0 Then
        MsgBox "El Tamaño del Systray es: " & CStr(buffRECT.Bottom - buffRECT.Top) & " px.", vbInformation, "Tamaño"
    End If
End If
End Sub
A eso me refería, en éste código llamamos a la API: las funciones:
FindWindow -> Nos permite encontrar el hWnd de una ventana sabiendo su nombre de clase (en nuestro caso Sys_TrayWnd) o su Título ("" en nuestro caso pues el Systray no tiene título).
GetWindowRect -> Nos permite obtener el rectángulo a partir del hWnd de un Objeto.

Además, definimos un tipo que nos pide como parámetro el GetWindowRect, o sea RECT (creo que ya debes saber qué son Tipos)...

Y así, ya que nuestro RECT pasa como "ByRef" la API puede modificarlo, lo que en el caso lo modifica poniendo en él los valores del rectángulo del Systray....

Espero no haberte confundido, nos vemos...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #7 (permalink)  
Antiguo 21/11/2005, 22:06
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años, 7 meses
Puntos: 3
Hola me interso el tema e hice algunas modificaciones les dejo para que miren y corrijan si es nesesario

en un modulo:

Option Explicit
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Const HWND_TOPMOST = -1
Const SWP_NOMOVE = &H2
Const SWP_NOSIZE = &H1
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type


Public Sub SlideForm(FRM As Form, Direccion As Long)
Dim Posicion As Integer
Dim Tamaño As Integer
Dim hwnd As Long
Dim res As Long
Dim buffRECT As RECT

hwnd& = FindWindow("Shell_TrayWnd", "")
If hwnd > 0 Then
res = GetWindowRect(hwnd, buffRECT)
If res > 0 Then
Tamaño = CStr(buffRECT.Bottom - buffRECT.Top) * 15
If buffRECT.Left <= 0 And buffRECT.Top > 0 Then Posicion = 1
If buffRECT.Left > 0 And buffRECT.Top <= 0 Then Posicion = 2: Tamaño = (buffRECT.Right - buffRECT.Left) * 15
If buffRECT.Left <= 0 And buffRECT.Top <= 0 And buffRECT.Right < 600 Then Posicion = 3: Tamaño = buffRECT.Right * 15
If buffRECT.Left <= 0 And buffRECT.Top <= 0 And buffRECT.Right > 600 Then Posicion = 4
End If
Else
Posicion = 1
End If
res = SetWindowPos(FRM.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)

If Direccion = 0 Then
FRM.Show
FRM.Height = 0
Select Case Posicion
Case 1
FRM.Move Screen.Width - FRM.Width, Screen.Height - FRM.Height - Tamaño
Case 2
FRM.Move Screen.Width - FRM.Width - Tamaño, Screen.Height - FRM.Height
Case 3
FRM.Move Tamaño, Screen.Height - FRM.Height
Case 4
FRM.Move Screen.Width - FRM.Width, Tamaño
End Select

Do Until FRM.Height = 3000 ' la altura que se quiera
DoEvents
FRM.Height = FRM.Height + 1
If Not Posicion = 4 Then FRM.Top = FRM.Top - 1
Loop
Else
Do Until FRM.Height = 520
DoEvents
FRM.Height = FRM.Height - 1
If Not Posicion = 4 Then FRM.Top = FRM.Top + 1
Loop
Unload FRM
End If
End Sub

----------------
y en el form1(agregue tambien un form2)


'para abrir
SlideForm Form2, 0

' y para cerrar
SlideForm Form2, 1
  #8 (permalink)  
Antiguo 23/11/2005, 18:38
Avatar de (Pato)²  
Fecha de Ingreso: noviembre-2005
Mensajes: 130
Antigüedad: 19 años
Puntos: 1
Cita:
Iniciado por David el Grande
Código:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Private Sub Form_Load()
Dim hWnd As Long
Dim buffRECT As RECT
hWnd& = FindWindow("Shell_TrayWnd", "")
If hWnd > 0 Then
    Dim res As Long
    res = GetWindowRect(hWnd, buffRECT)
    If res > 0 Then
        MsgBox "El Tamaño del Systray es: " & CStr(buffRECT.Bottom - buffRECT.Top) & " px.", vbInformation, "Tamaño"
    End If
End If
End Sub
A eso me refería, en éste código llamamos a la API: las funciones:
FindWindow -> Nos permite encontrar el hWnd de una ventana sabiendo su nombre de clase (en nuestro caso Sys_TrayWnd) o su Título ("" en nuestro caso pues el Systray no tiene título).
GetWindowRect -> Nos permite obtener el rectángulo a partir del hWnd de un Objeto.

Además, definimos un tipo que nos pide como parámetro el GetWindowRect, o sea RECT (creo que ya debes saber qué son Tipos)...

Y así, ya que nuestro RECT pasa como "ByRef" la API puede modificarlo, lo que en el caso lo modifica poniendo en él los valores del rectángulo del Systray....

Espero no haberte confundido, nos vemos...
gracias David, lo que me pasaste anda bien, salvo por 2 cositas:
1º me aparece en pixeles, entonces no me sirve para remplasarlopor 450 del codigo original
2º si lo remplaso, multiplicandolo por 15 o 15,2 (que es mas o menos la relacion que encotre entre las 2 unidades), no funca, y se me ve abajo del todo y sin el efecto de Slide (osea, aparece de una)...

gracias!

(Pato)²
  #9 (permalink)  
Antiguo 24/11/2005, 13:44
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años, 7 meses
Puntos: 3
Provaste el codig que puese arriva?
  #10 (permalink)  
Antiguo 24/11/2005, 15:19
Avatar de (Pato)²  
Fecha de Ingreso: noviembre-2005
Mensajes: 130
Antigüedad: 19 años
Puntos: 1
Cita:
Iniciado por LeandroA
Provaste el codig que puese arriva?
sisi!, anda bien, pero me mareo un poco, y no me gusta hacer COPY&PASTE, despues capas que lo lea bien y lo pongo
saludos!
  #11 (permalink)  
Antiguo 25/11/2005, 12:27
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
De acuerdo

Cita:
Iniciado por (Pato)²
gracias David, lo que me pasaste anda bien, salvo por 2 cositas:
1º me aparece en pixeles, entonces no me sirve para remplasarlopor 450 del codigo original
2º si lo remplaso, multiplicandolo por 15 o 15,2 (que es mas o menos la relacion que encotre entre las 2 unidades), no funca, y se me ve abajo del todo y sin el efecto de Slide (osea, aparece de una)...

gracias!

(Pato)²
Para convertir se hace nomás...
Código:
 
Twips = SysTrayHeight * Screen.TwipsPerPixelY
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #12 (permalink)  
Antiguo 25/11/2005, 14:08
Avatar de (Pato)²  
Fecha de Ingreso: noviembre-2005
Mensajes: 130
Antigüedad: 19 años
Puntos: 1
leandroA:
bue, me puse las pilas y lei tu codigo. no era tan complicado, pero no tenia muchas ganas. La verdad que anda barbaro, ya lo implemente, para que no me quede tanto lio en el form del popup...


Muchas Gracias a todos!

(Pato)²
  #13 (permalink)  
Antiguo 26/11/2005, 10:22
Avatar de hernanmdq  
Fecha de Ingreso: julio-2005
Ubicación: Argentina - Entre Rios
Mensajes: 167
Antigüedad: 19 años, 4 meses
Puntos: 1
Gracias LeandroA muy buen codigo el que aportaste, salu2.
__________________
| Codigo Geek | Blog de Cine |
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:29.