comment *
MASM32 SDK
ml /c /coff WinApp2.asm
link /subsystem:windows WinApp2
*
.386
.model flat, stdcall
option casemap:none
include windows.inc
include gdi32.inc
include kernel32.inc
include user32.inc
includelib gdi32.lib
includelib kernel32.lib
includelib user32.lib
WNDSIZE equ 256
WinMain proto :DWORD, :DWORD, :DWORD, :DWORD
OnCreate proto :DWORD
OnDestroy proto
OnPaint proto :DWORD
.data
AppName db 'WinApp2', 0
.data?
hMemDC dd ?
hBmp dd ?
hBmpOld dd ?
.code
start proc
local hInstance:HINSTANCE
local lpCmdLine:LPSTR
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov lpCmdLine, eax
invoke WinMain, hInstance, NULL, lpCmdLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
start endp
WinMain proc hInstance:HINSTANCE, hPrevInstance:HINSTANCE, lpCmdLine:LPSTR, nShowCmd:DWORD
local wc:WNDCLASSEX
local msg:MSG
local hWnd:HWND
; ウィンドウクラスの登録
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, 0
mov wc.cbWndExtra, 0
mov eax, hInstance
mov wc.hInstance, eax
mov wc.hIcon, 0
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.lpszMenuName, 0
mov wc.lpszClassName, offset AppName
mov wc.hIconSm, 0
invoke RegisterClassEx, addr wc
; ウィンドウの作成
invoke CreateWindowEx,
0, addr AppName, addr AppName,
WS_OVERLAPPEDWINDOW and (not WS_MAXIMIZEBOX) and (not WS_THICKFRAME),
CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL
mov hWnd, eax
invoke ShowWindow, hWnd, nShowCmd
invoke UpdateWindow, hWnd
; メッセージループ
.while TRUE
invoke GetMessage, addr msg, NULL, 0, 0
.break .if eax == 0
invoke TranslateMessage, addr msg
invoke DispatchMessage, addr msg
.endw
mov eax, msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg == WM_PAINT
invoke OnPaint, hWnd
.elseif uMsg == WM_CREATE
invoke OnCreate, hWnd
.elseif uMsg == WM_DESTROY
invoke OnDestroy
invoke PostQuitMessage, 0
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
WndProc endp
OnCreate proc hWnd:HWND
local rcw:RECT
local rcc:RECT
local ww:DWORD
local wh:DWORD
local hdc:HDC
local x:DWORD
local y:DWORD
; ウィンドウサイズの調整
invoke GetWindowRect, hWnd, addr rcw
invoke GetClientRect, hWnd, addr rcc
mov eax, WNDSIZE
add eax, rcw.right
sub eax, rcw.left
sub eax, rcc.right
mov ww, eax
mov eax, WNDSIZE
add eax, rcw.bottom
sub eax, rcw.top
sub eax, rcc.bottom
mov wh, eax
invoke SetWindowPos, hWnd, NULL, 0, 0, ww, wh, SWP_NOZORDER OR SWP_NOMOVE
; メモリDC、GDIビットマップの作成
invoke GetDC, hWnd
mov hdc, eax
invoke CreateCompatibleDC, hdc
mov hMemDC, eax
invoke CreateCompatibleBitmap, hdc, WNDSIZE, WNDSIZE
mov hBmp, eax
invoke SelectObject, hMemDC, hBmp
mov hBmpOld, eax
; メモリDCに描画
mov y, 0
yloop:
mov x, 0
xloop:
mov eax, x ; B
shl eax, 8
or eax, y ; G
shl eax, 8
invoke SetPixel, hMemDC, x, y, eax
inc x
cmp x, 256
jb xloop
inc y
cmp y, 256
jb yloop
invoke ReleaseDC, hWnd, hdc
ret
OnCreate endp
OnDestroy proc
invoke SelectObject, hMemDC, hBmpOld
invoke DeleteObject, hBmp
invoke DeleteDC, hMemDC
ret
OnDestroy endp
OnPaint proc hWnd:HWND
local ps:PAINTSTRUCT
local hdc:HDC
invoke BeginPaint, hWnd, addr ps
mov hdc, eax
invoke BitBlt, hdc, 0, 0, WNDSIZE, WNDSIZE, hMemDC, 0, 0, SRCCOPY
invoke EndPaint, hWnd, addr ps
ret
OnPaint endp
end start