3296 registros
0 hoje
0 nesta semana
32 neste mês![]() | 73% | Brasil (40550) |
![]() | 4% | Portugal (2506) |
![]() | 4% | EUA (1971) |
![]() | 0% | Holanda (237) |
![]() | 0% | Rússia (233) |
| Hoje: | 241 |
| Ontem: | 1485 |
| No mês: | 29968 |
| Mês passado: | 25815 |
| Total: | 55783 |
| Recorde: | 3037 |
| No dia: | 04.03.10 |
| Leituras hoje: | 12616 |
| Leituras Total: | 243598 |
| Bots hoje: | 144 |
| Dados desde: | 16.02.2010 |
|
Sáb 29 Nov 2008 17:55 |
|
Página 1 de 2
No tutorial anterior criamos o projeto Espião e adicionamos uma janela-filha. Esta janela-filha corresponde a um controle de árvore, do tipo que encontramos no Explorer do Windows, onde poderemos colocar informações hierarquizadas. Quais seriam estas informações? Hehe, o resultado da nossa caça a janelas. Vai ser a nossa sala de troféus As trombetas de caçaNas caçadas clássicas, sai todo mundo a cavalo com um monte de cães correndo na frente, latindo como uns malucos, assim que o início da caçada é anunciada pelo trombeteiro. Gente, nem eu sabia que programar era uma atividade tão emocionante! Clique em |Design|Open/New|, abra "espiaores.h", expanda "menu" e dê um duplo clique em IDMAINMENU para abrir o editor de menus. Expanda "&File" e clique em "&New": este item está identificado por IDM_NEW e possui o valor 200. Troque &New por &Farejar e clique em [Apply] (eu aproveitei e mudei &File para &Espião, &E&xit para &Sair e eliminei o item de menu &Open). Feche o editor de menu e o editor de recursos. O item de menu &Farejar continuou com a IDentificação IDM_NEW. É esta ID que precisamos interceptar para que a caçada seja iniciada. Acontece que o menu possui uma central de mensagens própria, a função MainWndProc_OnCommand. Como, para popular a árvore, já é possível prever que será necessário um trecho de código mais elaborado, vamos novamente usar a técnica do "top-down" e inserir uma chamada a uma função. Chamei esta função de criaTree (linhas 5 a 7):
Criando itens da árvoreO código da função, chamada através do item de menu "Farejar", que é interceptada em MainWndProc_OnCommand, inicialmente "fareja" a janela do desktop (ou área de trabalho do Windows). Depois disto, o procedimento relaciona todas as janelas-filhas da janela encontrada. Duas direções precisam ser exploradas: as janelas-filhas de uma dada janela e as janelas-irmãs de uma dada janela. int criaTree(HWND mae) { HWND Inicio = GetDesktopWindow(); HWND hTree = GetDlgItem(mae,IDJANELATREE); TV_INSERTSTRUCT itemTree; HTREEITEM hNovoNo; memset(&itemTree,0,sizeof(itemTree)); itemTree.hParent = TVI_ROOT; itemTree.hInsertAfter = TVI_LAST; itemTree.item.mask = TVIF_TEXT | TVIF_PARAM; itemTree.item.pszText = "Desktop"; hNovoNo = TreeView_InsertItem(hTree,&itemTree); Inicio = GetWindow(Inicio,GW_CHILD); Scan(hTree,hNovoNo,Inicio); TreeView_Expand(hTree,hNovoNo,TVE_EXPAND); return 1; } A função criaTree é chamada com o parâmetro manipulador da janela-mãe. Ela começa requisitando ao Windows o manipulador da janela do desktop e armazenando este valor na variável do tipo HWND Inicio. Como também vamos precisar do manipulador da janela da árvore, armazenamos seu valor na variável do tipo HWND hTree que nos é retornada pela função GetDlgItem. A seguir, manifestamos a estrutura itemTree. Este tipo de estrutura está assim definido no Windows: typedef struct _TV_INSERTSTRUCT { HTREEITEM hParent; HTREEITEM hInsertAfter; TV_ITEM item; } TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT; Como cada nó da estrutura hierárquica da árvore também possui um manipulador próprio (o que é que não tem manipulador no Windows?), manifestamos a variável do tipo HTREEITEM hNovoNo. É comum jogar estruturas para uma área da memória e referenciá-las através de ponteiros. Com a estrutura itemTree não vai ser diferente, mas para garantir que a área de memória esteja "limpinha", zeramos todos os bits com a chamada da função da linguagem C memset. Os parâmetros são o ponteiro para a área de memória onde está a estrutura (&itemTree), o valor de preenchimento (0) e o tamanho da estrutura ( sizeof(itemTree) ). Tudo sob controle, começamos a atribuir valores para os campos da estrutura que nos interessam:
Depois de atribuir os valores aos campos, chamamos a macro do Windows TreeView_InsertItem, que pede como parâmetros o manipulador da árvore e um ponteiro para a estrutura que especifica os atributos do item, e que retorna (dou-lhe uma, dou-lhe duas, dou-lhe três...) o manipulador do novo item se tudo correr bem; caso contrário, retorna NULL. Tudo prontinho, chamamos a função Scan (discutida abaixo) para caçar as janelas existentes. De posse de todos os nós da árvore (a função criaTree prepara o raiz e a função Scan os nós restantes), chamamos a macro TreeView_Expand para mostrar a árvore completa. Bem, depois de todas estas explicações, acho que já é possível inserir o código acima no seu programa... o susto não vai mais ser tão grande. Não se esqueça, programador profissional faz protótipo de função, então: ... LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam); static HWND _stdcall janelaTree(HWND hWnd,int ID); int criaTree(HWND parent); ... |
||||
| Última atualização ( Sáb, 29.11.2008 18:35 ) |