Problema con un WebBrowser (II) Ahora arrastrable

Iniciado por z3nth10n, 26 Mayo 2013, 15:53 PM

0 Miembros y 1 Visitante están viendo este tema.

z3nth10n

Hola, tengo mi WebBrowser que muestra una imagen con marquee infinito; quiero saber si es posible mediante este código transformarlo en el WebBrowser1 que es el control de mi WebBrowser...

Código (vbnet) [Seleccionar]
Option Explicit On
Option Strict On

Public Class Form1
   ' variables
   Private x As Integer
   Private y As Integer
   Private mover As Boolean

   Private Sub Form1_MouseDown( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown

       If e.Button = Windows.Forms.MouseButtons.Left Then
           ' habilitar el flag
           mover = True
           ' guardar las coordenadas
           x = e.X
           y = e.Y
           ' cambiar el cursor del mouse
           Me.Cursor = Cursors.NoMove2D
       End If
   End Sub

   Private Sub Form1_MouseMove( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove

       If mover Then
           ' establecer la nueva posición
           Me.Location = New Point((Me.Left + e.X - x), (Me.Top + e.Y - y))
       End If

   End Sub

   Private Sub Form1_MouseUp( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
       ' reestablecer
       mover = False
       Me.Cursor = Cursors.Default
   End Sub
End Class


Cual es el problema?
Lo he intentado cambiando Form1 por WebBrowser1 y lockeando el mismo WebBrowser, pero cuando voy a arrastrar el Form, lo que arrastro  es la imagen que lleva el WebBrowser dentro, es decir lo que está mostrando...

Alguna idea?

Un saludo.





He estado modificando un poco el código:

Código (vbnet) [Seleccionar]
   Private Mover As Boolean = False
   Private p_Mouse As Point = Nothing

   Private Sub WebBrowser1_MouseDown( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) _
           Handles WebBrowser1.MouseDown

       Me.Cursor = Cursors.Hand
       Mover = True
       ' guarda rl el x e y donde se hizo clic
       p_Mouse.X = e.X
       p_Mouse.Y = e.Y
   End Sub

   Private Sub WebBrowser1_MouseMove( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) _
       Handles WebBrowser1.MouseMove

       If Mover Then
           ' referencia al control
           Dim unControl As Control = CType(sender, Control)

           ' cambiar las coordenadas
           Dim p1 As Point = unControl.PointToScreen(e.Location)

           Dim p2 As Point = unControl.Parent.PointToClient(p1)

           ' asignar el left y el top - laposición del mouse donde se hizo clic
           unControl.Left = p2.X - p_Mouse.X
           unControl.Top = p2.Y - p_Mouse.Y

       End If

   End Sub

   Private Sub WebBrowser1_MouseUp( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) Handles WebBrowser1.MouseUp
       ' cambiar el  cursors
       Me.Cursor = Cursors.Default
       ' flag para mover el control
       Mover = False
   End Sub


Pero me sale este error, y no se porqué:



He estado buscando información, pero no he encontrado nada... Soy muy noob, o soy retarded xD

:-\ :-\




Lo mismo pasa si uso este code:

Código (vbnet) [Seleccionar]
    Dim oPoint As New System.Drawing.Point
    Dim posicionX, posicionY As Integer

    Private Sub WebBrowser1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles WebBrowser1.MouseDown
        If e.Button = MouseButtons.Left Then
            'resta la posición del control que manda a la posición de la forma...
            posicionX = Control.MousePosition.X - Me.Location.X
            'centro del control.
            posicionY = Control.MousePosition.Y - Me.Location.Y
        End If
    End Sub

    Private Sub WebBrowser1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles WebBrowser1.MouseMove
        If e.Button = MouseButtons.Left Then
            oPoint = Control.MousePosition
            oPoint.X -= (posicionX)
            oPoint.Y -= (posicionY)
            Me.Location = oPoint
            My.Settings.Save()
        End If
    End Sub

Interesados hablad por Discord.

Eleкtro

#1
Me gustaría citarte algo que te dije, pero para lo que me va a servir...

Lee los eventos disponibles del webbrowser, ¿Ves alguno que se llame MouseMove, MouseDown, o MouseUp?, No Seazoux, no todos los controles tienen los mismos eventos.

Es más, con haber invertido 10 segundos para leer el mensaje de la excepción, habrías leido lo mismo que te acabo de explicar.

Código (vbnet) [Seleccionar]
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       WebBrowser1.Navigate("http://google.com")
   End Sub

   Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
       Dim document As HtmlDocument = WebBrowser1.Document
       AddHandler document.Body.MouseDown, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseDown)
   End Sub

   Private Sub WebBrowser1_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
       If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Left Then
           MsgBox("Botón izquiero presionado")
       End If
   End Sub








z3nth10n

#2
Hombre soy muy newbie y esos errores son nuevos, así que no se que hacer al respecto... Seguramente, la próxima vez no tenga que preguntar nada.
PD: De los errores se aprende...

Otro error:

CitarError   2   Method 'Private Sub WebBrowser1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs)' does not have a signature compatible with delegate 'Delegate Sub HtmlElementEventHandler(sender As Object, e As System.Windows.Forms.HtmlElementEventArgs)'.   C:\Users\Alvaro\Documents\IkillLauncher\IkillLauncher\frmMain.vb   31   83   IkillLauncher

A mi el error que me pongas me suena a chino, habrá que ir aprendiendo de donde salen. Soy primerizo...

PD: Voy a intentar entender algo:

does not have a signature compatible with delegate

no tiene una firma compatible con el delegado

Quien es el delegado? xD

PD: Soy muy lioso...

Un saludo.  ;)




Ahhhh Vale... xD No se a lo que se refería cuando decía que El evento MouseMove no es válido para este control ActiveX




CitarExamine the corresponding parameters and, if they are present, return types to determine which pair is not compatible.

Interesados hablad por Discord.

kub0x

Te vendría bien leer acerca del Framework de .NET. En tu error se ve claramente que la firma del delegado y la del método no coinciden.

El delegado lo utilizas al asociar el evento MouseDown al método WebBrowser1_MouseDown. ¿Qué significa éso? Qué estás asociando una acción sobre un método mediante un delegado, que no es más que un puntero seguro a una función (con puntero seguro me refiero a un puntero a bajo nivel utilizado para invocar funciones).

Vamos que cuando se produce ese evento tu llamas a dicha función. Asegúrate de que las firmas de ambos coinciden y espero vayas adquiriendo conocimiento.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


z3nth10n

#4
Y como hago que las firmas coincidan? xD

Que son las firmas?

Lo del puntero seguro, el delegado, no me ha quedado muy claro...
Esto es mas difícil que vete tu a saber que cosa... xD




Esto es epico, si pongo este trozo de code:

 
    Private Sub WebBrowser1_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
        If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Left Then
            MsgBox("Botón izquiero presionado")
        End If


No me sale ningún error

:(

Interesados hablad por Discord.

Eleкtro

Perdona si te ha sentado un poco mal, pero me ha molestado bastante porque solo con leer ya se sabe lo que pasa, no hay que ser un experto en el tema, y yo no lo soy.

Saludos.








Eleкtro

Cita de: Seazoux en 26 Mayo 2013, 18:54 PM
Y como hago que las firmas coincidan? xD

Que son las firmas?

Lo del puntero seguro, el delegado, no me ha quedado muy claro...
Esto es mas difícil que vete tu a saber que cosa... xD

Aunque no manejo mucho sobre delegados, si no recuerdo mal cuando sucede un evento se crea un delegado oculto automáticamente, y puedes acceder a el con un nombre especial dentro del sub, que no recuerdo como era el nombre.

Lo de "las firmas" se refiere al contenido que he marcado en rojo:

   Private Sub WebBrowser1_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)

  End Sub

...si tu cambias HtmlElementEventArgs por MouseEventArgs, no es compatible la firma, el evento no existe.








z3nth10n

#7
No me ha molestado, es más tu llevas razón... Soy fallos muy tontos los míos (bueno, en realidad, yo no me doy cuenta de que está mal, por que soy primerizo bablablablalblalbla), además de siempre como tu sabes, me ha gustado el código ya hecho...  :silbar:




Tengo que empollar mucho xD

Mirad lo que he hecho:

Código (vbnet) [Seleccionar]
   Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
       Dim document As HtmlDocument = WebBrowser1.Document
       AddHandler document.Body.MouseDown, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseDown)
       AddHandler document.Body.MouseUp, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseUp)
       AddHandler document.Body.MouseMove, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseMove)
   End Sub

   Private Sub WebBrowser1_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
       If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Left Then
           MsgBox("Botón izquiero presionado")
       End If
   End Sub

   Private Sub WebBrowser1_MouseUp(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
       If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Right Then
           MsgBox("Botón izquiero presionado")
       End If
   End Sub

   Private Sub WebBrowser1_MouseMove(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
       If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Middle Then
           MsgBox("Botón izquiero presionado")
       End If
   End Sub


No me sale ningún error hasta que pulso F5, y volvemos a lo mismo de antes.

http://i.imgur.com/d0kYE1V.png




LELELELELELELELEL!

He quitado este código, y ya si va...

Código (vbnet) [Seleccionar]
   Private Sub WebBrowser1_MouseDown( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) _
           Handles WebBrowser1.MouseDown

       Me.Cursor = Cursors.Hand
       Mover = True
       ' guarda rl el x e y donde se hizo clic
       p_Mouse.X = e.X
       p_Mouse.Y = e.Y
   End Sub

   Private Sub WebBrowser1_MouseMove( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) _
       Handles WebBrowser1.MouseMove

       If Mover Then
           ' referencia al control
           Dim unControl As Control = CType(sender, Control)

           ' cambiar las coordenadas
           Dim p1 As Point = unControl.PointToScreen(e.Location)

           Dim p2 As Point = unControl.Parent.PointToClient(p1)

           ' asignar el left y el top - laposición del mouse donde se hizo clic
           unControl.Left = p2.X - p_Mouse.X
           unControl.Top = p2.Y - p_Mouse.Y

       End If

   End Sub

   Private Sub WebBrowser1_MouseUp( _
       ByVal sender As Object, _
       ByVal e As System.Windows.Forms.MouseEventArgs) Handles WebBrowser1.MouseUp
       ' cambiar el  cursors
       Me.Cursor = Cursors.Default
       ' flag para mover el control
       Mover = False
   End Sub


Y si me salta en MouseMove, es porque algo hice mal... ;)

Voy a ver...




Estoy editando, con multiples comandos sacados de "por ahí"

Código (vbnet) [Seleccionar]
    Private Sub WebBrowser1_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
        If e.MouseButtonsPressed = MouseButtons.Left Then MoveForm = True : MoveForm_Mouse_Position = e.Location
    End Sub

    Private Sub WebBrowser1_MouseUp(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
        If MoveForm Then Me.Location = Me.Location + e.Location - MoveForm_Mouse_Position
    End Sub

    Private Sub WebBrowser1_MouseMove(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
        If e.Button = MouseButtons.Left Then MoveForm = False
    End Sub


Pero tengo varios errores:

CitarError   2   'Location' is not a member of 'System.Windows.Forms.HtmlElementEventArgs'.   C:\Users\Alvaro\Documents\IkillLauncher\IkillLauncher\frmMain.vb   40   103   IkillLauncher

CitarError   4   'Button' is not a member of 'System.Windows.Forms.HtmlElementEventArgs'.   C:\Users\Alvaro\Documents\IkillLauncher\IkillLauncher\frmMain.vb   48   12   IkillLauncher

Si entiendo lo que pone, pero no se como solucionarlo

Segun tu, el EventArgs no es compatible con el Snippet que tu me distes y a su vez e.* no es compatible con HtmlElementEventArgs, que hago?

Interesados hablad por Discord.

Eleкtro

@Seazoux
Dale a "copy exception to clipboard", y así lees la versión extendida, y ves lo que ocurre.

De todas formas quizás los tiros puedan ir por aquí:

Código (vbnet) [Seleccionar]
AddHandler document.Body.KeyPress, New HtmlElementEventHandler(AddressOf WebBrowser1_KeyPress)

Private Sub WebBrowser1_KeyPress(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
    If e.KeyPressedCode = Keys.A Then
        MsgBox("Tecla "A" pulsada")
    End If
End Sub


No he conseguido que funcione con las teclas "F", imagino que poque son especiales del control y... bueno, no sé como se hará la verdad.

Saludos








z3nth10n

#9
Cuando copio el error solo me sale Copy, y no me sale lo que tu dices... e.e

No se a lo mejor esta en otro lado...






Yo me he perdido, que puedo hacer al respecto, sobre el código...

Nuevo código más simplón:

Código (vbnet) [Seleccionar]
    <System.Runtime.InteropServices.DllImport("user32.DLL", EntryPoint:="ReleaseCapture")> _
    Private Shared Sub ReleaseCapture()
    End Sub

    <System.Runtime.InteropServices.DllImport("user32.DLL", EntryPoint:="SendMessage")> _
    Private Shared Sub SendMessage( _
            ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _
            ByVal wParam As Integer, ByVal lParam As Integer _
            )
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim document As HtmlDocument = WebBrowser1.Document
        AddHandler document.Body.MouseDown, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseDown)
        AddHandler document.Body.MouseUp, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseUp)
        AddHandler document.Body.MouseMove, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseMove)
    End Sub

    Private Sub moverForm()
        ReleaseCapture()
        SendMessage(Me.Handle, WM_SYSCOMMAND, MOUSE_MOVE, 0)
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
                Handles MyBase.MouseMove, WebBrowser1.MouseMove
        If e.Button = MouseButtons.Left Then
            moverForm()
        End If
    End Sub


Como siempre HtmlElementEventHandler y MouseEventArgs con conflictos... XD

Interesados hablad por Discord.