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

最終更新:2019年09月04日 09:45
添付ファイル