May 102009
 

Esta es una Api que sirve para dibujar texto con una sombra difuminada al estilo Windows Vista, en el siguiente ejemplo he creado una pequeña función a modo de simplificarla un poco, pero esto depende del uso que se le quiera dar.
Lo malo de esta Api es que requiere que esté inicializada comctl32.dll, es decir, que tendremos que llamar a InitCommonControls y tener el archivo .manifest para que funcione, por lo tanto desde el IDE si no se tiene aplicado los temas de Windows en el VB6.EXE no se mostrará el dibujo del texto y además nos dará un error al llamar a esta Api, el cual lo podremos controlar con On Error, pero bien al compilarlo y teniendo el .manifest funcionará perfectamente.

Draw Shadow Text


Option Explicit

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

Private Declare Function OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function DrawText Lib "user32.dll" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, ByRef lpRect As RECT, ByVal wFormat As Long) As Long
Private Declare Function DrawShadowText Lib "comctl32.dll" (ByVal hdc As Long, ByVal lpStr As Long, ByVal nCount As Long, lpRect As RECT, ByVal dwFlags As Long, ByVal crText As Long, ByVal crShadow As Long, ByVal ixOffset As Long, ByVal iyOffset As Long) As Long
Private Declare Function TranslateColor Lib "olepro32.dll" Alias "OleTranslateColor" (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
Private Const DT_CALCRECT As Long = &H400

Public Function DrawTextShadow (DestDC As Long, Text As String, ByVal x As Long, ByVal y As Long, TextColor As OLE_COLOR, ShadowColor As OLE_COLOR, Optional OffsetX As Long = 1, Optional OffsetY As Long = 1) As Boolean

    On Error Resume Next     	'Si no incluye el archivo .manifest el api DrawShadowText provoca un error

    Dim Color1 As Long
    Dim Color2 As Long
    Dim Rec As RECT

    TranslateColor TextColor, 0, Color1
    TranslateColor ShadowColor, 0, Color2

    DrawText DestDC, Text, Len(Text), Rec, DT_CALCRECT
    OffsetRect Rec, x, y

    If Color1 = 0 Then Color1 = 1
    ' El quinto parámetro es la alineación, en este caso 0 = izquierda, 1 centrado, 2 derecha
    DrawTextShadow = DrawShadowText(DestDC, StrPtr(Text), Len(Text), Rec, 0, Color1, Color2, OffsetX, OffsetY)
    ' Esta función podría ser modificada en caso de el api DrawShadowText diera error, podría ser suplementada con DrawText

End Function

Private Sub Form_Initialize()
    InitCommonControls
End Sub

Private Sub Form_Load()

    Me.AutoRedraw = True
    Me.Font.Size = 8

    If DrawTextShadow(Me.hdc, "Hola Mundo", 10, 10, vbBlack, vbRed) = False Then
        MsgBox "Para probar este ejemplo debe compilar este proyecto y agregar un archivo Proyecto1.exe.manifest", vbInformation
    End If

    Me.Font.Size = 12
    DrawTextShadow Me.hdc, "Hola Mundo", 10, 30, vbBlue, vbRed
    Me.Font.Size = 32
    Me.Font.Name = "Times New Roman"
    DrawTextShadow Me.hdc, "Hola Mundo", 10, 50, vbGreen, vbMagenta
    DrawTextShadow Me.hdc, "Hola Mundo", 10, 90, Me.BackColor, vbBlue
    Me.FontBold = True
    DrawTextShadow Me.hdc, "Hola" & vbCrLf & "Mundo", 10, 130, vbWhite, vbBlack, 3, 3
End Sub

Private Sub Timer1_Timer()
    Picture1.Cls
    DrawTextShadow Picture1.hdc, Now, 5, 0, &H333333, &H80000005
End Sub

 Publicado por a las 23:51
May 082009
 

Ejemplo:

A continuación se encuentra un ejemplo sencillo que les enseñará cómo aplicar dichos Skins a un formulario, además se mostrarán las propiedades y funciones con las que cuenta.
Nota: Es aconsejable implementarlo cuando estemos por compilar y no cuando estemos construyendo algún proyecto ya que de haber algún error este podría provocar el cierre de Visual Basic y no nos permitirá guardar los cambios de nuestro proyecto.

Option Explicit

' Declaramos cSkin como la clase ClsSkinner.
 Dim cSkin As ClsSkinner

Private Sub Form_Load()

' Creamos e inicializamos a cSkin
 Set cSkin = New ClsSkinner

' Esto es si queremos que el área del cliente se pinte con el tema del skin.
 ' Ojo!! esto hará que los controles Labels, Image, Shapes y Line que estén directamente sobre el formuario no se muestren.
 ' En el caso que no querramos que esto pase lo dejamos = False.
 cSkin.PaintClientArea = True

' Indicamos el path donde debe leer el archivo.Skin
 cSkin.LoadSkinFromFile App.Path & "\Comander.Skin"

' Si quisiéramos leer el Skin desde un archivo de recursos llamamos a la función. LoadSkinFromResource
 ' Donde 101 es el index y "SKIN" es la sección.
 cSkin.LoadSkinFromResource 101, "SKIN"

' Aplicamos el Skin a nuestro Formulario.
 cSkin.HookForm Me.hwnd

End Sub

Private Sub Form_Unload(Cancel As Integer)

' Detenemos la Sublcasificación.
 cSkin.UnHookForm Me.hwnd

' Descargamos la clase de la memoria
 Set cSkin = Nothing

End Sub

 Publicado por a las 15:57  Tagged with:
May 082009
 

Editor de Skins para Formularios:

Este es el editor anteriormente mencionado, bien no voy a dar muchos detalles por el momento, después voy a crear una pagina donde voy a dar una explicación más detallada.
En el link de descarga van a encontrar un archivo .zip con el ejecutable, este no tiene dependencias por lo tanto no requiere instalación.

Skins para Formularios (Editor)

May 082009
 

Módulo ClsSkinner:

Este es un módulo clase llamado ClsSkinner, el cual sirve para cambiar el aspecto de nuestros formularios, no necesita ningún OCX o DLL y su implementación es muy sencilla, los skin los carga desde unos archivos de extensión «.Skin» los cuales también se puede guardar en archivos de recursos para luego ser implementados.
En esta versión sólo cambia el aspecto de los formularios y barra de menús, para los PopUpMenú solamente le he implementado la opción de cambiarle el color de fondo, también se les puede aplicar a formularios MDI y a todas las ventanas dentro de la instancia de nuestra aplicación que posean bordes.
Para la próxima versión (si Dios quiere), tengo pensado implementárselo a los controles, pero bien es una idea  muy a futuro.Estas son algunas capturas de muestra, en el ejemplo que voy a poner a continuación existen estos dieciséis Skins en los cuales he utilizado partes de otros programas similares (pagos y de código cerrado), estos skin los pueden crear ustedes mismos con un editor que es exclusivo para este módulo clase.

Skins para Formularios

 Publicado por a las 12:29  Tagged with:
May 072009
 

Se trata de dos proyectos para enviar capturas de una webcam a través de los Socket, es decir, podrás enviar capturas de una webcam por internet en una conexión Cliente-Servidor, ambos trabajan con la clase CSocket y no dependen del Winsock.ocx, las capturas son comprimidas a .JPG con la clase cJpeg y no dependen de GDI+, si ejecuta el servidor éste se ejecutará de manera oculta, por lo que sólo podrán cerrarlo con el Cliente desde el administrador de tareas, el Cliente cuenta con dos opciones para elegir el tamaño y calidad de la captura (mientras más bajos sean estos valores más rápido será la transferencia), también posee una barra de progreso que muestra el envió de cada captura.

Webcam

 Publicado por a las 23:34  Tagged with:
May 042009
 

Este es un módulo bas que sirve para que nuestra aplicación se inicie junto con Windows, no es nada novedoso, modifica las claves del registro mediante Apis.
Cuenta con dos funciones:
SetAutoRun: Con un parámetro Boolean, si éste es verdadero ancla nuestra aplicación al inicio, de lo contrario la quita, la función debería retornarnos un valor verdadero si es que todo salió bien.
IsAutoRun: Devuelve «true» si nuestra aplicación ya está en el inicio

Option Explicit

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long
Private Declare Function RegDeleteKey& Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String)
Private Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
Private Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long
Private Declare Function RegDeleteValue& Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String)

Private Const RAMA_RUN_WINDOWS As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Const HKEY_CURRENT_USER = &H80000001
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_USERS = &H80000003
Private Const REG_SZ As Long = 1
Private Const KEY_ALL_ACCESS = &H3F

Public Function SetAutoRun(Value As Boolean) As Boolean 
    Dim Path          As String
    Dim Handle        As Long 
    Path = Chr(34) & App.Path & "\" & App.EXEName & ".exe" & Chr(34) 
    RegOpenKeyEx HKEY_CURRENT_USER, RAMA_RUN_WINDOWS, 0, KEY_ALL_ACCESS, Handle
    If Value Then
        SetAutoRun = RegSetValueExString(Handle, App.Title, 0&, REG_SZ, Path, Len(Path)) = 0
    Else
        SetAutoRun = RegDeleteValue(Handle, App.Title) = 0
    End If
    RegCloseKey Handle 
End Function

Public Function IsAutoRun() As Boolean 
    Dim Path          As String
    Dim Handle        As Long
    Dim Data          As String
    Dim cch           As Long 
    Path = Chr(34) & App.Path & "\" & App.EXEName & ".exe" & Chr(34) 
    RegOpenKeyEx HKEY_CURRENT_USER, RAMA_RUN_WINDOWS, 0, KEY_ALL_ACCESS, Handle
    RegQueryValueExNULL Handle, App.Title, 0&, 0&, 0&, cch

    If cch > 0 Then
        Data = String(cch - 1, 0)
        RegQueryValueExString Handle, App.Title, 0&, 0&, Data, cch
        IsAutoRun = Path = Data
    End If 
    RegCloseKey Handle 

End Function

May 042009
 

Este es un módulo con una función para implementar los diferentes gráficos de la Api Google Char en Visual Basic, quizás no tenga mucho sentido ya que dependemos de una conexión a internet y descargamos la imágen desde una web, lo cual ya requiere de un cierto tiempo, pero bueno siempre puede llegar a ser útil en estos casos.
Junto al proyecto de descarga hay cinco ejemplos muy sencillos y un editor en Flash que nos podrá ayudar mucho, primeramente a entender esta api y luego cómo manejar sus parámetros.
Para saber más acerca de cómo utilizar esta api pueden visitar esta Web, donde explica en detalle cada uno de los parámetros.
Los gráficos a continuación son directamente generados por Google Char.

Grafico de linea

Grafico de linea

Grafico de linea

 Publicado por a las 22:46  Tagged with: