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

Trocando de pele (masm)

Qui

16

Abr

2009


14:16

(3 votos, média 3.67 de 5) 


Nível avançado

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.

Numaboa
Pele "Numaboa"
Kiki

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.

онлайн казино супер слотсбиол посудалобановский александр женаноутбуки асуслобановский александрценаполигон ооо

Informações adicionais