Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: seba123neo en Febrero 15, 2010, 11:47:18 am

Título: Pequeña duda ComboBoxEx
Publicado por: seba123neo en Febrero 15, 2010, 11:47:18 am
Hola tengo una pequeña duda al usa el metodo ImageListLoadIconFromResource en este control, como parametro
pide la seccion pero ya he probado un monton de variantes y no logro cargar un icono desde el recurso, y como el ejemplo no vino
con algun ejemplo de cargar desde un recurso, pense que no estaba funcionando este metodo, siempre el hIcon me devuelve 0.
¿ que puede ser ?
   
Saludos.
Título: Re:Pequeña duda ComboBoxEx
Publicado por: LeandroA en Febrero 15, 2010, 03:38:47 pm
hola Seba lo que pasa es que tiene que estar compilado, porque intermanemte hace esto

hicon = LoadImage(App.hInstance, Section, IMAGE_ICON, mIconWidth, mIconHeight, LR_SHARED Or LR_LOADMAP3DCOLORS)

y bien LoadImage con App.hInstance funciona solo compilado.

prodria haver utilizado LoadResData + CreateIconFromResourceEx,  pero bueno era mas simple la primera

y bueno suponiendo que tenes un icono en el recursos con el nombre ICON_0

ComboBoxEx1.ImageListLoadIconFromResource "ICON_0"

Saludos.
Título: Re:Pequeña duda ComboBoxEx
Publicado por: seba123neo en Febrero 15, 2010, 05:29:50 pm
gracias por responder, si me imagine algo de que tenia que ser compilado...ahora trate de adaptarlo con CreateIconFromResourceEx ¿ te acordas que use esta api en la otra pregunta de los iconos que se descoloreaban ? bueno eso funcionaba perfecto, ahora trate de adaptarlo y me quedo asi:

Código: [Seleccionar]
Public Function ImageListLoadIconFromResource(ByVal Section As String) As Boolean
    Const ICRESVER As Long = &H30000
    Const LR_DEFAULTSIZE As Long = &H40

    Dim bData() As Byte
    Dim dwOffset As Long, dwSize As Long
    Dim Index As Long
   
    Index = 0
    bData() = LoadResData(101, "Custom")
    dwSize = VarPtr(bData(16& * Index + 14&))
    dwOffset = VarPtr(bData(bData(16& * Index + 18&)))

    Dim hicon As Long
    'hicon = LoadImage(App.hInstance, Section, IMAGE_ICON, mIconWidth, mIconHeight, LR_SHARED Or LR_LOADMAP3DCOLORS)
    hicon = CreateIconFromResourceEx(ByVal dwOffset, ByVal dwSize, 1, ICRESVER, 0&, 0&, LR_DEFAULTSIZE)

    If hicon Then
        ImageListLoadIconFromResource = Me.ImageListAddIcon(hicon)
        DestroyIcon hicon
    End If
End Function

las constantes ya se que queda feo ahi metidas en el sub..pero es para que se vea nomas despues las saco...

el tema que funciona perfecto en tiempo de ejecucion y me muestra la sombra..al compilarlo, tambien funciona perfecto y me saca la sobra y me toma la transparencia bien...pero hay algo que esta mal...si comparas el icono origal de 32x32 no lo toma tal cual..tiene unas pequeñas inperfecciones con respecto al original...¿ que sera ? algun flag que me estoy comiendo a la api ? ...todo esto es asi porque tengo un proyecto grande que tarda minutos en compilar y no puedo estar compilando y probando a cada rato...necesito verlo como queda en tiempo de ejecución...aunque me aparesca la sobra en tiempo de ejecucion eso no importa..total yo se que se sale al compilar..pero necesito verlo.

saludos.
Título: Re:Pequeña duda ComboBoxEx
Publicado por: LeandroA en Febrero 15, 2010, 08:54:10 pm
Hola Seba no entendi mucho lo de la sombra, suponiendo que tomas en cuenta los temas de xp, para que no se vean las transparencias negras en los iconos.

en cuanto a la funcion yo la haria diferente, te cuento porque, digamos que no calcula cual es el icono mas adecuado a leer, y de hay que se pueda mostrar algo defectuso, ademas no se si ago algo mal yo pero no funciona cuando index es > 0.

yo usaria la funcion LoadIconFromStream (Es la que utilize en insertar imagenes PNG en un imagelist) esta calcula el icono más adecuado para las dimenciones del imagelist

La función quedaria asi:

Citar
Public Function ImageListLoadIconFromResource(ByVal ResIndex As Variant, ByVal ResSection As Variant, Optional VBglobal As IUnknown) As Boolean
 
    Dim bvData()    As Byte
    Dim oVBglobal   As VB.Global
    Dim hIcon As Long
   
    On Local Error GoTo Err_Handler

    If oVBglobal Is Nothing Then
        Set oVBglobal = VB.Global
    ElseIf TypeOf oVBglobal Is VB.Global Then
        Set oVBglobal = VBglobal
    ElseIf VBglobal Is Nothing Then
        Set oVBglobal = VB.Global
    End If

    bvData() = oVBglobal.LoadResData(ResIndex, ResSection)

    hIcon = LoadIconFromStream(bvData, mIconWidth, mIconHeight)

    If hIcon Then
        ImageListLoadIconFromResource = Me.ImageListAddIcon(hIcon)
        DestroyIcon hIcon
    End If
   
Err_Handler:
End Function

por las dudas tene cuidado con la declaracion de CreateIconFromResourceEx fijate que esta declarada distinta.

Saludos.

Título: Re:Pequeña duda ComboBoxEx
Publicado por: seba123neo en Febrero 16, 2010, 11:01:18 am
Leandro gracias  ;), ahora ya no muestra ese defecto, el icono lo muestra perfecto  ;D...pero ahora encontre un problema que es del ejemplo original que capas no te diste cuenta , pero es que cada vez que moves el mouse sobre los items, los iconos se van como repintando uno arriba del otro (como pasaba con los widget ¿te acordas?) se ve que se va repintando la imagen cada vez que pasas el mouse,pero si moves la rueda del mouse desaparece y se actualiza y vuelve todo ok, pero queda feo porque se va acumulando una sobra negra en las imagenes, repito esto pasa en el ejemplo original.

saludos y gracias.
Título: Re:Pequeña duda ComboBoxEx
Publicado por: LeandroA en Febrero 16, 2010, 06:26:16 pm
Hola seba no caia cua era el problema despues mi di cuenta que es porque el imagelist tiene que tener un backcolor

te doy un ejemplo fuera del usercontrol sino aplicando el codigo desde el formulario

Declaras estas dos apis
Citar
Private Declare Function ImageList_SetBkColor Lib "comctl32.dll" (ByVal himl As Long, ByVal clrBk As Long) As Long
Private Declare Function OleTranslateColor Lib "olepro32.dll" (ByVal OLE_COLOR As Long, ByVal hPalette As Long, pccolorref As Long) As Long

y luego de crear el imagelist (CreateImageList )
Citar
Dim lColor As Long
   
ComboBoxEx2.CreateImageList 32, 32
   
OleTranslateColor vbWindowBackground, 0, lColor
ImageList_SetBkColor ComboBoxEx2.hImageList, lColor

con eso se soluciona el problema.

Saludos.
Título: Re:Pequeña duda ComboBoxEx
Publicado por: seba123neo en Febrero 16, 2010, 06:41:58 pm
mira vos, funciono perfecto, lo puse en el usercontrol (despues que crea el Imagelist) y andubo joya.... y de paso en tiempo de ejecucion me toma la transparencia y todo...gracias por el tiempo...nos vemos...

saludos.