Informática Numaboa - Tutoriais e Programação
Trocando de pele (masm)
- Detalhes
-
Categoria: Assembly Numaboa (antigo oiciliS)
-
Atualização: Domingo, 21 Junho 2009 18:46
-
Autor: vovó Vicki
-
Acessos: 5650
Já que no tutorial anterior (o Janela Numaboíssima) foi visto como fazer uma janela diferente, vamos aproveitar o código fonte e fazer com que a nova janela troque de pele. Para compensar o tutorial anterior, extremamente extenso, neste você vai ter apenas a listagem do código fonte do tutorial anterior com as pequenas modificações explicadas.
Explicações preliminares
O projeto é para uma janela de formato n~qo convencional que, com um clique no bot~qo direito do mouse, mude de pele. Precisamos no mínimo de dois bitmaps, de dimensões iguais, que possam servir de máscara. Um deles será o do tutorial anterior; o outro tem o Kiki como garoto propaganda. O arquivo de recursos precisa conter os dois bitmaps. A janela continua sendo fechada com um duplo clique do botão esquerdo do mouse.
Pele "Numaboa" |
|
O código fonte
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
gerenteJanela proto :DWORD,:DWORD,:DWORD,:DWORD
grafiti proto :DWORD, :DWORD, :DWORD
.DATA?
mInstancia dd ?
mBitmap1 dd ? // manipulador para o bitmap "NumaBoa"
mBitmap2 dd ? // manipulador para o bitmap "Kiki"
.DATA
NomeClasse db "Peles",0
TituloJanela db "Peles NumaBoa",0
Texto db "tchauzinho...",0
bitAtual db 1 // pele ativa: (1) "NumaBoa" e (2) "Kiki"
.CONST
Bitmap1ID equ 1000 // identificador do bitmap "NumaBoa" nos recursos
Bitmap2ID equ 1001 // identificador do bitmap "Kiki" nos recursos
largBitmap equ 350
altBitmap equ 200
.CODE
inicio:
invoke GetModuleHandle, NULL
mov mInstancia, eax
invoke gerenteJanela, mInstancia, NULL, NULL, SW_SHOWDEFAULT
invoke ExitProcess, eax
gerenteJanela PROC mInst:DWORD, mInstAnt:DWORD, linhaCmd:DWORD, Mostra:DWORD
LOCAL ej:WNDCLASSEX
LOCAL mJanela:HWND
LOCAL malote:MSG
mov ej.cbSize, SIZEOF WNDCLASSEX
mov ej.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov ej.lpfnWndProc, OFFSET gerenteMensagem
mov ej.cbClsExtra, NULL
mov ej.cbWndExtra, NULL
push mInstancia
pop ej.hInstance
mov ej.hbrBackground, NULL
mov ej.lpszMenuName, NULL
mov ej.lpszClassName, OFFSET NomeClasse
invoke LoadIcon, NULL, IDI_WINLOGO
mov ej.hIcon, eax
mov ej.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov ej.hCursor, eax
invoke RegisterClassEx, ADDR ej
invoke CreateWindowEx, NULL, ADDR NomeClasse, ADDR NomeClasse,
WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, largBitmap, altBitmap, NULL,
NULL, mInst, NULL
mov mJanela,eax
invoke ShowWindow, mJanela, SW_SHOWNORMAL
invoke UpdateWindow, mJanela
_Ini:
invoke GetMessage, ADDR malote, NULL, 0, 0
test eax, eax
jz _Fim
invoke TranslateMessage, ADDR malote
invoke DispatchMessage, ADDR malote
jmp _Ini
_Fim:
mov eax,malote.wParam
ret
gerenteJanela ENDP
gerenteMensagem PROC hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL mCM:HDC
LOCAL mCMBit:HDC // Só o nome foi mudado
LOCAL retang:RECT
LOCAL ps:PAINTSTRUCT
.IF uMsg == WM_CREATE
invoke LoadBitmap, mInstancia, Bitmap2ID // carrega o bitmap "Kiki"
mov mBitmap2, eax // manipulador para o bitmap "Kiki"
invoke LoadBitmap, mInstancia, Bitmap1ID // carrega o bitmap "NumaBoa"
mov mBitmap1, eax
invoke CreateCompatibleDC, NULL
mov mCMBit, eax
invoke SelectObject, mCMBit, mBitmap1
invoke GetWindowRect, hWnd, ADDR retang
invoke grafiti, mCMBit, retang.right, retang.bottom
invoke SetWindowRgn, hWnd, eax, TRUE
invoke DeleteDC, mCMBit
.ELSEIF uMsg == WM_PAINT
invoke BeginPaint, hWnd, ADDR ps
mov mCM, eax
invoke GetClientRect, hWnd, ADDR retang // USE ClientRect e NÃO WindowRect
invoke CreateCompatibleDC, NULL
mov mCMBit, eax
.IF bitAtual == 1
invoke SelectObject, mCMBit, mBitmap1 // seleciona a pele "NumaBoa"
.ELSE
invoke SelectObject, mCMBit, mBitmap2 // seleciona a pele "Kiki"
.ENDIF
invoke grafiti, mCMBit, retang.right, retang.bottom // prepara o bitmap
invoke SetWindowRgn, hWnd, eax, TRUE // transfere para a janela
invoke BitBlt, mCM, 0, 0, retang.right, retang.bottom, mCMBit, 0, 0, SRCCOPY
invoke DeleteDC, mCMBit
invoke EndPaint, hWnd, ADDR ps
.ELSEIF uMsg == WM_DESTROY
invoke DeleteObject, mBitmap1 // livra a memória do bitmap "NumaBoa"
invoke DeleteObject, mBitmap2 // e também do bitmap "Kiki"
invoke PostQuitMessage, NULL
xor eax, eax
ret
.ELSEIF uMsg == WM_LBUTTONDBLCLK
invoke MessageBox, hWnd, ADDR Texto, ADDR TituloJanela, MB_OK
invoke SendMessage, hWnd, WM_DESTROY, NULL, NULL
.ELSEIF uMsg == WM_LBUTTONDOWN
invoke SendMessage, hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
.ELSEIF uMsg == WM_RBUTTONDOWN // intercepta o clique do botão direito do mouse
.IF bitAtual == 1 // se a pele for "NumaBoa"
mov bitAtual, 2 // troca para "Kiki"
.ELSE
mov bitAtual, 1 // e vice-versa
.ENDIF
invoke GetClientRect, hWnd, ADDR retang // obtém as coordenadas da janela
invoke InvalidateRect, hWnd, ADDR retang, TRUE
// invalida para poder fazer nova pintura
invoke UpdateWindow, hWnd // força a pintura da janela
.ENDIF
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
gerenteMensagem ENDP
grafiti PROC USES ESI EDI EBX _mModelo:HDC, _largura:DWORD, _altura:DWORD
LOCAL corT: DWORD
LOCAL copiao: DWORD
LOCAL temCor: DWORD
LOCAL CMtemp: DWORD
LOCAL CMcopiao: DWORD
mov temCor, FALSE
mov copiao, TRUE
xor edi, edi
xor esi, esi
invoke GetPixel, _mModelo, 0, 0
mov corT, eax
_olhaPix:
invoke GetPixel, _mModelo, edi, esi
cmp eax, corT
jz _copiaPix
cmp edi, _largura
jnz _acheiPix
_copiaPix:
cmp temCor, TRUE
jnz _proxPix
mov temCor, FALSE
mov eax, esi
inc eax
invoke CreateRectRgn, ebx, esi, edi, eax
mov CMtemp, eax
cmp copiao, TRUE
jnz _poeCopiao
push CMtemp
pop CMcopiao
mov copiao, FALSE
jmp _proxPix
_poeCopiao:
invoke CombineRgn, CMcopiao, CMcopiao, CMtemp, RGN_OR
invoke DeleteObject, CMtemp
jmp _proxPix
_acheiPix:
cmp temCor, FALSE
jnz _proxPix
mov temCor, TRUE
mov ebx,edi
_proxPix:
inc edi
cmp edi, _largura
jbe _olhaPix
xor edi, edi
inc esi
cmp esi, _altura
jb _olhaPix
_retorna:
mov eax, CMcopiao
ret
grafiti ENDP
end inicio
Tutorial para download
Este tutorial, juntamente com o código fonte, imagens e o executável está na seção de Downloads / Tutoriais / Assembly Numaboa, mas você também pode baixá-lo aqui.
онлайн казино супер слотсбиол посудалобановский александр женаноутбуки асуслобановский александрценаполигон ооо