MASM32 и OpenGL
Это не так сложно, как на самом деле

Подготовка

Потребуется только MASM32, который (если еще не установлен) качаем с официального сайта - находим в любом поисковике по запросу MASM32 и устанавливаем в соответствии с выдаваемыми установщиком инструкциями. Создаем отдельную папку для приведенных примеров, лучше - не пересекающуюся с папкой MASM32. Запасаемся большой стопкой учебников по ассемблеру - комментарии к примерам будут минимальными. И, самое главное - не пугаемся громоздкого кода - подавляющая его часть копируется из одной программы в другую практически без изменений, можно считать эту часть кода просто шаблоном. Все готово? Тогда начнем.

Заготовка состоит из пяти файлов. Первый (здесь он называется opengl.asm) - содержит процедуры WinMain - она создает окно, WndProc - обрабатывает поступающие сообщения, RegisterWinClass - регистрация класса окна и TopXY - необходима для позиционирования окна на экране. Это стандартные процедуры, подробно описанные в учебниках. Текст файла opengl.asm:

.386
.model flat,stdcall
option casemap:none
include opengl.inc



; #########################################################################
.code

start:
invoke GetModuleHandle, NULL
mov hInstance, eax

invoke GetCommandLine
mov CommandLine, eax


invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax

; #########################################################################

WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD


LOCAL msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD


invoke LoadIcon,hInst,500
mov hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW
mov hCursor, eax
invoke RegisterWinClass,ADDR WndProc,ADDR szClassName,
hIcon,hCursor,COLOR_BTNFACE+1


mov Wwd, 500
mov Wht, 500

invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov Wtx, eax

invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov Wty, eax

invoke CreateWindowEx,WS_EX_LEFT,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax

invoke LoadMenu,hInst,600
invoke SetMenu,hWnd,eax



invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd



StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke DrawScene
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:

return msg.wParam

WinMain endp

; #########################################################################

WndProc PROC hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL rc:RECT
.if uMsg == WM_COMMAND


.if wParam == 1000
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL




.endif
.elseif uMsg == WM_CREATE

invoke Init,hWin

.elseif uMsg == WM_SIZE
invoke GetClientRect,hWin,ADDR rc



return 0

.elseif uMsg == WM_CLOSE
mov eax,OpenDC
cmp eax,0
jz outDC

invoke wglDeleteContext,OpenDC

outDC:
invoke ReleaseDC,hWin,MainHDC
invoke DestroyWindow,hWin
return 0
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif


invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc ENDP

; ########################################################################

TopXY proc wDim:DWORD, sDim:DWORD


shr sDim, 1
shr wDim, 1
mov eax, wDim
sub sDim, eax

return sDim

TopXY endp

; #########################################################################

RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD,
Icon:DWORD, Cursor:DWORD, bColor:DWORD

LOCAL wc:WNDCLASSEX

mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_VREDRAW or \
CS_HREDRAW
m2m wc.lpfnWndProc, lpWndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInstance
m2m wc.hbrBackground, bColor
mov wc.lpszMenuName, NULL
m2m wc.lpszClassName, lpClassName
m2m wc.hIcon, Icon
m2m wc.hCursor, Cursor

m2m wc.hIconSm, Icon

invoke RegisterClassEx, ADDR wc

ret

RegisterWinClass endp

; ########################################################################


end start

Второй файл - opengl.inc - содержит список подключаемых библиотек, необходимый минимальный набор макросов, секцию .data, где инициализируются необходимы переменные, список подключаемых файлов - здесь он один - это opngl.asm и прототипы функций из предыдущего файла. Текст файла:

Следующий файл файл ресурсов rsrc.rc, в нем путь к иконке и минимальное меню:

Четвертый файл - это иконка, ее можно взять здесь или нарисовать самостоятельно. Этот набор и есть стандартный шаблон, в него по ходу дела будет вносится незначительные изменения и дополнения. А теперь самый главный файл, который связывает MASM32 и OpenGL. Он - на следующей странице.

©   Короленко М.В., 2011       
Перепечатка материалов возможна только после согласования с автором при условии обязательной ссылки на сайт