Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Clase Mensajes

Iniciado por Hechelion, 02 de Febrero de 2009, 08:08:40 PM

« anterior - próximo »

Hechelion

Buenas, en la medida de lo posible iré colocando algunas clases que he creado para la librería, no son muchas pero algo es algo.
Código (vb) [Seleccionar]

''/***************************************************************
'*
'* Proyecto dx_lib32 2.2 -
'* Clase Lista de mensaje (MsgList)
'*
'* Requiere la dependendica a la libreria dx lib32 2.2.0
'*
'* Santiago de Chile Octubre 2008
'* Hechelion (Alberto Ortiz Barrera)
'*
'***************************************************************/

'/***************************************************************
'*
'* el alpfa se entrega como un porcentaje (0-100) con la propiedad opacidad
'* Por defecto se dibuja un cuadrado negro
'* Se a agregado una segunda opacidad (OpacidadSec) que se puede activar con
'* al tener el mouse encima o con al ganar foco
'*
'***************************************************************/

'/***************************************************************
'*
'* Prefijos:
'* p = privado
'* n = Nuevo
'* r = Referencia
'*
'* Sufijos
'* D = Dimención, utilizado para estructuras GFX_Rect
'*
'***************************************************************/
Option Explicit

Public Enum EnumTransparenciaCMsgList
    Msg_none = 0
    Msg_Only_Cursor = 1
    Msg_Only_Focus = 2
    Msg_Focus_OR_Cursor = 3
End Enum
'**********************************************************************
'Eventos
'**********************************************************************
Public Event Click()
Public Event GotFocus()
Public Event LostFocus()
Public Event GotCursor()
Public Event LostCursor()

'**********************************************************************
'variables privadas
'**********************************************************************
'Clases de la libreria dx_lib32.DLL
Dim p_gfx As dx_GFX_Class 'Referencia a la clase dx_GFX:
Dim p_Input As dx_Input_Class 'Referencia a la clase dx_Input.
Dim p_System As dx_System_Class 'Referencia a la clase dx_System

Dim Lista() As String 'Lista de cadenas de texto
Dim ListaDraw() As String 'Lista de la parte visible de las cadenas

Dim pOpacidad As Integer 'Opacidad
Dim pOpacidadSec As Integer 'Opacidad secundaria
Dim AlphaActual As Integer
Dim AlphaFinal As Integer

'Dim AltoTexto As Long 'alto en pixel asignados a una cadena
Dim pFont As Long 'referencia a la fuente a utilizar
Dim MaxLineas As Integer 'número total de lineas visibles dado el alto del marco
Dim Linea1 As Integer 'indice del array para la primera línea visible
Dim BordeSuperior As Long 'Margen superior entre texto y el borde del control
Dim BordeInferior As Long 'Margen inferior entre texto y el borde del control
Dim BordeDerecho As Long 'Margen inferior entre texto y el borde del control, el borde izquierdo es controlado por la variable Sangria
Dim AutoAjuste As Boolean

Dim DibujarAscensor As Boolean
Dim AscensorValor As Integer
Dim AscensorMax As Integer

Dim MarcoD As GFX_Rect 'Dimenciones del rectangulo que contiene el mensaje
Dim MarcoTextoD As GFX_Rect 'Dimenciones del rectangulo interno que contiene el texto
Dim AscensorD(2) As GFX_Rect 'Dimenciones de los rectangulos que dibujan el ascensor
Dim pfoco As Boolean
Dim pFocoPrevio As Boolean
Dim pCursorSobre As Boolean
Dim pCursorSobrePrevio As Boolean

Dim Left_Click_ant As Boolean

'Contenedores de las referencias de las imagenes utilizadas
Dim rEsquina1 As Long
Dim rBordeH As Long
Dim rBordeV As Long
Dim rFondo As Long

Dim HayEsquina1 As Boolean
Dim HayBordeH As Boolean
Dim HayBordeV As Boolean
Dim HayFondo As Boolean

Dim InfoEsquina1 As GFX_Info
Dim InfoBordeH As GFX_Info
Dim InfoBordeV As GFX_Info

'**********************************************************************
'Propiedades
'**********************************************************************
Public Visible As Boolean 'propiedad que determina si se debe o no dibujar el control
Public UseTransparency2 As EnumTransparenciaCMsgList

'Public BackRed As Integer 'Componente rojo del color de fondo
'Public BackGreen As Integer 'Componente verde del color de fondo
'Public BackBlue As Integer 'Componente azul del color de fondo
Public Zbuffer As Long
Public BorderColor As Long
Public BackColor As Long

Public FontColor As Long
Public Sangria As Long 'margen izquierdo entre texto y borde del control

Public ForceTransparency2 As Boolean 'Orden para forzar a segunda transparencia sin importar la condición

Public Property Let Top_Margin(nMargenSuperior As Long)
BordeSuperior = nMargenSuperior
Redimencionar
End Property
Public Property Get Top_Margin() As Long
Top_Margin = BordeSuperior
End Property
Public Property Let Low_Margin(nMargenInferior As Long)
BordeInferior = nMargenInferior
Redimencionar
End Property
Public Property Get Low_Margin() As Long
Low_Margin = BordeInferior
End Property
Public Property Let Left_Margin(nSangria As Long)
Sangria = nSangria
Redimencionar
End Property
Public Property Get Left_Margin() As Long
Left_Margin = Sangria
End Property

Public Property Let Right_Margin(nMargin As Long)
BordeDerecho = nMargin
End Property

Public Property Get Right_Margin() As Long
Right_Margin = BordeDerecho
End Property


Public Property Let AutoFitText(nAutoAjuste As Boolean)
AutoAjuste = nAutoAjuste
Comprobar_Ancho
End Property
Public Property Get AutoFitText() As Boolean
AutoFitText = AutoAjuste
End Property

'Obtener porcentaje de Opacidad
Public Property Let Transparency(nOpacidad As Integer)
pOpacidad = (Saturar(100 - nOpacidad, 0, 100) * 255 / 100)
End Property
Public Property Get Transparency() As Integer
Transparency = 100 - pOpacidad * 100 / 255
End Property

'Obtener porcentaje de Opacidad Secundaria
Public Property Let Transparency2(nOpacidad As Integer)
pOpacidadSec = (Saturar(100 - nOpacidad, 0, 100) * 255 / 100)
End Property
Public Property Get Transparency2() As Integer
Transparency2 = 100 - pOpacidadSec * 100 / 255
End Property

Public Property Let Focus(nFoco As Boolean)
pfoco = nFoco
End Property

Public Property Get Focus() As Boolean
Focus = pfoco
End Property


'Propiedad Font
Public Property Let Font(nFont As Long)
pFont = nFont 'obtener la referencia a la fuente cargada en memoria
'Calcular área visible a partir de la nueva fuente
'AltoTexto
Comprobar_Alto
Comprobar_Ancho
End Property
Public Property Get Font() As Long
Font = pFont
End Property

'PROPIEDADES POSCISIÓN
'Alto
Public Property Let Height(nHeight As Long)
MarcoD.Height = nHeight
Redimencionar
End Property
Public Property Get Height() As Long
Height = MarcoD.Height
End Property
'Ancho
Public Property Let Width(nWidth As Long)
MarcoD.Width = nWidth
Redimencionar
End Property
Public Property Get Width() As Long
Width = MarcoD.Width
End Property
'Posión X LEFT
Public Property Let Left(nLeft As Long)
MarcoD.X = nLeft
Redimencionar
End Property
Public Property Get Left() As Long
Left = MarcoD.X
End Property
'Posición Y TOP
Public Property Let Top(nTop As Long)
MarcoD.Y = nTop
Redimencionar
End Property
Public Property Get Top() As Long
Top = MarcoD.Y
End Property

'Propiedades de gráficos
'Gráfico 1 para la esquina
Public Property Let Map_Corner(nEsquina1 As Long)
rEsquina1 = nEsquina1
HayEsquina1 = True
Call p_gfx.MAP_GetInfo(rEsquina1, InfoEsquina1)
End Property
Public Property Get Map_Corner() As Long
Map_Corner = rEsquina1
End Property

'Gráfico borde
Public Property Let Map_BorderH(nBorde As Long)
rBordeH = nBorde
HayBordeH = True
Call p_gfx.MAP_GetInfo(rBordeH, InfoBordeH)
End Property
Public Property Get Map_BorderH() As Long
Map_BorderH = rBordeH
End Property

'Gráfico borde
Public Property Let Map_BorderV(nBorde As Long)
rBordeV = nBorde
HayBordeV = True
Call p_gfx.MAP_GetInfo(rBordeV, InfoBordeV)
End Property
Public Property Get Map_BorderV() As Long
Map_BorderV = rBordeV
End Property

'Gráfico fondo
Public Property Let Map_Picture(nPicture As Long)
rFondo = nPicture
HayFondo = True
End Property
Public Property Get Map_Picture() As Long
Map_Picture = rFondo
End Property

'Forzar foco
Public Property Let Foco(nFoco As Boolean)
pfoco = nFoco
End Property

Public Property Get Foco() As Boolean
Focus = pfoco
End Property


'**********************************************************************
'Procedimientos Privados
'**********************************************************************
Private Sub Class_Initialize()

pOpacidad = 128
pOpacidadSec = 255
Sangria = 10
BordeSuperior = 10
BordeInferior = 10
BordeDerecho = 40
AlphaActual = pOpacidad
FontColor = &HFFFFFF
Visible = True
AutoAjuste = True

ReDim Lista(0)
ReDim ListaDraw(0)
Limpiar_Lista
End Sub

Private Sub Limpiar_Lista()
Dim i As Integer
For i = 0 To UBound(Lista)
    Lista(i) = ""
    ListaDraw(i) = ""
Next
End Sub

Private Function Saturar(ByVal Valor As Integer, ByVal Min As Integer, ByVal Max As Integer) As Integer
Saturar = Valor
If Valor < Min Then Saturar = Min
If Valor > Max Then Saturar = Max
End Function

Private Sub Alto_Texto()
'AltoTexto = p_gfx.FONT_SystemGetTextHeight(pFont, "Tgj" & vbCrLf & "Hola") + 2
End Sub

Private Sub Redimencionar()
Dim nHeight As Long
Dim nWidth As Long

MarcoTextoD.X = MarcoD.X + Sangria
MarcoTextoD.Y = MarcoD.Y + BordeSuperior

'comprobar si existe cambio en la altura del marco para minimizar el número de llamados a calculos de texto visible
nHeight = MarcoD.Height - BordeSuperior - BordeInferior
If nHeight <> MarcoTextoD.Height And nHeight > 10 Then
    MarcoTextoD.Height = nHeight
    Comprobar_Alto
End If

'comprobar si existe cambio en el ancho del marco para minimizar el número de llamados a calculos de texto visible
nWidth = MarcoD.Width - Sangria - BordeDerecho 'Se reservan 40 pixel al lado derecho para dibujar el ascensor
If nWidth <> MarcoTextoD.Width And nWidth > 10 Then
    MarcoTextoD.Width = nWidth
    Comprobar_Ancho
End If

'Dimensionar ascensor
AscensorD(0).X = MarcoD.X + MarcoD.Width - 35
AscensorD(0).Y = MarcoTextoD.Y
AscensorD(0).Width = 20
AscensorD(0).Height = 30
AscensorD(1).X = AscensorD(0).X
AscensorD(1).Y = MarcoTextoD.Y + AscensorD(0).Height
AscensorD(1).Width = 20
AscensorD(1).Height = MarcoTextoD.Height - 60
AscensorD(2).X = AscensorD(0).X
AscensorD(2).Y = AscensorD(1).Y + AscensorD(1).Height
AscensorD(2).Width = 20
AscensorD(2).Height = 30


End Sub

Private Sub Comprobar_Alto() 'Comprueba la cantidad de líneas que se pueden visualizar
Dim i As Integer
Dim Cadena As String
Dim gato As Integer

i = 0
Cadena = "Tgj"
Do While MarcoTextoD.Height > p_gfx.FONT_SystemGetTextHeight(pFont, Cadena) + 2
    Cadena = Cadena & vbCrLf & "Tgj"
    i = i + 1
Loop
MaxLineas = i
End Sub

Private Sub Comprobar_Ancho() 'Reviza toda la lista ListaDraw a partir del ancho actual
Dim i, e As Integer
Dim Cadena As String

For i = 0 To UBound(Lista)
    Cadena = Lista(i)
    Do While p_gfx.FONT_SystemGetTextWidth(pFont, Cadena) >= MarcoTextoD.Width
        Cadena = Mid(Cadena, 1, Len(Cadena) - 1)
    Loop
    ListaDraw(i) = Cadena
Next
End Sub

'**********************************************************************
'Procedimientos Publicos
'**********************************************************************
Public Sub Iniciar(Tgfx As dx_GFX_Class, Tinput As dx_Input_Class, TSystem As dx_System_Class, TFont As Long, Optional Theigth As Long, Optional TWidth As Long, Optional TTop As Long, Optional TLeft As Long)
'asignar clases externas
Set p_gfx = Tgfx
Set p_Input = Tinput
Set p_System = TSystem
pFont = TFont
'asignar valores
If Theigth > 0 Then Height = Theigth
If TWidth > 0 Then Width = TWidth
Top = TTop
Left = TLeft
End Sub

Public Sub Draw()
Dim i As Integer
Dim Posy As Long
Dim PartX As Long
Dim PartY As Long
Dim Cadena As String
Dim LineasDraw As Integer
Dim TempColor As Long

If Visible Then
    'dibujar fondo del control
    If HayFondo Then
        TempColor = p_gfx.ARGB_Set(AlphaActual, 255, 255, 255)
        Call p_gfx.DRAW_MapEx(rFondo, MarcoD.X, MarcoD.Y, Zbuffer, MarcoD.Width, MarcoD.Height, 0, Blendop_Color, TempColor, Mirror_None, Filter_None, False)
    Else
        TempColor = p_gfx.ARGB_Set(AlphaActual, (BackColor And &HFF0000) / 65536, (BackColor And &HFF00&) / 256, (BackColor And &HFF))
        Call p_gfx.DRAW_Box(MarcoD.X, MarcoD.Y, MarcoD.Width + MarcoD.X, MarcoD.Height + MarcoD.Y, Zbuffer, TempColor, True, TempColor)
    End If
   
   
    'Dibujar esquinas, si corresponde
    TempColor = p_gfx.ARGB_Set(AlphaActual, 255, 255, 255)
    If HayEsquina1 Then
        Call p_gfx.DRAW_MapEx(rEsquina1, MarcoD.X, MarcoD.Y, Zbuffer, InfoEsquina1.Image_Width, InfoEsquina1.Height, 0, Blendop_Color, TempColor, Mirror_None, Filter_None, False)
        Call p_gfx.DRAW_MapEx(rEsquina1, MarcoD.X + MarcoD.Width - InfoEsquina1.Image_Width, MarcoD.Y, Zbuffer, InfoEsquina1.Image_Width, InfoEsquina1.Height, 0, Blendop_Color, TempColor, Mirror_Vertical, Filter_None, False)
        Call p_gfx.DRAW_MapEx(rEsquina1, MarcoD.X, MarcoD.Y + MarcoD.Height - InfoEsquina1.Height, Zbuffer, InfoEsquina1.Image_Width, InfoEsquina1.Height, 0, Blendop_Color, TempColor, Mirror_Horizontal, Filter_None, False)
        Call p_gfx.DRAW_MapEx(rEsquina1, MarcoD.X + MarcoD.Width - InfoEsquina1.Image_Width, MarcoD.Y + MarcoD.Height - InfoEsquina1.Height, Zbuffer, InfoEsquina1.Image_Width, InfoEsquina1.Height, 0, Blendop_Color, TempColor, Mirror_Both, Filter_None, False)
    End If
   
            'Dibujar bordes si corresponde
    If HayBordeH Then
        Call p_gfx.DRAW_MapEx(rBordeH, MarcoD.X + InfoEsquina1.Width, MarcoD.Y, Zbuffer, MarcoD.Width - 2 * InfoEsquina1.Width, InfoBordeH.Height, 0, Blendop_Color, TempColor, Mirror_None, Filter_None, False)
        Call p_gfx.DRAW_MapEx(rBordeH, MarcoD.X + InfoEsquina1.Width, MarcoD.Y + MarcoD.Height - InfoBordeH.Height, Zbuffer, MarcoD.Width - 2 * InfoEsquina1.Width, InfoBordeH.Height, 0, Blendop_Color, TempColor, Mirror_None, Filter_None, False)
    End If
   
    If HayBordeV Then
        Call p_gfx.DRAW_MapEx(rBordeV, MarcoD.X, MarcoD.Y + InfoEsquina1.Height, Zbuffer, InfoBordeV.Width, MarcoD.Height - 2 * InfoEsquina1.Height, 0, Blendop_Color, TempColor, Mirror_None, Filter_None, False)
        Call p_gfx.DRAW_MapEx(rBordeV, MarcoD.X + MarcoD.Width - InfoBordeV.Width, MarcoD.Y + InfoEsquina1.Height, Zbuffer, InfoBordeV.Width, MarcoD.Height - 2 * InfoEsquina1.Height, 0, Blendop_Color, TempColor, Mirror_None, Filter_None, False)
    End If

   
    'Dibujar texto
    LineasDraw = UBound(ListaDraw)
    If LineasDraw > MaxLineas Then LineasDraw = MaxLineas
    For i = 1 To LineasDraw
        Cadena = Cadena & ListaDraw(i + AscensorValor) & vbCrLf
    Next
    TempColor = p_gfx.ARGB_Set(AlphaActual, (FontColor And &HFF0000) / 65536, (FontColor And &HFF00&) / 256, (FontColor And &HFF))
    Call p_gfx.DRAW_Text(pFont, Cadena, MarcoTextoD.X, MarcoTextoD.Y, Zbuffer, TempColor, Align_Left)

   
    'dibujar ascensor si corresponde
    If DibujarAscensor Then
    TempColor = p_gfx.ARGB_Set(AlphaActual, (BorderColor And &HFF0000) / 65536, (BorderColor And &HFF00&) / 256, (BorderColor And &HFF))
    For i = 0 To 2
        Call p_gfx.DRAW_Box(AscensorD(i).X, AscensorD(i).Y, AscensorD(i).X + AscensorD(i).Width, AscensorD(i).Y + AscensorD(i).Height, Zbuffer, TempColor, False) 'dibujar borde
    Next
    Dim Posiy As Long
    Dim AltoY As Long
    Posiy = ((AscensorD(1).Height / (AscensorMax + 1)) * AscensorValor) + AscensorD(1).Y
    AltoY = (AscensorD(1).Height / (AscensorMax + 1))
    Call p_gfx.DRAW_Box(AscensorD(1).X + 2, Posiy, AscensorD(1).X + AscensorD(1).Width - 2, Posiy + AltoY, Zbuffer, TempColor, True, TempColor) 'dibujar valor
    End If
End If
End Sub

Public Sub AddItem(ByVal Linea As String)
Dim i, e, o As Integer
Dim Cadenas() As String

Cadenas = Split(Linea, vbCrLf) 'detectar y agregar multiples linea en un sólo llamado
For e = 0 To UBound(Cadenas)
    'Agregar nueva linea a la lista
    ReDim Preserve Lista(UBound(Lista) + 1)
    ReDim Preserve ListaDraw(UBound(ListaDraw) + 1)
   
    i = UBound(Lista)
    Lista(i) = Cadenas(e) 'asignar string a buffer interno
   
    'comprobar tamaño del string dibujado contra los margenes del control y almacenar el buffer para dibujo de fuente
    Do While p_gfx.FONT_SystemGetTextWidth(pFont, Cadenas(e)) >= MarcoTextoD.Width
        Cadenas(e) = Mid(Cadenas(e), 1, Len(Cadenas(e)) - 1)
    Loop
    ListaDraw(i) = Cadenas(e)
   
    If i > MaxLineas Then
        DibujarAscensor = True
        AscensorMax = i - MaxLineas
    End If
Next
End Sub

Public Sub Clear()

ReDim Lista(0)
ReDim ListaDraw(0)
DibujarAscensor = False

End Sub

Public Sub Input_()
Dim Left_click As Boolean

'si el ratón esta sobre el marco
If p_System.MATH_PointInRect(p_Input.Mouse.X, p_Input.Mouse.Y, MarcoD) Then

    'corregir opacidad actual si el cursor pasa encima del marco
    If UseTransparency2 = Msg_Only_Cursor Or UseTransparency2 = Msg_Focus_OR_Cursor Then AlphaActual = pOpacidadSec
   
    'Detectar foco
    If p_Input.Mouse.Left_Button Then
        pfoco = True
    End If
   
    If pfoco And (UseTransparency2 = Msg_Focus_OR_Cursor Or UseTransparency2 = Msg_Only_Focus) Then AlphaActual = pOpacidadSec
   
    'Detectar ascensor
    If DibujarAscensor Then
        If Left_Click_ant = False And p_Input.Mouse.Left_Button Then 'detectar mouse_press
            If p_System.MATH_PointInRect(p_Input.Mouse.X, p_Input.Mouse.Y, AscensorD(0)) Then AscensorValor = Saturar(AscensorValor - 1, 0, AscensorMax) 'si se preciona subir
            If p_System.MATH_PointInRect(p_Input.Mouse.X, p_Input.Mouse.Y, AscensorD(2)) Then AscensorValor = Saturar(AscensorValor + 1, 0, AscensorMax) 'si se preciona bajar
        End If
        If p_Input.Mouse.Left_Button And p_System.MATH_PointInRect(p_Input.Mouse.X, p_Input.Mouse.Y, AscensorD(1)) Then 'si se preciona el cuerpo del ascensor
            AscensorValor = ((p_Input.Mouse.Y - AscensorD(1).Y) / (AscensorD(1).Height / AscensorMax))
        End If
            'Llamar a función externa de click sólo si preciona sobre el área de texto
        If p_System.MATH_PointInRect(p_Input.Mouse.X, p_Input.Mouse.Y, MarcoTextoD) And p_Input.Mouse.Left_Button And Left_Click_ant = False Then
            RaiseEvent Click
        End If
    Else
        If p_System.MATH_PointInRect(p_Input.Mouse.X, p_Input.Mouse.Y, MarcoD) And p_Input.Mouse.Left_Button And Left_Click_ant = False Then
            RaiseEvent Click
        End If
   
    End If
   
    pCursorSobre = True
Else
    If (Not (UseTransparency2 = Msg_Focus_OR_Cursor Or UseTransparency2 = Msg_Only_Focus)) Or pfoco = False Then AlphaActual = pOpacidad
    'Detectar foco
    If (p_Input.Mouse.Left_Button Or p_Input.Mouse.Right_Button) And Left_Click_ant = False Then pfoco = False
    pCursorSobre = False
End If

'pasar último valor de left click del mouse
Left_Click_ant = p_Input.Mouse.Left_Button


'Detectar foco y cursor sobre el control
If pFocoPrevio = False And pfoco = True Then RaiseEvent GotFocus
If pFocoPrevio = True And pfoco = False Then RaiseEvent LostFocus
If pCursorSobrePrevio = False And pCursorSobre = True Then RaiseEvent GotCursor
If pCursorSobrePrevio = True And pCursorSobre = False Then RaiseEvent LostCursor

pFocoPrevio = pfoco
pCursorSobrePrevio = pCursorSobre
End Sub

Hechelion

#1
ejemplos:

Para usar la clase es bastante sencillo, aquí les dejo un ejemplo

Código (vb) [Seleccionar]

Option Explicit

'Clases de la libreria dx_lib32.DLL
Dim m_gfx1 As dx_GFX_Class 'Referencia a la clase dx_GFX:
Dim m_Input1 As dx_Input_Class 'Referencia a la clase dx_Input.
Dim m_system As dx_System_Class
Dim Impact As Long

'Referencias a los gráficos utilizados
'para personalizar la clase MsgList
Dim Esquina1 As Long
Dim BordeH As Long
Dim BordeV As Long
Dim Fondo As Long


Dim MainLoop As Boolean

' Creamos el espacio en memoria para el control IMPORTANTE el WithEvents para poder llamar a los eventos
Dim WithEvents MsgPrincipal As CMsgList




Private Sub Form_Load()

Set m_gfx1 = New dx_GFX_Class 'Creamos la instancia de la clase dx_GFX:
Set m_Input1 = New dx_Input_Class 'Creamos la referencia a la clase dx_Input.
Set m_system = New dx_System_Class

'Creamos la referencia a nuestro control
Set MsgPrincipal = New CMsgList



'Inicializamos la clase y el modo de video a 800x600 en modo ventana:
Call m_gfx1.Init(Me.hWnd, 800, 600, , True)
Call m_Input1.Init(Me.hWnd) 'Inicializamos la clase dx_Input.
Impact = m_gfx1.FONT_LoadSystemFont("Lucida Console", 10, False, False, False, False)

Esquina1 = m_gfx1.MAP_Load(App.Path & "\esquina1.png", 0)
BordeH = m_gfx1.MAP_Load(App.Path & "\bordeH.png", 0)
BordeV = m_gfx1.MAP_Load(App.Path & "\bordev.png", 0)
Fondo = m_gfx1.MAP_Load(App.Path & "\fondo.png", 0)

'Inicializamos la clase de nuesto control IMPORTANTE, la clase se debe inicializar despues de inicializar
'Las clases gráficas y tener la fuente de texto cargada, si no, les marcara error
Call MsgPrincipal.Iniciar(m_gfx1, m_Input1, m_system, Impact, 300, 200, 100, 200)
'Personalizamos el control según nuestras necesidades
MsgPrincipal.UseTransparency2 = Msg_Focus_OR_Cursor
MsgPrincipal.Transparency = 50
MsgPrincipal.Transparency2 = 0
'MsgPrincipal.Map_Corner = Esquina1
'MsgPrincipal.Map_BorderH = BordeH
'MsgPrincipal.Map_BorderV = BordeV
MsgPrincipal.Map_Picture = Fondo
MsgPrincipal.BorderColor = &HFFFFFF
MsgPrincipal.FontColor = &HFF0000
MsgPrincipal.Top_margin = 30
MsgPrincipal.Low_margin = 22

'Le cargamos algunas lineas de texto
MsgPrincipal.AddItem "Hola mundo"
MsgPrincipal.AddItem "segunda linea con bastante letras para calcular el ancho"
MsgPrincipal.AddItem "3 linea"
MsgPrincipal.AddItem "4 linea"
MsgPrincipal.AddItem "5 linea"
MsgPrincipal.AddItem "6 linea"
MsgPrincipal.AddItem "7 linea"
MsgPrincipal.AddItem "8 linea"
MsgPrincipal.AddItem "9 linea"
MsgPrincipal.AddItem "10 linea"
MsgPrincipal.AddItem "11 linea"
MsgPrincipal.AddItem "12 linea"
MsgPrincipal.AddItem "13 linea"
MsgPrincipal.AddItem "14 linea"
MsgPrincipal.AddItem "15 linea"
MsgPrincipal.AddItem "16 linea"
MsgPrincipal.AddItem "17 linea"
MsgPrincipal.AddItem "18 linea"
MsgPrincipal.AddItem "19 linea"
MsgPrincipal.AddItem "20 linea"
MsgPrincipal.AddItem "21 linea"
MsgPrincipal.AddItem "22 linea"

'Call m_Sound.Init(Me.hWnd) 'Inicializamos la clase dx_Sound.
MainLoop = True 'Entrar al ciclo principal de dibujo del juego
Me.Show

'MsgPrincipal.BackColor = &HFF00&

Do While MainLoop

    If m_Input1.Key(Key_Escape) Then MainLoop = False
   
    Call m_gfx1.DRAW_Box(0, 0, 800, 600, 0, &HFFFF0000, True, &HFFAFAFAF)
   
    'Llamaos a la función de dibujo y a la de captura
    MsgPrincipal.Draw
    MsgPrincipal.Input_
   
    Call m_gfx1.Frame
Loop

'Descargamos los gráficos en memoria
Call m_gfx1.MAP_Unload(Esquina1)
Call m_gfx1.MAP_Unload(BordeH)
Call m_gfx1.MAP_Unload(BordeV)

'Finalizar clases Iniciadas de la libreria
Call m_gfx1.Terminate 'Terminamos la ejecucion de la clase:
Call m_Input1.Terminate 'Terminamos la ejecucion de la clase:
'Call m_Sound.Terminate 'Terminamos la ejecucion de la clase:
'Sonido_Habilitado = False

'Destrucción de clases
Set m_Input1 = Nothing 'Destruimos la instancia de la clase:
Set m_gfx1 = Nothing 'Destruimos la instancia de la clase:
'Set m_Sound = Nothing 'Destruimos la instancia de la clase:

Unload Me

End Sub


'Si dimencionamos con WithEvetens podemos programas algunos eventos comunes del control como click
Private Sub MsgPrincipal_Click()
MsgPrincipal.Clear
End Sub

Private Sub MsgPrincipal_GotFocus()
MsgBox "SetFocus"
End Sub

Private Sub MsgPrincipal_LostFocus()
MsgBox "LostFocus"
End Sub

Private Sub MsgPrincipal_GotCursor()
MsgBox "SetCursor"
End Sub

Private Sub MsgPrincipal_LostCursor()
MsgBox "LostCursor"
End Sub


un par de cosas importantes es declarar la clase con "WithEvents" de esa forma pueden agregar en el formulario principal código asociado a los eventos click, setfocus, lostfocus, setcursor, lostcursor como muestra el ejemplo.
lo segundo es que cuando inicien la clase, ya deben tener cargadas las fuentes y las clases de las librerias.

Hechelion

#2
Crear un pequeño menú con el botón derecho



Definimos los espacios de memoria
Código (vb) [Seleccionar]

Option Explicit

'Clases de la libreria dx_lib32.DLL
Dim m_gfx As dx_GFX_Class 'Referencia a la clase dx_GFX:
Dim m_Input As dx_Input_Class 'Referencia a la clase dx_Input.
Dim m_Sound As dx_Sound_Class 'Referencia a la calse dx_Sound.
Dim m_system As dx_System_Class 'Referencia a la clase dx_system

'Espacio asignado a Controles
Public WithEvents MarcoMenu As CMsgList
Public WithEvents BtnProduccion As CMsgList
Public WithEvents BtnPoder As CMsgList
Public WithEvents BtnCristales As CMsgList

Dim BtnMenuCompra As Long



'inicializamos
Código (vb) [Seleccionar]

Private Sub Form_Load()

Set m_gfx = New dx_GFX_Class 'Creamos la instancia de la clase dx_GFX:
Set m_Input = New dx_Input_Class 'Creamos la referencia a la clase dx_Input.
Set m_Sound = New dx_Sound_Class 'Creamos la referencia a la clase dx_Sound:
Set m_system = New dx_System_Class 'Creamos la referencia a la clase dx_System

'Creamos la referencia a los controles
Set MarcoMenu = New CMsgList
Set BtnProduccion = New CMsgList
Set BtnPoder = New CMsgList
Set BtnCristales = New CMsgList



'Inicializamos la clase y el modo de video a 800x600 en modo ventana:
Call m_gfx.Init(Me.hWnd, 800,600, , True)
Call m_Input.Init(Me.hWnd) 'Inicializamos la clase dx_Input.
Call m_Sound.Init(Me.hWnd) 'Inicializamos la clase dx_Sound.

Impact3 = m_gfx.FONT_LoadSystemFont("Impact2", 10, False, False, False, False)
BtnMenuCompra = m_gfx.MAP_Load(App.Path & "\Recursos\botonmenucompra.png", 0)

'cargar cuadros para menú derecho de compra de mejoras
With MarcoMenu
Call .Iniciar(m_gfx, m_Input, m_system, Impact3, 100, 188, 0, 0)
.UseTransparency2 = Msg_Only_Cursor
.Transparency = 50
.Transparency2 = 0
.BackColor = &HFF101010
.Zbuffer = -3
.Visible = False
End With

With BtnProduccion
Call .Iniciar(m_gfx, m_Input, m_system, Impact3, 26, 180, MarcoMenu.Top + 4, MarcoMenu.Left + 4)
.UseTransparency2 = Msg_Only_Cursor
.Transparency = 50
.Transparency2 = 0
.Map_Picture = BtnMenuCompra
.BackColor = &HFFAAAAAA
.Left_Margin = 5 'es necesario ajustar todos los margenes, pues por defecto la clase tiene margenes bastante generosos
.Top_Margin = 4
.Low_Margin = 0
.Right_Margin = 4
.Zbuffer = -4
.Visible = False
End With

With BtnPoder
Call .Iniciar(m_gfx, m_Input, m_system, Impact3, 26, 180, MarcoMenu.Top + 34, MarcoMenu.Left + 4)
.UseTransparency2 = Msg_Only_Cursor
.Transparency = 50
.Transparency2 = 0
.Map_Picture = BtnMenuCompra
.BackColor = &HFFAAAAAA
.Left_Margin = 5
.Top_Margin = 4
.Low_Margin = 0
.Right_Margin = 4
.Zbuffer = -4
.Visible = False
End With

With BtnCristales
Call .Iniciar(m_gfx, m_Input, m_system, Impact3, 26, 180, MarcoMenu.Top + 64, MarcoMenu.Left + 4)
.UseTransparency2 = Msg_Only_Cursor
.Transparency = 50
.Transparency2 = 0
.Map_Picture = BtnMenuCompra
.BackColor = &HFFAAAAAA
.Left_Margin = 5
.Top_Margin = 4
.Low_Margin = 0
.Right_Margin = 4
.Zbuffer = -4
.Visible = False
End With

Do While MainLoop

    Entrada

    MarcoMenu.Draw
    BtnProduccion.Draw
    BtnPoder.Draw
    BtnCristales.Draw

     MarcoMenu.Input_
    BtnProduccion.Input_
    BtnPoder.Input_
    BtnCristales.Input_

    'Ejecutamos las llamadas de la clase grafica:
    Call m_gfx.Frame

Loop



'descargamos la memoria
Call m_gfx.MAP_Unload(BtnMenuCompra) 'Descargar imagen botón menú compra

'Finalizar clases Iniciadas de la libreria
Call m_gfx.Terminate 'Terminamos la ejecucion de la clase:
Call m_Input.Terminate 'Terminamos la ejecucion de la clase:
Call m_Sound.Terminate 'Terminamos la ejecucion de la clase:


end sub

Private sub Entrada
            If m_Input.Mouse_Hit(Right_Button) Then
                MarcoMenu.Top = .Mouse.Y - 5
                If .Mouse.Y >= 510 Then MarcoMenu.Top = 510
                MarcoMenu.Left = .Mouse.X - 5
                BtnProduccion.Top = MarcoMenu.Top + 4
                BtnProduccion.Left = MarcoMenu.Left + 4
                BtnPoder.Top = MarcoMenu.Top + 34
                BtnPoder.Left = MarcoMenu.Left + 4
                BtnCristales.Top = MarcoMenu.Top + 64
                BtnCristales.Left = MarcoMenu.Left + 4
               
                BtnProduccion.Clear
                BtnProduccion.AddItem "Subir Naves: 10 de Cristal"
                BtnPoder.Clear
                BtnPoder.AddItem "Subir Poder: 100 de Cristal"
                BtnCristales.Clear
                BtnCristales.AddItem "Subir Cristal: 20 de Cristal"
               
                MarcoMenu.Visible = True
                BtnProduccion.Visible = True
                BtnPoder.Visible = True
                BtnCristales.Visible = True
            End If
end sub

Private Sub MarcoMenu_LostCursor()
    MarcoMenu.Visible = False
    BtnProduccion.Visible = False
    BtnPoder.Visible = False
    BtnCristales.Visible = False
End Sub


[EX3]

#3
Wow! Los primeros recursos/tutoriales para la libreria  :)_ Weno, en verdad creo que estos no son los primeros ya que recuerdo que RobiHm hizo unos controles de GUI hace unos meses y que tengo pendiente de subir igualmente ^_^'

Cuando termine el ejemplo/tutorial de las animaciones que estoy preparando para LucifersAngel aprovecho y subo lo tuyo tambien a la futura y sin estrenar area de recursos de la seccion de descargas ;)

Salu2 y gracias!
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

Documentación de la clase

Eventos
Click() -> se activa cuando se hace clic izquierdo sobre cualquier parte de la ventana de menú desplegada
GotFocus() -> se activa cuando la ventana obtiene el foco
LostFocus() -> se activa cuando la ventana pierde el foco
GotCursor() -> se activa cuando el cursor pasa del área fuera de la ventana al área ocupada por la ventana
LostCursor() -> se activa cuando el cursos deja el área ocupada por la ventana.

Propiedades


Visible -> determina si se visualiza o no el menú, un menú invisible no ejecuta el método input_

UseTransparency2 -> determina cuando el menú debe utilizar el valor de transparencia2 en lugar del valor de transparencia por defecto, puede tomar los valores:
    Msg_none = 0 -> que nunca utilice el valor de transparencia2
    Msg_Only_Cursor = 1 -> se utiliza el valor de transparencia2 si el cursos está sobre el área del menú
    Msg_Only_Focus = 2 -> sólo si el menú tiene le foco
    Msg_Focus_OR_Cursor = 3 -> si tiene el foco o el cursor está sobre el menú

ForceTransparency2 -> fuerza al menú a usar el segundo valor de transparencia independiente de la opción anterior.

Zbuffer -> idéntico al utilizado por la clase gfx

BorderColor -> color del borde si no se utilizan mapas

BackColor -> color del fondo del menú si no se utilizan mapas

FontColor -> Color del texto

Sangria -> margen izquierdo entre el borde del menú y el lugar donde se dibuja el texto.

Top_Margin ->  margen superior entre el borde del menú y el lugar donde se dibuja el texto.

Low_Margin -> margen inferior entre el borde del menú y el lugar donde se dibuja el texto

Right_Margin -> margen derecho entre el borde del menú y el lugar donde se dibuja el texto

Left_Margin -> idem a Sangria

AutoFitText -> indica si el texto se auto ajusta al ancho del menú

Transparency -> valor entre 0% y 100% de transparencia que tendrá por defecto el menú.

Transparency2 -> valor alternativo de transparencia

Focus -> indica si el menú tiene el foco o no.

Font -> referencia a la fuente (LONG)

Height -> alto del menú en pixel

Width -> ancho del menú en pixel

Left -> posición del menú

Top -> posición del menú

Map_Corner -> referencia al mapa utilizado en las 4 esquinas del menú

Map_BorderH -> referencia al mapa utilizado en los bordes horizontales del menú

Map_BorderV -> Referemcoa al mapa utilizado por los bordes verticales del menú

Map_Picture -> referencia al mapa utilizado en el cuerpo del menú (no es obligatorio utilizar todos los mapas, se puede crear un menú sólo con un mapa)

Procedimiento

Iniciar(
Tgfx As dx_GFX_Class, -> referencia a la clase GFX
Tinput As dx_Input_Class, -> referencia a la clase input
TSystem As dx_System_Class, -> referencia a la clase system
TFont As Long, -> referencia a la fuente del texto
Optional Theigth As Long, -> alto del menú
Optional TWidth As Long, -> ancho del menú
Optional TTop As Long, -> posición Y
Optional TLeft As Long) -> posición X
-> se utiliza para iniciar el menú y pasar las referencias a las clases de la libreria Dx32 necesarias

Draw() ->se utiliza para que se dibuje el menú

AddItem(
ByVal Linea As String) -> cadena de texto a agregar
-> se utiliza para agregar lineas de texto al menú

Clear() -> limpia todas las cadenas de texto agregas al menú

Input_() -> activa la lógica que detecta el teclado y el mouse sobre el menú






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.