quinta-feira, 28 de junho de 2007

Imagens de fundo no Listview


Utilizando a API "SendMessage", você pode colocar imagens de fundo no Listview e oferecer uma interface mais amigável aos usuários dos seus aplicativos. Esse procedimento só possui um único inconveniente, que é a necessidade de informar o caminho completo do arquivo como parâmetro. Na imagem acima, um listview foi utilizado como "pano de fundo" do seletor principal de uma aplicação. Veja como fazer, passo-a-passo:

Defina o "call-convention" apropriado, na Special-Names:

special-names.
call-convention 66 is WAPI.

Defina as seguintes variáveis na Working-Storage Section:

Working-Storage Section.

01 handle pic 9(09) comp-5 value zeros.
01 OLEInitialize procedure-pointer.

01 pImage.
...02 flags pic 9(09) comp-5 value zeros.
...02 imageHandle pic 9(09) comp-5 value zeros.
...02 pszImage pointer.
...02 ImageMax pic 9(09) comp-5 value zeros.
...02 xOffset pic s9(09) comp-5 value zeros.
...02 yOffset pic s9(09) comp-5 value zeros.

01 ret pic 9(09) comp-5 value zeros.
01 bool pic 99 comp-5 value zeros.

78 LVM-SETBKIMAGE value 4164.
78 LVBKIF-SOURCE-URL value h"00000002".
78 LVBKIF-STYLE-TILE value h"00000010".

Crie um parâmetro na Linkage Section, que será utilizado apenas para inicializar a "OLE32.DLL", necessária para o carregamento da imagem:

Linkage Section.
77 lnkNulo pic x.
77 lnkImagem pic x(255).

Na Procedure Division, crie uma section para colocar a imagem no Listview:

SetarImagemListview section.
....set OLEInitialize to entry "ole32.dll"
....set address of lnkNulo to null
....call wapi "OleInitialize" using by reference lnkNulo returning ret
....invoke umListview "getSystemHandle" returning handle
....move 0 to ImageHandle
....move LVBKIF-SOURCE-URL to Flags
....add LVBKIF-STYLE-TILE to Flags
....move z"c:\imagem.jpg" to lnkImagem
....set pszImage to address of lnkImagem
....move 0 to xOffset yOffset
....call WAPI "SendMessageA" using by value handle
..............by value LVM-SETBKIMAGE
..............by value 0
..............by reference pImage
..............returning lsBool

5 comentários:

Waldir Franchi disse...

Como de costume os exemplos e dicas do Alexandre são perfeitos.
Neste caso, peguei o exemplo, usei no meu sistema e funcionou corretamente. Dedicação e profissionalismo. Parabens.

Bruno disse...

Olá, sou um iniciante no Cobol e estou tendo uma certa dificuldade e gostaria de um ajuda.
Existe forma de colocar cores nas colunas do listview?
Obrigado

Meu e-mail: bsegato@yahoo.com.br

Alexandre Cortez. disse...

Olá, Bruno... obrigado pela sua visita aqui no blog... bem, a primeira coisa que vc tem que ter em mente, é que o Listview é um componente do Windows. Portanto, tudo o que o Windows oferece de recursos (API´s) em relação ao Listview é perfeitamente possível fazer com qualquer linguagem que possa fazer chamadas às API´s do Windows. Em muitos sites na internet, você vai encontrar formas de colorir as linhas e as colunas de um Listview, de forma individual. Não é uma tarefa das mais simples, pois envolve conhecimentos de API´s e no caso específico do NetExpress, conhecimentos sobre a OOP (Programação Orientada ao Objeto). Em nossa empresa, desenvolvemos uma solução chamada CSListview, que permite ao desenvolvedor criar Listview´s e colorir as linhas de forma individual. Já estamos estudando a possibilidade de colorir agora apenas colunas específicas das linhas do CSListview, e provavelmente, os desenvolvedores que já adquiriram nossa ferramenta receberão essa nova funcionalidade ainda esse ano. Se você se interessar em receber material demosntrativo do CSListview, entre em contato comigo através do email: (alexandre.cia@iron.com.br). Então, respondendo a sua pergunta, é possível além de colorir linhas e colunas de um Listview, fazer muitas outras coisas interessantes, desde que você tenha o conhecimento necessário para isso. Espero ter lhe ajudado. Um abraço.

Anônimo disse...

Olá Alexandre, novamente estou aqui para te aborrecer, tenho uma aplicação que coloca de fundo de tela uma figura. O problema é que a rotina não esta funcionando para Windows Vista. Eu estava tentando com esta sua dica mas encontrei um problema, que como leigo não sei o que é esta variável umaListview, onde eu declaro?

Anônimo disse...

Então depois de fazer vários testes, peguei a sua rotina de colocar uma imagem Splash, ai fiz algumas alterações e consegui colocar uma imagem de fundo de tela.