Antes que nada quiero aclarar que este control está basado el proyecto Firenze Label, adaptado a GDI+ con muchos agregados ya que el anterior depende de vbRichClient5.
Tienen muchas propiedades y eventos que más adelante voy a ir detallando, por el momento voy a subir el control con unos cuantos ejemplos y otros controles que acompañan.
Se pueden lograr cosas muy lindas con este control, sólo es cuestion de ir jugando con sus propiedades, se puede crear muchos controles a partir de este label es cuestión de poner un poco de imaginación. Aclaro que no actúa como un control programado, es un label no un botón por lo que está en el desarrollador dar la forma en que se repinta el label cuando se dispara el mouse Down y Up y demás eventos.
Algunas capturas de lo que se puede lograr con el LabePlus
-------------------------------------------------------------------------------------------------------
Descargar la versión 1.5.4, ultima actualización 21/12/2021
Este proyecto se lo robe a mi amigo Coco y le hice un par de cambios que quede todo dentro del mismo UC, se trata de un user control para hacer una paleta de colores tal como muestra la imagen, este carga es una imagen png (de una paleta de colores), que puede ser leída desde disco o archivo de recurso (no lo carga en modo de diseño por ahorrar una ventana de propiedades.) al hacer clic en la paleta lanza un evento del color seleccionado, también cuenta con un evento que muestra el color donde pasa el cursor.
Se trata de un modulo clase que se encarga de simular una barra de titulo, lo que en realidad hace es eliminar la original y dibujar una personalizada en el área cliente (osea dentro del mismo formulario) la clase empezó un poco jugando luego fui modificando muchas cosas ,en un principio para dibujar los botones utilizaba los temas de windows (nada fácil ya que para pintar tal como se ven en la imagen había que hacer unas cuantas piruetas) luego decidí que era mas fácil utilizar métodos gráficos con GDI+ y hacerlos yo mismo, inclusive es mucho mas rápido así.
Seguramente quien vea la chorrera de código dirán para que tango lío, si sacando el borde del formulario ya esta, pero bien a mi gusto entre muchas otras cosas es preservar la sombra del formulario y otras cuestiones como que el usuario pueda cambiar el tamaño, simular a las aplicaciones que hay en el store de microsoft y etc etc.
bien las opciones del modulo es cambiar el color de la barra elegir si se quiere entre iconos y etiqueta blanca u oscura, y bien como ven en la imagen se puede agregar controles o dibujar sobre la barra, dentro del zip hay un ejemplo donde se muestra como hacerlo, las opciones son muchas es cuestión de que sepan aprovecharlas. si bien es compatible en windows XP y superiores, esta pensado para windows 10.
Actualizado 16/10/2018: ahora soporte para el escalado de DPI
Este código hace tiempo que había quedado pendiente en un hilo del foro por el amigo 79137913 el cual sirve para recuperar contraseñas guardadas en Windows 8 y posteriores, haciendo un breve resúmen en versiones anteriores Internet explorer (IE7) éste almacenaba sus contraseñas en el registro de windows, las cuales utilizando algunas apis de desencriptación se podían obtener todos los datos. Con la llegada de Windows 8 el sistema cambió y comenzaron a guardarlas en Windows Vault, si nos metemos desde el Administrador de credenciales podemos ver todas las contraseñas guardas con sus respectivos Usuarios y Url.
Me dió mucho trabajo poder traducir el código de C, ya que son todas apis indocumentadas y el manejo desde VB y los punteros a las estructuras es un tanto engorroso, pero tras prueba y error pude lograr recuperar las contraseñas.
Tanto I.Explorer como Microsoft Edge guardan las contraseñas en el mismo lugar con el mismo seudónimo (Intenet Explorer) (ya sabemos que ambos son la misma cosa).
El código se puede resumir si se quiere, pero traté de mantener todas las estructuras y enumeraciones para que sea más entendible su funcionamiento o poder usar otras funcionalidades de las credenciales.
(Aclaro esto sólo sirve en Windows 8 y posteriores, si bien las credenciales estaban disponibles en Windows 7, mi internet explorer no almacenaba sus contraseñas en vault, y si estoy equivocado es fácil corregir, sólo hay que verificar la versión de windows y cambiar la estructura según el S.O.).
Option Explicit Private Declare Function VaultOpenVault Lib "vaultcli.dll" (ByRef VaultGuid As GUID, ByVal dwFlags As Long, ByRef VaultHandle As Long) As Long Private Declare Function VaultCloseVault Lib "vaultcli.dll" (ByRef VaultHandle As Long) As Long Private Declare Function VaultEnumerateItems Lib "vaultcli.dll" (ByVal VaultHandle As Long, ByVal dwFlags As Long, ByRef ItemsCount As Long, ByRef Items As Long) As Long Private Declare Function VaultGetItem Lib "vaultcli.dll" (ByVal VaultHandle As Long, pSchemaId As GUID, ByVal pResource As Long, ByVal pIdentity As Long, ByVal pPackageSid As Long, ByVal hwndOwner As Long, ByVal dwFlags As Long, ppItem As Long) As Long Private Declare Function VaultFree Lib "vaultcli.dll" (ByVal ppItem As Long) As Long Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long Private Enum VAULT_SCHEMA_ELEMENT_ID ElementId_Illegal = 0 ElementId_Resource = 1 ElementId_Identity = 2 ElementId_Authenticator = 3 ElementId_Tag = 4 ElementId_PackageSid = 5 ElementId_AppStart = &H64 ElementId_AppEnd = &H2710 End Enum Private Enum VAULT_ELEMENT_TYPE ElementType_Boolean = 0 ElementType_Short = 1 ElementType_UnsignedShort = 2 ElementType_Integer = 3 ElementType_UnsignedInteger = 4 ElementType_Double = 5 ElementType_Guid = 6 ElementType_String = 7 ElementType_ByteArray = 8 ElementType_TimeStamp = 9 ElementType_ProtectedArray = 10 ElementType_Attribute = 11 ElementType_Sid = 12 ElementType_Last = 13 ElementType_Undefined = -1 End Enum Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type VAULT_VARIANT veType As VAULT_ELEMENT_TYPE Unknown As Long lpString As Long End Type Private Type VAULT_ITEM_ELEMENT SchemaElementId As VAULT_SCHEMA_ELEMENT_ID Unknown As Long ItemValue As VAULT_VARIANT End Type Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Type VAULT_ITEM_W8 SchemaId As GUID pszCredentialFriendlyName As Long pResourceElement As Long ' VAULT_ITEM_ELEMENT pIdentityElement As Long ' VAULT_ITEM_ELEMENT pAuthenticatorElement As Long ' VAULT_ITEM_ELEMENT pPackageSid As Long ' VAULT_ITEM_ELEMENT LastModified As FILETIME dwFlags As Long dwPropertiesCount As Long pPropertyElements As Long ' VAULT_ITEM_ELEMENT End Type Private Type VAULT_ITEM_W7 SchemaId As GUID pszCredentialFriendlyName As Long pResourceElement As Long ' VAULT_ITEM_ELEMENT pIdentityElement As Long ' VAULT_ITEM_ELEMENT pAuthenticatorElement As Long ' VAULT_ITEM_ELEMENT LastModified As FILETIME dwFlags As Long dwPropertiesCount As Long pPropertyElements As Long ' VAULT_ITEM_ELEMENT End Type Const WEB_CREDENTIALS As String = "{4BF4C442-9B8A-41A0-B380-DD4A704DDB28}" Const VAULT_ENUMERATE_ALL_ITEMS = 512 Public Function GetVaultCredentials() As String Dim tGUID As GUID Dim hVault As Long Dim ItemsCount As Long, i As Long Dim Items As Long Dim VI_W8() As VAULT_ITEM_W8 Dim dwError As Long Dim ppCredentials As Long 'VAULT_ITEM_W8 Dim tVIE As VAULT_ITEM_ELEMENT Dim sResult As String Dim tItemVault As VAULT_ITEM_W8 CLSIDFromString StrPtr(WEB_CREDENTIALS), tGUID If VaultOpenVault(tGUID, 0, hVault) <> 0 Then Exit Function Call VaultEnumerateItems(hVault, 0, ItemsCount, Items) ReDim VI_W8(ItemsCount - 1) CopyMemory VI_W8(0), ByVal Items, Len(VI_W8(0)) * ItemsCount For i = 0 To ItemsCount - 1 If VI_W8(i).dwPropertiesCount <> 0 Then dwError = VaultGetItem(hVault, VI_W8(i).SchemaId, VI_W8(i).pResourceElement, VI_W8(i).pIdentityElement, 0&, 0&, 0&, ppCredentials) If dwError = 0 Then sResult = sResult & "Account: " & PtrToString(VI_W8(i).pszCredentialFriendlyName) CopyMemory tVIE, ByVal VI_W8(i).pResourceElement, Len(tVIE) sResult = sResult & " URL: " & PtrToString(tVIE.ItemValue.lpString) CopyMemory tVIE, ByVal VI_W8(i).pIdentityElement, Len(tVIE) sResult = sResult & " User: " & PtrToString(tVIE.ItemValue.lpString) CopyMemory tItemVault, ByVal ppCredentials, Len(tItemVault) CopyMemory tVIE, ByVal tItemVault.pAuthenticatorElement, Len(tVIE) sResult = sResult & " Pass: " & PtrToString(tVIE.ItemValue.lpString) & vbCrLf VaultFree (ppCredentials) ppCredentials = 0 End If End If Next VaultCloseVault (hVault) GetVaultCredentials = sResult End Function Private Function PtrToString(lpwString As Long) As String Dim Buffer() As Byte Dim nLen As Long If lpwString Then nLen = lstrlenW(lpwString) * 2 If nLen Then ReDim Buffer(0 To (nLen - 1)) As Byte CopyMemory Buffer(0), ByVal lpwString, nLen PtrToString = Buffer End If End If End Function Private Sub Form_Load() Text1.Text = GetVaultCredentials End Sub
MSO UI Editor es una herramienta para personalizar la interfaz de usuario de Microsoft Office como ser la cinta Ribbon, Menu contextual entre otras, mediante el formato XML, es casi una copia del «Custom UI Editor For Microsoft Office» pero éste trae unas pequeñas mejoras.
En cuanto a la parte técnica, utilicé un OCX para la mayoría de controles y dos librerías para comprimir y descomprimir (Zlib32.dll), en la parte de «intellisense» me hubiera gustado utilizar los archivos .xsd para poder obtener los elementos, pero no pude descifrar cómo obtener los datos correctos así que utilicé archivos de texto plano con la información que recolecté en la web, aclaro intellisense no está preparado para lo que es la parte del Backstage (Menú Archivo) porque no encontré una documentación que lo explique bien, pero sí es posible programarlo.
Cuenta con un detector de errores en la formación del xml y utiliza .xsd que garantizan una mejor revisión. También genera automáticamente los Callbacks para los eventos en VBA, otra opción extra es que se puede buscar y reemplazar en el xml.
Me hubiera gustado poder armar algunos ejemplos pero me ganó el cansancio y opté por subir algunos que encontré en la web.
Aquí un ejemplo de cómo personalizar la cinta Fluent Ribbon en una planilla de Excel.
Captura del Editor
Cuenta con un control de errores en la formación del XML
Cuenta con intellisense para facilitar la formación del xml
Descargar el código fuente y la aplicación
Descargar sólo la aplicación
No se bien como se llama este juego, pero es un tanto adictivo, el juego original creo que esta programado en flash (aclaro este caso no es una película flash insertada en una hoja), está puramente programado con VBA, es bastante sencillo y de bajo presupuesto 🙂
El objetivo es poner las pelotitas azules de el lado azul y las rojas del lado rojo.
Este es un juego retro, muy conocido para aquellos que pisamos por arriba de los 30 años. En este juego se puso un poco en práctica jugar con colecciones de clases para poder mover varios objetos al mismo tiempo, no utilicé timer sino un bucle general ya que necesitaba más velocidad y probablemente en algunas pc se ejecute más rápido o más lento (queda muy justo para excel), en algunos bloques había utilizado el efecto bisel para los Shapes pero esto hace todo muy lento así que tuve que optar por un simple color degradado. El juego cuenta con audio y se puede jugar tanto con el teclado como con el mouse, los archivos de audio e imágenes de fondo están embebidos dentro del mismo documento. Sólo hice 15 niveles, los cuales están escritos en la Hoja2 (oculta).
VBA Resource File Editor es una Herramienta para añadir recursos a nuestros documentos de Office, vale decir que no necesitamos acompañar una carpeta con el contenido sino más bien podremos incluir el contenido dentro del mismo documento. Vale aclarar este contenido es sólo de lectura ya que cualquier cambio no se guarda dentro del documento cuando utilicemos las macros.
Ahora bien un poco de explicación de cómo funciona todo esto, los archivos de office tanto Excel como Word o Power Point no son otra cosa que Archivos.Zip que contienen documentos .xml y otro tipos de archivos, si uno inserta cualquier archivo dentro de este zip y lo registra en el xml correspondiente, Office lo conserva cada vez que el documento es modificado, así que mediante vba haciendo un par de piruetas podemos leer este contenido en tiempo de ejecución (todo esto es un tanto parecido a cómo se generan las cintas de ribbon personalizadas).
Espero que les sea de utilidad, dentro de la descarga encontrarán VBA Resource File Editor.xlsm con la ayuda y tres ejemplos.
Juego Rompecabezas en Excel y VBA, sencillo juego donde mas que nada es mostrar una técnica de como mover shapes con el mouse estando la hoja bloqueada y también como partir una imagen en varias partes.
Aclaro para todos estos juegos programados en vba y Excel se debe tener las Macros habilitadas.
Juego Truco, un clásico de la baraja española, el preferido de los Argentinos en este caso programado en Excel y VBA. En esta ocasión decidí no utilizar ninguna API de windows por dos motivos, uno no era necesario y otro por compatibilidad (he instalado la versión 2013 en win x64 y es un rollo diferente para los que estamos acostumbrados a las clásicas declaraciones de api).
En cuanto al código se me hizo muy extenso, pensé que iba a ser mas fácil pero me encontré con muchas condiciones lógicas para poder lograr jugar contra la PC. Hice dos versiones, una con una perspectiva superior y con la posibilidad de eligir entre cuatro contrincantes con distintos caracteres de juego, y la otra con una vista 3D intentando simular un ambiente lo más real posible, para ambas versiones si bien está la opción, me quedó pendiente el juego con «Flor».
Creo que como requisito mínimo es compatible con Excel 2007 y superiores.
Versión 3D
Solucionado el problema de Seguridad en Chrome, el motivo fue una de las descargas, uno de los zip contenía un ejecutable de un proyecto que era detectado como una amenaza en los antivirus de google.
Juego de ingenio «Senku» o «Uno Solo» en Excel y VBA, el juego consiste en ir eliminado fichas del tablero y dejar una sola en el centro, aquí en el link con las reglas y una mejor explicación.
Aclaro para todos estos juegos programados en vba y Excel se debe tener las Macros habilitadas.