May 272009
 

Este es un Proyecto WidGet que nos permitirá utilizar cuatro escritorios a la vez, es una utilidad para aquellos que les gusta tener muchas ventanas abiertas al mismo tiempo, bien con esta aplicación podrán organizarse mejor ya que se podrá ocultar y mostrar las ventanas que deseen para cada escritorio.
Este proyecto utiliza una DLL no ActiveX la cual está embebida dentro de un archivo de recurso, es la encargada de provocar un hook para detectar cuando se hace Click en los menús de las ventanas externas, gran parte de este proyecto se lo debo a Cobein, autor de muchos módulos clases que utiliza este proyecto.

Nota: Si ejecutan el proyecto desde el IDE de Visual Basic no detengan la aplicación desde el Stop, den Click al icono que aparece junto a la hora de la barra de tareas y seleccionen la opción «Cerrar».

Sample thumbnail

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:
May 012009
 

Esta es una función simple para dibujar puntos sobre un Formulario, Picture Box o hdc, la función es rápida.

Draw Grip

Option Explicit

'=========GDI32 Api========
Private Declare Function CreateSolidBrush Lib "gdi32.dll" (ByVal crColor As Long) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd 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 SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function GetDCBrushColor Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function GetBkColor Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function SetPixelV Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CreatePatternBrush Lib "gdi32.dll" (ByVal hBitmap As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function GdiTransparentBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean

'============User32 Api===========
Private Declare Function FillRect Lib "user32.dll" (ByVal hdc As Long, ByRef lpRect As RECT, ByVal hBrush As Long) As Long

'============Estructura Rect========
Private Type RECT
    Left                        As Long
    Top                         As Long
    Right                       As Long
    Bottom                      As Long
End Type

Public Function ShiftColor(ByVal clr As Long, ByVal d As Long) As Long
  Dim R As Long, B As Long, G As Long
    R = (clr And &HFF) + d
    G = ((clr \ &H100) Mod &H100) + d
    B = ((clr \ &H10000) Mod &H100) + d
    
    If (d > 0) Then
        If (R > &HFF) Then R = &HFF
        If (G > &HFF) Then G = &HFF
        If (B > &HFF) Then B = &HFF
    ElseIf (d < 0) Then
        If (R < 0) Then R = 0
        If (G < 0) Then G = 0
        If (B < 0) Then B = 0
    End If
    ShiftColor = R + &H100& * G + &H10000 * B
End Function

Public Sub DrawGrip(DestDC As Long, DestX As Long, DestY As Long, DestWidth As Long, DestHeight As Long)
    Dim DC                      As Long
    Dim hDCMemory               As Long
    Dim hBmp                    As Long
    Dim hOldBmp                 As Long
    Dim hBrush                  As Long
    Dim Rec                     As RECT
    Dim lOriginalColor          As Long
    Dim clrHighLight            As Long
    Dim clrShadow               As Long

    lOriginalColor = GetBkColor(DestDC)
    clrHighLight = ShiftColor(lOriginalColor, &H40)
    clrShadow = ShiftColor(lOriginalColor, -&H40)
    
    DC = GetDC(0)
    hDCMemory = CreateCompatibleDC(0)
    hBmp = CreateCompatibleBitmap(DC, 6, 6)
    hOldBmp = SelectObject(hDCMemory, hBmp)
          
    hBrush = CreateSolidBrush(lOriginalColor)
    SetRect Rec, 0, 0, 6, 6
    FillRect hDCMemory, Rec, hBrush
    DeleteObject hBrush
    
    SetPixelV hDCMemory, 2, 1, clrShadow
    SetPixelV hDCMemory, 1, 2, clrShadow
    SetPixelV hDCMemory, 2, 2, clrShadow
    
    SetPixelV hDCMemory, 0, 0, clrHighLight
    SetPixelV hDCMemory, 1, 0, clrHighLight
    SetPixelV hDCMemory, 0, 1, clrHighLight
    SetPixelV hDCMemory, 1, 1, clrHighLight
    
    SetPixelV hDCMemory, 5, 4, clrShadow
    SetPixelV hDCMemory, 4, 5, clrShadow
    SetPixelV hDCMemory, 5, 5, clrShadow
    
    SetPixelV hDCMemory, 3, 3, clrHighLight
    SetPixelV hDCMemory, 4, 3, clrHighLight
    SetPixelV hDCMemory, 3, 4, clrHighLight
    SetPixelV hDCMemory, 4, 4, clrHighLight
    
    hBrush = CreatePatternBrush(hBmp)
    SelectObject hDCMemory, hOldBmp
    DeleteObject hBmp
    hBmp = CreateCompatibleBitmap(DC, DestWidth, DestHeight)
    hOldBmp = SelectObject(hDCMemory, hBmp)
    SetRect Rec, 0, 0, DestWidth, DestHeight
    FillRect hDCMemory, Rec, hBrush
    
    GdiTransparentBlt DestDC, DestX, DestY, DestWidth, DestHeight, hDCMemory, 0, 0, DestWidth, DestHeight, lOriginalColor

    DeleteObject hBrush
    SelectObject hDCMemory, hOldBmp
    DeleteObject hBmp
    DeleteDC DC
    DeleteDC hDCMemory    
End Sub

Private Sub Form_Paint()
    DrawGrip Me.hdc, 0, 50, Me.ScaleWidth / Screen.TwipsPerPixelX, 9
    DrawGrip Me.hdc, 100, 59, 16, Me.ScaleHeight / Screen.TwipsPerPixelY - 59
End Sub								
 Publicado por a las 23:57  Tagged with:
May 012009
 

Este proyecto es algo similar al Widget del Tiempo pero mucho más sencillo, lo que hace es poner un ícono con el estado del tiempo de la localidad seleccionada en la Barra de Tareas y al pasar el mouse sobre éste se despliega una ventana tipo ToolTip con una información más detallada, tal como se aprecia en la imágen.
En este proyecto utilicé una clase (ClsXML) para parsear un XML que descarga de accuweather.com con la información del clima, agradezco a xKiz por ayudarme con este paso, no utilicé la referencia de Microsoft ya que éste aumentaba mucho más el tamaño de la memoria en el ejecutable.
Para cambiar de localidad sólo basta con hacer doble click sobre el ícono y se abrirá una ventana con las opciones de búsqueda, si hacen click derecho se despliega un menú con otras opciones.

Clima en la Barra de Tareas

May 012009
 

En realidad este no es un módulo, sino un formulario, el cual utiliza las Apis de Google SpellCheck, cuenta con varios idiomas y su uso es muy sencillo, sólo basta con una línea de código, en este proyecto/código no utilicé ninguna api, sólo la creación de algunos objetos (estos objetos ya están por defecto en Windows, por lo tanto no hay dependencias), obviamente requerimos de conexión a internet para que funcione.
Básicamente lo que hace es crear un XML y dentro del contenido de éste, el texto a corregir, se lo envía a Google en una petición de tipo POST y éste nos devuelve otro XML con las posibles sugerencias, del resto se encarga este formulario que va listando las sugerencias, reemplazando u omitiendo.
También cuenta con la posibilidad de agregar palabras a un diccionario, este no es más que un archivo de texto plano en el que se irán almacenando todas las palabras que agreguemos.

Corrector Ortográfico Google

 Publicado por a las 23:14  Tagged with: