What are the most efficient way to implement the window functions handling the messages being sent to the windows.
I'm most concerned about speed.
Thanks
--
RolfT
I'm most concerned about speed.
Thanks
--
RolfT
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
{
your code
}
break;
case WM_whatevermsg:
{
your code
}
break;
default: return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
WndProc: ; *** in most cases the incoming messages are passed through ***
; *** so no jump will be executed ***
mov eax, 8 [esp] ; = uMsg !
cmp eax, WM_PAINT
je WP_Paint
cmp eax, WM_CLOSE
je WP_Close
cmp eax, WM_DESTROY
je WP_Destroy
cmp eax, WM_CREATE
je WP_Create
; *** call default WindowProc ***
;
; In fact, no Invoke is needed here because stack-contents will be copied only !
; There's no reason to return from DefWindowProc, so a jmp is done !
@@: jmp DefWindowProc
WP_Create: ...
WP_Close: ...
WP_Destroy: ...
.386
.model flat,stdcall
option casemap: none
include \masm32\include\gdi32.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
include \masm32\include\_Macros_.inc
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
; --==============================================
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
Paint_Proc PROTO :DWORD,:DWORD
; This is supporting equates for the CreateBlankWindow Macro..
;500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "MAINICON.ICO"
IDI_MAINICON equ 500
THIS_WIDTH equ 300
THIS_HEIGHT equ 200
; --==============================================
.data
.data?
hInstance dd ?
hIcon dd ?
CommandLine dd ?
.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 wc :WNDCLASSEX
LOCAL hWnd :DWORD
LOCAL msg :MSG
mov hWnd, CreateBlankWindow( "AClass", "CTRL-DEL NAME", WndProc )
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
;===================================
; Loop until PostQuitMessage is sent
;===================================
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax, msg.wParam
ret
WinMain endp
; --==============================================
WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
IF_MSG WM_DESTROY, Do_destroy
IF_MSG WM_CREATE, Do_create
IF_MSG WM_PAINT, Do_paint
IF_MSG WM_COMMAND, Do_command
IF_MSG WM_LBUTTONDOWN, Do_LButtonDown
@return: ; ###################################################
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
@end:
xor eax, eax
jmp @return
Do_destroy: ; ################################################
invoke PostQuitMessage, NULL
jmp @end
Do_create: ; #################################################
jmp @end
Do_paint: ; ##################################################
jmp @end
Do_command: ; ################################################
jmp @end
Do_LButtonDown: ; ############################################
mov eax, lParam
mov edx, eax ; x point
and edx, 0ffffh
shr eax, 16 ; y point
invoke SendMessage, hWnd, WM_CLOSE, NULL, NULL
jmp @end
WndProc endp
; --==============================================
end start
CreateBlankWindow MACRO CName:REQ, CDisp:REQ, Prc:REQ
.data
szThisClassName db CName,0
szThisDisplayName db CDisp,0
.code
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, Prc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,0
mov wc.lpszClassName,offset szThisClassName
invoke LoadIcon,hInst, IDI_MAINICON
mov hIcon,eax
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,0,IDC_ARROW
mov wc.hCursor,eax
push hInstance
pop wc.hInstance
invoke RegisterClassEx,addr wc
invoke GetSystemMetrics,SM_CXSCREEN
sub eax, THIS_WIDTH
shr eax,1
mov ebx,eax
invoke GetSystemMetrics,SM_CYSCREEN
sub eax, THIS_HEIGHT
shr eax,1
invoke CreateWindowEx,WS_EX_TOPMOST,addr szThisClassName,addr szThisDisplayName,WS_POPUP or\
WS_SYSMENU,ebx,eax,THIS_WIDTH,THIS_HEIGHT,0,0,hInst,0
EXITM <eax>
ENDM
IF_MSG MACRO WMsg:REQ, DoJmp:REQ
cmp uMsg, WMsg
jz DoJmp
ENDM
.586
.model flat,stdcall
option casemap:none
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
includelib kernel32.lib
includelib user32.lib
WM_CASE macro reg,msgs
irp msg,<msgs>
cmp reg,WM_&msg
je @@&msg
endm
endm
.code
start:
WndProc proc hWnd,uMsg,wParam,lParam
WM_CASE eax,<CREATE,COMMAND,SIZE,PAINT,CLOSE>
invoke DefWindowProc,hWnd,eax,wParam,lParam
@@CREATE:
xor eax,eax
ret
@@COMMAND:
ret
@@SIZE:
xor eax,eax
ret
@@PAINT:
ret
@@CLOSE:
ret
WndProc endp
end start
.586
.model flat,stdcall
option casemap:none
include C:\masm32\include\windows.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\kernel32.inc
includelib kernel32.lib
includelib user32.lib
WM_CASE macro reg,msgs
irp msg,<msgs>
cmp reg,WM_&msg
je @@&msg
endm
endm
.data
.data?
.code
start:
.IF eax == WM_CREATE
add ecx,ecx
ret
.ELSEIF eax == WM_DESTROY
add edx,edx
ret
.ELSEIF eax == WM_PAINT
xor ecx,ecx
ret
.ELSEIF eax ==WM_COMMAND
ret
.ENDIF
WM_CASE <CREATE,DESTROY,PAINT,COMMAND>
@@CREATE: ADD ECX,ECX
RET
@@PAINT: ADD EDX,EDX
RET
@@DESTROY: XOR ECX,ECX
@@COMMAND: RET
call ExitProcess
end start.
;;
;; MAIN WINDOW MESSAGES
;;
.CONST
MainMsg DWORD WM_NOTIFY, WM_COMMAND, WM_MENUSELECT,
WM_SIZING, WM_ENTERSIZEMOVE, WM_WINDOWPOSCHANGED,
WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN,
WM_KEYDOWN, WM_CANCELMODE,
WM_ERASEBKGND, WM_ACTIVATE,
WM_CREATE, WM_CLOSE, WM_DESTROY,
WM_SYSCOLORCHANGE, WM_SETTINGCHANGE
DWORD MainWM_NOTIFY, MainWM_COMMAND, MainWM_MENUSELECT,
MainWM_SIZING, MainWM_ENTERSIZEMOVE, MainWM_WINDOWPOSCHANGED,
MainWM_MOUSEMOVE, MainWM_LBUTTONDOWN, MainWM_LBUTTONUP, MainWM_RBUTTONDOWN,
MainWM_KEYDOWN, MainWM_CANCELMODE,
MainWM_ERASEBKGND, MainWM_ACTIVATE,
MainWM_CREATE, MainWM_CLOSE, MainWM_DESTROY,
MainWM_SYSCOLORCHANGE, MainWM_SETTINGCHANGE
;Equates used to simplify references to window procedure parameters
lParam TEXTEQU <esp+4+4>
wParam TEXTEQU <esp+4+8>
uMsg TEXTEQU <esp+4+12>
hWnd TEXTEQU <esp+4+16>
.CODE
MainWND PROC
push edi
mov eax,[uMsg]
mov ecx,LENGTHOF MainMsg
mov edi,OFFSET MainMsg
repne scasd
je Process
Default:
pop edi
jmp [DefWindowProc]
; ELSE process this message possibly setting carry flag for default processing
ALIGN 4
Process:
call DWORD PTR [edi+(SIZEOF MainMsg-4)]
jc Default
Return:
pop edi
ret 10h
MainWND ENDP
Maybe, we could prefetch the data to speed it up. :)