elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [Source]Menú con Imagenes
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Source]Menú con Imagenes  (Leído 3,897 veces)
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
[Source]Menú con Imagenes
« en: 19 Julio 2010, 09:39 am »

Este es un módulo clase que sirve para insertar imágenes en el menú, a diferencia del control de usuario HookMenu, este sólo requiere un simple módulo, quizás no cuente con una interfaz sencilla para insertar las imágenes ya que con este módulo tendremos que hacerlo mediante código.
Lo que intenté preservar es que el ícono no modifique el estilo visual de Windows, es decir, el menú no tendrá el aspecto de Office o Ribbon.
También cuenta con la posibilidad de agregarle imágenes a la barra de menú y a los menúes creados mediante Apis (CreatePopupMenu).
La clase soporta imágenes .png, .ico y todos los formatos estándar de imágenes. Este módulo sólo funcionará en Windows XP y posteriores, ya que las versiones anteriores no cuentan con GDI Plus.
En Windows XP el módulo necesita subclasificar la ventana que contiene o llama al menú, pero en Windows Vista y Windows 7 esto no es necesario ya que corrigieron el error que tenían los menúes con bitmaps.






Descarga

cualquier duda, sugerencia, o error reportar.

Mañana les traigo algo mejor  ;D


En línea

karmany
Colaborador
***
Desconectado Desconectado

Mensajes: 1.614


Sueñas que sueñas


Ver Perfil WWW
Re: [Source]Menú con Imagenes
« Respuesta #1 en: 19 Julio 2010, 15:51 pm »

Me parece un excelente código. Yo utilizo algo muy parecido al tuyo utilizando igualmente los mensajes WM_MEASUREITEM y WM_DRAWITEM que ya los había probado en Visual C++.
El que yo uso no utiliza gdi+.

Has hecho un buen trabajo, yo te recomendaría también que lo postees en codeproject o planetsource o similares ya que pienso que son grandes páginas de referencias a programadores.

Muchas gracias por compartir

PD. Leandro Ascierto... muy buena página.
Un saludo


« Última modificación: 19 Julio 2010, 15:58 pm por karmany » En línea

seba123neo
Moderador
***
Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: [Source]Menú con Imagenes
« Respuesta #2 en: 20 Julio 2010, 05:11 am »

expectacular opcion para usar iconos en los menues sin agregar un OCX externo, yo personalmnete uso el HookMenu, pero esta es una buena opcion, si no se quiere agregar el OCX.

Excelente Leandro !!  ;-)

saludos.
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [Source]Menú con Imagenes
« Respuesta #3 en: 20 Julio 2010, 08:50 am »

Como siempre gran trabajo Leandro :D ;)

Mod: He descubierto un pequeño problema, si debuggeas la función IsAlphaIcon() ocurre algo bastante extraño... cuando no estas debuggeando funciona a la perfección, en cambio al hacerlo se queda durante muchísimo tiempo encerrado en el bucle... no se muy bien a que se deberá ese error... (Testado en W$ XP SP3, VB6 SP6)
« Última modificación: 20 Julio 2010, 09:06 am por Karcrack » En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [Source]Menú con Imagenes
« Respuesta #4 en: 20 Julio 2010, 09:28 am »

@karcrack
Es un error? osea da error?
lo que haces como ultimo recurso (que no es muy elegante pero...) es recorrer el array de bits del bitmap del icono en busca de si algun bits es Alpha, a eso se deve un bucle tan grande.

Saludos.
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [Source]Menú con Imagenes
« Respuesta #5 en: 20 Julio 2010, 09:29 am »

perdon este es el fragmento

Código:
                                For lngY = 0 To tBitmapData.Height - 1
                                    For lngX = 0 To tBitmapData.Width - 1
                                   
                                        If tARGB(lngX, lngY).Alpha > 0 Then
                                            If tARGB(lngX, lngY).Alpha < 255 Then
                                           
                                                bolRet = True
                                                Exit For
                                               
                                            End If
                                        End If
                                       
                                    Next lngX

                                    If bolRet Then Exit For
                                   
                                Next lngY
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [Source]Menú con Imagenes
« Respuesta #6 en: 20 Julio 2010, 15:12 pm »

No, no hay ningun error en ese fragmento, simplemente al debuggear esa zona se queda en un bucle enooorme... Por lo visto falla alguna llamada a un API o algo :-\
En línea

F3B14N

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: [Source]Menú con Imagenes
« Respuesta #7 en: 22 Julio 2010, 06:22 am »

No mire en lo mas minimo el src, pero yo hacia lo mismo (creo) con este pequeño src:

Código:
Option Explicit

Private Declare Function GetMenu Lib "USER32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "USER32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function SetMenuItemBitmaps Lib "USER32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long

Const MF_BYPOSITION = &H400&

Public Sub SetMenuIcon(cForm As Form, cMenu As Long, cSubMenu As Long, cBitmap As ListImage)
    On Error Resume Next
    Dim hMenu As Long
    Dim hSubMenu As Long
    Dim Ret As Long
     
     hMenu = GetMenu(cForm.hwnd)
     hSubMenu = GetSubMenu(hMenu, cMenu)
     Ret = SetMenuItemBitmaps(hSubMenu, cSubMenu, MF_BYPOSITION, Val(cBitmap.Picture), Val(cBitmap.Picture))
     
End Sub

Algo que es muy bueno para mejorar GUIs seria hacer lo mismo en CommandButtons, por que VB lo admite, pero tienen que tener mucha .Height para que se vea y queda MUY molesto para la vista :-X en una de esas alguien sé idea como hacerlo  :silbar:

Salu2  :D

En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [Source]Menú con Imagenes
« Respuesta #8 en: 22 Julio 2010, 06:35 am »

para los botones y cosas asi como lo que son listbox botones etc... yo personalmentre me quedo con este Pack de CTL al estilo Vista xP

http://infrangelux.sytes.net/filex/?file=/BlackZeroX/Programacion/vb6/Controles%20de%20Usuario/Super%20SKIN%20Windows%20Vista%20And%20Seven/AeroSuite%20SKIN.zip&modo=2&dir=/BlackZeroX/Programacion/vb6/Controles%20de%20Usuario/Super%20SKIN%20Windows%20Vista%20And%20Seven&

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
karmany
Colaborador
***
Desconectado Desconectado

Mensajes: 1.614


Sueñas que sueñas


Ver Perfil WWW
Re: [Source]Menú con Imagenes
« Respuesta #9 en: 22 Julio 2010, 12:48 pm »

No mire en lo mas minimo el src, pero yo hacia lo mismo (creo) con este pequeño src:

Código:
Option Explicit

Private Declare Function GetMenu Lib "USER32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "USER32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function SetMenuItemBitmaps Lib "USER32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long

Const MF_BYPOSITION = &H400&

Public Sub SetMenuIcon(cForm As Form, cMenu As Long, cSubMenu As Long, cBitmap As ListImage)
    On Error Resume Next
    Dim hMenu As Long
    Dim hSubMenu As Long
    Dim Ret As Long
     
     hMenu = GetMenu(cForm.hwnd)
     hSubMenu = GetSubMenu(hMenu, cMenu)
     Ret = SetMenuItemBitmaps(hSubMenu, cSubMenu, MF_BYPOSITION, Val(cBitmap.Picture), Val(cBitmap.Picture))
     
End Sub

Algo que es muy bueno para mejorar GUIs seria hacer lo mismo en CommandButtons, por que VB lo admite, pero tienen que tener mucha .Height para que se vea y queda MUY molesto para la vista :-X en una de esas alguien sé idea como hacerlo  :silbar:

Salu2  :D



Existen muchísimos códigos (fuente) gratuitos para modificar o crear controles con la apariencia que uno quiera. Un ejemplo es el que te manda BlackZeroX con código fuente incluido.

Respecto a tu código, tu código tiene limitaciones. Por ejemplo las imágenes tienen que ser bmp(no sé si admitirá gif, etc...) y además para que se vean correctas, tienen que tener un tamaño máximo de 13 x 13 píxeles, si las pones de más se verán cortadas.
El código de Leandro, es un código que dibuja tu propio menú como tú quieras. Manejando correctamente los mensajes WM_MEASUREITEM y WM_DRAWITEM puedes crear menús personalizados.
Tu código lo utilicé en MASM32 y aunque deja bastante que desear, pues es muy rápido y sencillo:

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Como se hace un menú DE IMÁGENES colapsables?
.NET (C#, VB.NET, ASP)
Eleкtro 6 3,385 Último mensaje 4 Marzo 2013, 19:34 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines