Informática Numaboa - Tutoriais e Programação
Abre-te Sésamo (masm)
Ter 21 Abr 2009 17:03 |
- Detalhes
- Categoria: Assembly Numaboa (antigo oiciliS)
- Atualização: Domingo, 21 Junho 2009 18:48
- Autor: vovó Vicki
- Acessos: 10470
Uma dialog box especial para abrir arquivos. As common dialog boxes são classes prontas para serem usadas. Veja como é fácil abrir arquivos e extrair as informações da seleção.
Já vimos como fazer uma dialog box se comportar como janela principal (tutorial "Dialog Box"), agora é só explorar um pouco mais as possibilidades.
Neste tutorial vamos ver como usar janelas de diálogo como dispositivos de entrada e saída - especificamente, como usar uma caixa de diálogo (dialog box), uma das muitas predefinidas do Windows, para abrir arquivos.
Um pouco de teoria
O Windows possui vários tipos de janelas de diálogo predefinidas, prontinhas para serem utilizadas nos seus aplicativos. São as chamadas common dialog boxes: caixas de diálogo para arquivos, impressão, cores, fontes e procura. As common dialog boxes fazem parte da comdlg32.dll de modo que, se quisermos fazer uso de alguma delas, precisamos incluir a biblioteca comdlg32.lib no nosso código fonte. Para criá-las, basta chamar a função correspondente: GetOpenFileName para abrir arquivos, GetSaveFileName para salvar arquivos, PrintDlg para imprimir e assim por diante. Neste tutorial vamos associar à janela principal do nosso aplicativo uma janela de diálogo para abrir arquivos.
Como sempre, vamos partir do modelo habitual, aquele criado tutorial Janelas. Também precisamos criar um arquivo de recursos que contenha um menu com o item principal "Arquivo" com dois itens: "Abrir" e "Sair". A essa altura do campeonato, você tira isto de letra (ou então refresque um pouco a memória relendo "Criando menus em Assembly"). A principal novidade é só a função GetOpenFileName.
A função GetOpenFileName
A função GetOpenFileName cria uma janela de diálogo comum do tipo Abrir (Open) que permite ao usuário especificar o drive, o diretório e o nome de um arquivo ou um conjunto de arquivos que devem ser abertos.
O único parâmetro desta função é lpofn, um ponteiro para uma estrutura OPENFILENAME que contém informações usadas para inicializar a janela de diálogo. No retorno da função, esta estrutura contém informações sobre o arquivo selecionado.
Se o usuário especificar um nome de arquivo e clicar o botão OK, o valor de retorno da função será diferente de zero. Se o usuário cancelar ou fechar a janela de diálogo, ou se ocorrer algum erro, o valor de retorno será zero.
A estrutura OPENFILENAME
A estrutura OPENFILENAME fornece todas as informações necessárias para inicializar uma janela de diálogo para abrir ou salvar arquivos. No retorno da função, a estrutura contém informações sobre a escolha efetuada pelo usuário. Ela possui 20 membros:
typedef struct tagOFN { // ofn DWORD lStructSize; O tamanho da estrutura em bytes HWND hwndOwner; O manipulador da janela à qual pertence a dialog box HINSTANCE hInstance; O manipulador da instância do aplicativo que cria a dialog box LPCTSTR lpstrFilter; Ponteiro para um buffer que contém pares de strings terminadas em zero. A última string precisa ser terminada com dois caracteres NULL. A primeira string de um par é descritiva, a segunda é um filtro. Por exemplo: "Bitmap" e "*.bmp". Se lpstrFilter for NULL, a janela de diálogo não mostra filtros. LPTSTR lpstrCustomFilter; Ponteiro para um buffer estático que guardará pares de string de filtros que o usuário indicar. Se for NULL, não retém os filtros indicados. DWORD nMaxCustFilter; O tamanho em bytes ou caracteres do buffer identificado por lpstrCustomFilter. O tamanho mínimo é 40. É ignorado se lpstrCustomFilter for NULL ou apontar para uma string NULL. DWORD nFilterIndex; Especifica qual par de strings filtro será usado na primeira vez em que a janela de diálogo for aberta. 1 para o primeiro par, 2 para o segundo, etc. Zero indica um filtro indicado pelo usuário. LPTSTR lpstrFile; Ponteiro para o buffer que contém o nome de arquivo usado para inicializar o controle de edição da dialog box. Após a seleção do usuário, guarda o nome do arquivo e seu caminho completo. DWORD nMaxFile; Tamanho do buffer lpstrFile. O tamanho mínimo é de 256 bytes. LPTSTR lpstrFileTitle; Ponteiro para um buffer que recebe o nome do arquivo selecionado e sua extensão (sem caminho). Este membro pode ser NULL. DWORD nMaxFileTitle; Tamanho do buffer para lpstrFileTitle. É ignorado se lpstrFileTitle for NULL. LPCTSTR lpstrInitialDir; Ponteiro para uma string que especifica o diretório inicial. Se for NULL, o sistema usa o diretório atual. LPCTSTR lpstrTitle; Ponteiro para a string com o título da janela de diálogo. DWORD Flags; Um jogo de bits sinalizadores. Pode ser a combinação de vários sinalizadores. OFN_ALLOWMULTISELECT, OFN_FILEMUSTEXIST e OFN_PATHMUSTEXIST são alguns exemplos. WORD nFileOffset; Após a seleção de um arquivo, este membro contém o índice do primeiro caracter do nome do arquivo. Por exemplo, se o selecionado foi "c:\dir1\dir2\teste.exe", este membro conterá 13 que indica a posição do "t". WORD nFileExtension; Após a seleção, contém o índice do primeiro caracter da posição. No mesmo exemplo usado acima, seu valor será 18 e apontará para "." LPCTSTR lpstrDefExt; Ponteiro para um buffer que contém a extensão default. Se o usuário não indicar a extensão, esta será automaticamente adicionada quando um arquivo for salvo. DWORD lCustData; Dados definidos no aplicativo que o sistema passa para o procedimento hook identificado pelo membro lpfnHook. LPOFNHOOKPROC lpfnHook; Ponteiro para o procedimento hook (gancho). Por exemplo, você pode dar o aspecto do Explorer à sua janela de diálogo. Para obter este efeito, há a necessidade de um procedimento "enganchado". LPCTSTR lpTemplateName; Ponteiro para uma string terminada em zero com o nome de um modelo de diálogo existente no arquivo de recursos. Este membro é ignorado se o sinalizador OFN_ENABLETEMPLATE, do membro Flags, não estiver ativado. } OPENFILENAME;
Apesar desta estrutura ser muito extensa, ainda assim você terá muito menos trabalho criando e inicializando esta estrutura do que fazendo uma janela de diálogo completa para a abertura de arquivos. Podes crer.
O "Abre-te Sésamo"
Como foi dito acima, o programa exemplo mostrará uma janela de diálogo para abrir um arquivo quando o usuário selecionar o item de menu Arquivo - Abrir. Após selecionar um arquivo, uma caixa de diálogo mostrará o nome do arquivo com o caminho completo, o nome do arquivo sem o caminho e a extensão do arquivo. Então vamos lá. A primeira providência é preparar o menu.
O menuzinho
Digite o texto acima, salve como RSRC.RC e compile. Agora vamos incluí-lo no no código:
Interceptando a mensagem do menu
Já sabemos que mensagens de menu são do tipo WM_COMMAND e que podem ser interceptadas pelo gerenteMensagem:
Criando a estrutura OPENFILENAME
Se o item de menu "Abrir" for selecionado, precisamos ter à disposição uma estrutura OPENFILENAME declarada para poder inicializá-la. Só depois disso é que poderemos criar a Open Dialog Box. Analisando os membros da estrutura, fica evidente que vamos precisar de uma string de filtro, um buffer para guardar o arquivo selecionado e do tamanho do buffer.
Analisando a seleção do usuário
Tendo inicializado a estrutura OPENFILENAME, agora é possível criar a janela de diálogo padrão para a abertura de arquivos. Assim que o usuário fizer a sua escolha, analisaremos os valores de retorno e os apresentaremos numa caixa de mensagens. Novamente precisaremos de alguns dados adicionais: um buffer para as strings que serão apresentadas, o tamanho deste buffer, os textos padrão para o nome do arquivo selecionado e o título da caixa de mensagem. A concatenação das strings padrão com as strings da seleção pode ser obtida através da função lstrcat:
Finalmentes
O pequeno aplicativo tem este jeitão:
Você pode fazer o download do tutorial nos Downloads da Aldeia em Tutoriais / Assembly Numaboa.