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

Interceptando a mensagem do menu

Já sabemos que mensagens de menu são do tipo WM_COMMAND e que podem ser interceptadas pelo gerenteMensagem:

... gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ... .ELSEIF uMsg == WM_COMMAND mov eax, wParam .IF ax == IDM_abrir ... // Aqui entra o código da Open Dialog Box .ELSE ...

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.

.CONST ... TamBuffer equ 256 .DATA ... ofn OPENFILENAME <> StringFiltro db "Todos (*.*)", 0, "*.*", 0 db "Arquivos Texto (*.txt)", 0, "*.txt", 0, 0 Buffer db TamBuff dup (0) .CODE ... gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ... .ELSEIF uMsg == WM_COMMAND mov eax, wParam .IF ax == IDM_abrir mov ofn.lStructureSize, SIZEOF ofn push hWnd pop ofn.hWndOwner push mInstancia pop ofn.hInstance mov ofn.lpstrFilter, OFFSET StringFiltro mov ofn.lpstrFile, OFFSET Buffer mov ofn.nMaxFile, TamBuff mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY ... .ELSE ... .ENDIF .ELSE // usuário escolheu item de menu "Sair" INVOKE DestroyWindow, hWnd .ENDIF ...

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:

LPTSTR lstrcat( LPTSTR lpString1, // endereço do buffer para as strings concatenadas LPCTSTR lpString2 // endereço da string que deve ser adicionada à string1 ); .CONST ... TamBuffer equ 256 TamResp equ 512 .DATA ... ofn OPENFILENAME <> StringFiltro db "Todos (*.*)", 0, "*.*", 0 db "Arquivos Texto (*.txt)", 0, "*.txt", 0, 0 Buffer db TamBuff dup (0) BuffResp db TamResp dup (0) NomeCompleto db "O nome completo do arquivo é: ", 0 NomeArq db "O nome do arquivo é: ", 0 NomeExt db "A extensão do arquivo é: ", 0 QuebraDeLinha db 0Dh, 0Ah, 0 TituloResp db "Você selecionou", 0 ... gerenteMensagem proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ... .ELSEIF uMsg == WM_COMMAND ... .IF ax == IDM_abrir ... INVOKE GetOpenFileName, ADDR ofn .IF eax == TRUE INVOKE lstrcat, OFFSET BuffResp, OFFSET NomeCompleto ; põe "O nome completo do arquivo é: " no buffer INVOKE lstrcat, OFFSET BuffResp, ofn.lpstrFile ; concatena com o ; nome e caminho do arquivo escolhido INVOKE lstrcat, OFFSET BuffResp, OFFSET QuebraDeLinha ; concatena com uma quebra de linha INVOKE lstrcat, OFFSET BuffResp, OFFSET NomeArq ; concatena com "O nome do arquivo é: " mov eax, ofn.lpstrFile ; põe o ponteiro para o nome com caminho ; no registrador eax push ebx ; põe valor de ebx na pilha, preservando-o xor ebx, ebx ; zera ebx mov bx, ofn.nFileOffset ; põe a posição do ; primeiro caracter do nome do arquivo ; no registrador ebx add eax, ebx ; avança o ponteiro para apontar o início do ; nome do arquivo pop ebx ; restaura o valor original de ebx INVOKE lstrcat, OFFSET BuffResp, eax ; concatena com o nome do arquivo INVOKE lstrcat, OFFSET BuffResp, OFFSET QuebraDeLinha ; concatena mais uma quebra de linha INVOKE lstrcat, OFFSET BuffResp, OFFSET NomeExt ; concatena "A extensão do arquivo é: " mov eax, ofn.lpstrFile ; ponteiro para o nome com caminho em eax push ebx ; preserva o valor de ebx xor ebx, ebx ; zera ebx mov bx, ofn.nFileExtension ; põe a posição do primeiro caracter da extensão ; do arquivo no registrador ebx add eax, ebx ; avança o ponteiro para apontar o início ; da extensão do arquivo pop ebx ; restaura o valor original de ebx INVOKE lstrcat, OFFSET BuffResp, eax ; concatena com a extensão do arquivo INVOKE MessageBox, hWnd, OFFSET BuffResp, ADDR TituloResp, MB_OK ; mostra o resultado INVOKE RtlZeroMemory, OFFSET BuffResp, TamResp ; limpa o buffer de strings de resposta .ENDIF .ELSE ...

Finalmentes

O pequeno aplicativo tem este jeitão:

Sésamo

Você pode fazer o download do tutorial nos Downloads da Aldeia em Tutoriais / Assembly Numaboa.

игровые автоматы вулкан онлайн играть бесплатносковородка вок купитьофициальный никас сайт владимир пасторкисти Dark Chocolatesобстановка в харькове 26 февраляwobs

Informações adicionais