아래의 내용은 \Masm32\Include 폴더에 위치해서 프로그램에서는 그냥 인클루드시켜서 WinProc부분만
기재해서 사용한다. 대부분 공통적인 오버헤드부분이므로, 이런방식으로 사용하는것이 효율적이다.
물론 소스파일에 전부 넣어서 해도 마찬가지이나, 유지관리가 힘들어진다. 최대한 모듈로 분리해라!!
WinMain부분은 마음대로 바꿀 수 있으나, C프로그래머에게 익숙하게 변경했다. 어셈블리는 제한사항이 없다.
뭐든 맘대로 할 수 있다. WinMain에서는 사용할 클래스를 생성하고 등록한 후 메인 윈도우를 생성하고
메세지루프를 작동시키는 루틴이다. 주요 처리는 WinProc에서 처리될 것이다.
C와 같은 고급언어는 아래의 부분을 미리 생성해놓고 WinMain이라고 쓰라고 강요하고 있는 것이다.
실제로 _WinMain.c 라는 부분을 살펴보면 아래와 같은 내용의 C버전이 보인다. 하지만 변수처리나 로직부분
등 모든것이 조금 효율이 떯어진다. 속도로는 아직까지 아니 어떤시대라도 어셈블리를 따라올것이 없다.
거추장한것은 다 쳐내고 실제로 사용할 것만 효율적으로 사용하며, 그마저도 자기마음대로 바꿀 수 있다.
WinProc또한 이렇게 라이브러리로 따로 뺄 수 도 있으나 그것은 너무 혼란을 야기하므로 WinMain만 인클루드
시켜서 처리한다. 외양에 관한 부분은 따로 변수를 두었으니 변경할 수 있도록 처리했다.
;******************************* Usage for WinMain.INC **************************************
;*********************************************************************************************
;* File Location is \MASM32\INCLUDE\WINMAIN.INC *
;* 2007.01 aka Xeno *
;* ------ Modify You Source Contents. ----------------------------------- *
;* *
;* Win_Left EQU 80 ; 좌측 상단 X 좌표 *
;* Win_Top EQU 60 ; 좌측 상단 Y 좌표 *
;* Win_Width EQU 640 ; 윈도우 폭 *
;* Win_Height EQU 480 ; 윈도우 높이 *
;* Icon_ID EQU 100 ; 아이콘 ID (리소스에서 지정한 값) *
;* Menu_ID EQU 200 ; 메뉴 ID (리소스에서 지정한 값) *
;* BackColor EQU COLOR_WINDOW+1 ; 윈도우 바탕색 설정 *
;* CW_Style EQU WS_EX_OVERLAPPEDWINDOW ; 윈도우 형태 *
;* *
;* ------- Above WinProc Procedure. -------- *
;* *
;* INCLUDE \MASM32\INCLUDE\WINMAIN.INC *
;* *
;*********************************************************************************************
;-----------------------------------------------------------------------------------------
; Global Data Cell Routine
.DATA
; UnComment Your Source
; ClassName DB "WinMain_Class",00H ; Customize Your Source
; TitleName DB "Xeno Main",00H ; Customize Your Source
CommandLine DD 00000000H
hInstance DD 00000000H
hWindow DD 00000000H
hIcon DD 00000000H
hMenu DD 00000000H
WinClass WNDCLASSEX <> ; Define Structure
Msg MSG <>
;-----------------------------------------------------------------------------------------
; WinMain Routine - Program Entry Point
.CODE
WinMain:INVOKE GetCommandLine ; 명령어 라인 옵셋 얻기
MOV CommandLine,EAX
INVOKE GetModuleHandle,NULL ; 인스턴스(모듈) 핸들 얻기
MOV hInstance,EAX
MOV WinClass.hInstance,EAX ; WndClass.hInstance에 전달
MOV WinClass.cbSize, SizeOf WNDCLASSEX
MOV WinClass.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
MOV WinClass.lpfnWndProc, OFFSET WinProc
MOV WinClass.cbClsExtra, NULL
MOV WinClass.cbWndExtra, NULL
MOV WinClass.hbrBackground,BackColor
MOV WinClass.lpszMenuName, NULL
MOV WinClass.lpszClassName,OFFSET ClassName
MOV WinClass.hIconSm,NULL
INVOKE LoadIcon,hInstance,Icon_ID ; 아이콘 ID
MOV WinClass.hIcon,EAX
INVOKE LoadCursor,NULL,IDC_ARROW ; 커서 ID
MOV WinClass.hCursor,EAX
INVOKE LoadMenu,hInstance,Menu_ID ; 메뉴 ID
MOV hMenu,EAX
INVOKE RegisterClassEx,ADDR WinClass ; 윈도우 클래스 등록
; ----- CreateWindow Position Set -------------------------------------------
INVOKE CreateWindowEx,CW_Style,ADDR ClassName, ; 윈도우 생성하고 핸들 얻음
ADDR TitleName,
WS_OVERLAPPEDWINDOW,
Win_Left,Win_Top,
Win_Width,Win_Height,
NULL,NULL,hInstance,NULL
MOV hWindow,EAX ; 윈도우 핸들 보관
; ----- ShowWindow Menu Handling -----------------------------------------
INVOKE SetMenu,hWindow,hMenu
INVOKE ShowWindow,hWindow,SW_SHOWNORMAL ; 윈도우를 화면에 출력
INVOKE UpdateWindow,hWindow
; ----- Loop Message Handling -------------------------------------------
MsgLoop:INVOKE GetMessage,ADDR Msg,NULL,0,0 ; 메시지 발생 대기
OR EAX,EAX ; 종료 코드 발생시
JE EndLoop ; 종료 루틴으로 점프
INVOKE TranslateMessage,ADDR Msg ; 메시지 변환 (키보드)
INVOKE DispatchMessage,ADDR Msg ; 메시지 전달 (WndProc)
JMP MsgLoop
EndLoop:INVOKE ExitProcess,EAX ; 프로그램 종료
; ##############################################################################################