
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.
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 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.
...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"
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
....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:
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.
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
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.
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?
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.
Postar um comentário