A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Tutoriais e Programação

Linguagem C - Diálogo personalizado

Dom

23

Nov

2008


21:24

(10 votos, média 5.00 de 5) 


Editando os recursos com o lcc-win32

Na primeira compilação e linkedição, o lcc-win32 também compila o arquivo de recursos para que possa ser incorporado ao executável. Se quisermos modificar os recursos gerados automaticamente, precisamos fazer as alterações antes de compilar o programa. Uma outra possibilidade é compilar os recursos através de um comando de linha do lcc-win32, assunto de tutoriais posteriores.

Para editar os recursos com o lcc-win32, clique em |Design/Open/New|, selecione dlg2res.h, clique em [Open], expanda o diretório "Dialogs" clicando no sinal de + e dê um duplo clique em IDD_MAINDIALOG 100 dlg2. Como resultado, aparece uma janela de edição de recursos com a caixa de diálogo.

Recursos

Clique [T↓] - o primeiro botão da barra de ferramentas - para mostrar todos os controles disponíveis. Lá você vai encontrar campo de edição, check box, botão rádio, etc. Clique no campo de edição "Edit field" e o cursor indicará a seleção. Coloque o cursor na posição desejada dentro da caixa de diálogo e clique novamente para inserir o controle. Ele aparece como selecionado, o que é indicado pelos quadradinhos vermelhos ao redor do campo de edição.

Controle inserido

No campo de edição do aplicativo, "Name", acima da barra de ferramentas, digite ID_EDICAO. Este será o apelido do nosso campo de edição e o editor de recursos deve lhe atribuir a ID 101 no arquivo dlg2res.h (você poderá trocar o número se quiser, contanto que não conflite com outra ID). A seguir, redimensione o campo de edição clicando e arrastando um dos quadradinhos. Clique também no título da janela dlg2 para selecioná-la e a redimensione também.

Para conferir o resultado, clique no botão de teste (o que possui um ícone de interruptor, o penúltimo da barra de ferramentas). Você pode digitar qualquer texto no campo e depois clicar em [OK], em [Cancel] ou no botão com o interruptor para fechar a janela. Deu tudo certo e você está satisfeito? Eu não! Quero que o botão com "Cancel" mostre "Cancela" e que o título da janela seja Diálogo Personalizado. Então vamos lá...

Nome

Tendo voltado ao modo de edição, clique no botão com o texto "Cancel" para selecioná-lo - o que faz os quadradinhos vermelhos aparecerem. Clique no último botão da barra de ferramentas (o que parece ter uma patente de sargento) para abrir a janela de propriedades referentes ao controle selecionado. No campo "Text" ponha Cancela. A seguir, clique no título da caixa de diálogo - aparecem as propriedades da mesma. No campo "Caption text" escreva Diálogo Personalizado e depois feche a janela de propriedades.

Teste novamente com o botão do interruptor. Ah... agora está bem melhor! Como por enquanto é só, feche a janela de edição de recursos e clique em [Yes] para salvar as alterações no arquivo dlg2res.h, em [Yes] para salvar as alterações no arquivo dlg2.rc e novamente em [Yes] para atualizar o arquivo tmpres????.res.

Interagindo com o usuário

Na verdade, o que queremos é interagir com o usuário do nosso programa. Seria muita gentileza da nossa parte se o cursor já estivesse colocado no campo de edição quando a janela fosse apresentada (economiza um clique de mouse wink. No Windows, existe sempre apenas uma janela que esteja em foco e que recebe todas as entradas do teclado e do mouse.

Podemos forçar o foco numa janela com a função da API SetFocus e, como queremos determinar o foco ANTES da janela ser apresentada, é claro que vamos colocar esta informação na função InitializeApp do nosso programa - mesmo porque, ela foi feita para isto mesmo.

static int InitializeApp(HWND hDlg,WPARAM wParam, LPARAM lParam) { SetFocus(GetDlgItem(hDlg,ID_EDICAO)); return 1; }

Beleza pura! Compile e teste o programa para verificar que... NÃO FUNCIONOU sad. Que mistério é esse? Será que nossa central de mensagens não está sabendo enviar nossas solicitações ao sistemão? Veja:

static BOOL CALLBACK DialogFunc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: InitializeApp(hwndDlg,wParam,lParam); return TRUE; ...

Na nossa central de mensagens, quando recebemos a mensagem WM_INITDIALOG para avisar que nossa janela está pronta para ser mostrada na tela, antes de mostrá-la chamamos a função InitializeApp e enviamos como resposta TRUE. Se você tiver instalado o help das APIs do Windows (faça o download - 12.8 MB), coloque o cursor sobre a mensagem WM_INITDIALOG e digite F1. A parte importante é "The dialog box procedure should return TRUE to direct Windows to set the keyboard focus to the control given by hwndFocus. Otherwise, it should return FALSE to prevent Windows from setting the default keyboard focus". Resumindo, para que o Windows não acione o foco padrão (que é o teclado), a resposta precisa ser FALSE! Como o foco padrão não nos convém...

Taí! Troque o return TRUE; por return FALSE;. Salve a alteração com |File/Save| e dá-lhe testar novamente. Na mosca! O foco está no campo de edição.

Voltando para a função SetFocus, é preciso dizer que ela pede um parâmetro: o manipulador (handle) da janela (ou elemento da interface) que deve receber o foco. Temos o campo de edição de ID_EDICAO, mas desconhecemos seu manipulador. Então, o jeito é apelar novamente para a API e usar a função GetDlgItem. Esta função pede dois parâmetros - o manipulador da caixa de diálogo e o apelido do item - e retorna o manipulador do item indicado. O manipulador da caixa de diálogo vem pronto como parâmetro da função InitializeApp - é o hDlg. Pois bem, é possível obter o manipulador do item de diálogo com GetDlgItem que, por sua vez, é enviado como parâmetro da função SetFocus. É o famoso sanduiche de funções smile

Observações da vó

Tudo muito bem, tudo muito bom, mas... sempre precisa ter um mas para justificar o próximo módulo deste tutorial: do que adianta solicitar uma string do usuário se não pudermos identificá-la e usá-la para alguma coisa?

Se você ainda tiver fôlego, prossiga com o próximo tutorial, Caçando informações. Se tiver dúvidas, é melhor reler o texto e dirimi-las (gostou do dirimir???) antes de prosseguir. Se estiver num mato sem cachorro, faça contato que terei prazer em ajudar.

Abraço da vovo

лучшие игроки в покермагазин керамической посудыхарьков никас официальный сайтвидеокамера 3gdoctor2.ruпорядок выплатыполигон ооо

Informações adicionais