Aldeia Numaboa
Um portal diferente em Português do Brasil
Informática da Aldeia

Tutoriais
Home Informática Tutoriais e Programação Linguagem C Linguagem C - Projeto Espião II

Na Aldeia

Há 121 visitantes online

3296 registros
0 hoje
0 nesta semana
32 neste mês

Boas vindas: superxandaoce

Estatística

Artigos: 1063
Leituras: 6016913
Arquivados: 21
Downloads: 533
Baixados: 171528
Glossário: 1208
Bibliografia: 25
Links: 90

Visitas de onde

Top 5:
Brasil flag 73%Brasil (40550)
Portugal flag 4%Portugal (2506)
EUA flag 4%EUA (1971)
Holanda flag 0%Holanda (237)
Rússia flag 0%Rússia (233)
55783 visitas de 97 países

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

Login



Kanji da hora




Faça contato






Sáb

29

Nov

2008


17:55

Linguagem C - Projeto Espião II PDF Imprimir Indique esta página
(1 voto, média 5.0 de 5)
Escrito por vovó Vicki   


Índice do Artigo
Linguagem C - Projeto Espião II
Farejando janelas
Todas as páginas
C

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 piscada

As trombetas de caça

Nas 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):

  1. void MainWndProc_OnCommand(
  2. HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  3. {
  4. switch(id) {
  5. case IDM_NEW:
  6. criaTree(hwnd);
  7. break;
  8. case IDM_EXIT:
  9. PostMessage(hwnd,WM_CLOSE,0,0);
  10. break;
  11. }
  12. }

Criando itens da árvore

O 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:

  • itemTree.hParent = TVI_ROOT indica que se trata de um item raiz (o valor de TVI_ROOT é definido no Windows como -65536). Obtemos o mesmo resultado se atribuirmos NULL a este campo.
  • itemTree.hInsertAfter = TVI_LAST indica que o item deve ser adicionado no final da lista (LAST = último). Outros valores possíveis são TVI_FIRST (inserir no começo da lista, pois a tradução de FIRST é primeiro) e TVI_SORT (inserir o item em ordem alfabética. SORT = ordenar).
  • TV_ITEM é uma estrutura aninhada e contém muitos campos. Destes, foram escolhidos apenas dois:
    • itemTree.item.mask = TVIF_TEXT | TVIF_PARAM. O valor TVIF_TEXT indica que o campo pszText desta estrutura aninhada é válido e o valor TVIF_PARAM indica que o campo lParam da estrutura aninhada é válido.
    • itemTree.item.pszText = "Desktop" atribui a string "Desktop" ao campo lpzText.

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 )
 

Topo

Topo

Exceto onde especificamente citado, todo material deste site está sob Licença Creative Commons