Autor Tema: leer imagen desde un res  (Leído 11190 veces)

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

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #15 en: Marzo 26, 2014, 03:15:47 pm »
Maneja el evento MouseClick del UC, y dependiendo de las coordenadas, actua en consecuencia
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #16 en: Marzo 30, 2014, 08:03:18 pm »
y es posible crear una region en esa parte donde se pinta la imagen y
cada vez que se pasa el mouse cause algun evento....?


una region cuadrada por ejemplo cada vez que el mouse este en esa parte cuadrada del usercontrol
ocurra una accion, se podra hacer eso? usando alguna api
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #17 en: Marzo 30, 2014, 10:06:39 pm »
Lo mejor a mi parcer, es usar RECT, seguramente es mas rapido que crear una region y lo mismo para verificar si el mouse esta dentro de el RECT, asi que bien las apis a utilizar son:

PtInRect   (la cual te da si un punto esta dentro de un rectangulo)

luego dentro del timer como no tenes evento "x, y" usas GetCursorPos y ScreenToClient

en cuanto lo que preuntas si hay algun evento que haga esto, pues no, tenes que codificar todo, no hay una forma sensilla, pero bueno el codigo es un poco de logica, te paso un ejemplo bien completo, agrega un timer en un formulario.  (Después vos lo adaptas a tu usercontrol y con todos los chiches)

Código: (Vb) [Seleccionar]
Option Explicit
Private Declare Function PtInRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
Private Declare Function ScreenToClient Lib "user32.dll" (ByVal hwnd As Long, ByRef lpPoint As POINTAPI) As Long
Private Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer


Private Type POINTAPI
    X As Long
    Y As Long
End Type


Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

'solo para el ejemplo
Private Declare Function FillRect Lib "user32.dll" (ByVal hdc As Long, ByRef lpRect As RECT, ByVal hBrush As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32.dll" (ByVal crColor As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long


Dim m_RECT As RECT
Dim m_MouseIn As Boolean

Private Sub Form_Load()
    Me.ScaleMode = vbPixels
    Me.AutoRedraw = True

    SetRect m_RECT, Me.ScaleWidth - 48, 24, Me.ScaleWidth - 24, 48  'Asigno el rectangulo a la derecha de 24x24
    PintarRectangulo m_RECT, vbGreen 'lo pinto en un estado normal Verde
    Timer1.Enabled = False  'Seteo los datos para el timer
    Timer1.Interval = 100
End Sub



Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If PtInRect(m_RECT, X, Y) Then  'si esta dentro del rectangulo
        If m_MouseIn = False Then   'una bandera para que no se repita siempre este paso hasta que no salga el mouse (ver en el timer event)
            m_MouseIn = True
            Timer1.Enabled = True
            Debug.Print "Entra en el rectangulo"
            If (Button = vbLeftButton) Then 'boton izquierdo
                PintarRectangulo m_RECT, vbRed
            Else
                PintarRectangulo m_RECT, vbBlue  'esto es porque a veces el usuario pincha en el boton luego se arrepiente y despues vuelve sobre el boton. probar esto en cualquier boton.
            End If
        End If
    End If
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If (PtInRect(m_RECT, X, Y) = 1) And (Button = vbLeftButton) Then  'dos condiciones dentro del rectangulo y con el boton izquierdo.
        If m_MouseIn Then
            Debug.Print "MouseDown en el rectangulo"
            PintarRectangulo m_RECT, vbRed
        End If
    End If
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If (PtInRect(m_RECT, X, Y) = 1) And (Button = vbLeftButton) Then
        If m_MouseIn Then  'condiciones para decier que esto fue un click
            Debug.Print "Click en el rectangulo"
            PintarRectangulo m_RECT, vbBlue
        End If
    End If
End Sub

'Opcional, es en el caso que se hacen muchos click seguidos (no es el caso para un boton cerrar.)
Private Sub Form_DblClick()
    Dim PT As POINTAPI
    GetCursorPos PT
    ScreenToClient Me.hwnd, PT
    If (PtInRect(m_RECT, PT.X, PT.Y) = 1) And (GetKeyState(vbLeftButton) < 0) Then
        PintarRectangulo m_RECT, vbRed
        Debug.Print "MouseDown en el rectangulo 2"
    End If
End Sub

'Esto es la parte donde se controla si el mouse sale del rectangulo, el timer se habilita solo cuando el mouse habia entrado en el rectangulo. NO consume muchos recursos
Private Sub Timer1_Timer()
    Dim PT As POINTAPI
    GetCursorPos PT
    ScreenToClient Me.hwnd, PT

    If PtInRect(m_RECT, PT.X, PT.Y) = 0 Then 'no estan en el rectangulo entonces..
        Timer1.Enabled = False 'detengo el timer
        m_MouseIn = False   'cambio la bandera
        PintarRectangulo m_RECT, vbGreen 'restablesco el color del boton
        Debug.Print "Sale de el rectagulo"
    End If
End Sub



Private Sub Form_Resize()
    SetRect m_RECT, Me.ScaleWidth - 48, 24, Me.ScaleWidth - 24, 48  'muevo las nuevas cordenadas
    PintarRectangulo m_RECT, vbGreen
End Sub


'solo un ejemplo para pintar el rectangulo (si pasa el codigo a un user control cambia el me. por usercontrol.)
Private Sub PintarRectangulo(ByRef tRECT As RECT, oColor As OLE_COLOR)
    Dim hBrush As Long
    Me.Cls
    hBrush = CreateSolidBrush(oColor)
    FillRect Me.hdc, tRECT, hBrush
    DeleteObject hBrush
    Me.Refresh
End Sub


El uso del timer sea un control o por api a mi parecer es lo mejor, ya que se podría evitar, pero también podrían fallar algunos eventos.
« última modificación: Marzo 30, 2014, 10:18:47 pm por LeandroA »

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:leer imagen desde un res
« Respuesta #18 en: Marzo 30, 2014, 10:16:56 pm »
muchas gracias leandro.... voy aestudiarlo y a probarlo
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"