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...

Informática Numaboa - Tutoriais e Programação

Abre-te Sésamo (masm)

Ter

21

Abr

2009


17:03

(7 votos, média 4.86 de 5) 


Nível intermediário

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.

BOOL GetOpenFileName( LPOPENFILENAME lpofn // endereço da estrutura com os dados de inicialização );

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

// Constantes para o menu #define IDM_abrir 1 #define IDM_sair 2 Menuzinho MENU { POPUP "&Arquivo" { MENUITEM "&Abrir",IDM_abrir MENUITEM SEPARATOR MENUITEM "&Sair",IDM_sair } }

Digite o texto acima, salve como RSRC.RC e compile. Agora vamos incluí-lo no no código:

... .CONST IDM_abrir equ 1 IDM_sair equ 2 ... .DATA NomeClasse db "Janela", 0 TituloJanela db "Abre-te Sésamo", 0 NomeMenu db "Menuzinho", 0 .CODE entrada: ... gerenteJanela PROC ... ... mov ej.lpszMenuName, NomeMenu ...

Informações adicionais