Informática Numaboa - Tutoriais e Programação
Abre-te Sésamo (masm)
- Detalhes
-
Categoria: Assembly Numaboa (antigo oiciliS)
-
Atualização: Domingo, 21 Junho 2009 18:48
-
Autor: vovó Vicki
-
Acessos: 10471
Pagina 2 de 2
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:
Você pode fazer o download do tutorial nos Downloads da Aldeia em Tutoriais / Assembly Numaboa.
игровые автоматы вулкан онлайн играть бесплатносковородка вок купитьофициальный никас сайт владимир пасторкисти Dark Chocolatesобстановка в харькове 26 февраляwobs