Файл dmenu.asm
Ideal
P586
Radix |
16 |
Model |
flat |
|
|
struc |
WndClassEx |
|
cbSize |
dd |
0 |
|
style |
dd |
0 |
|
lpfnWndProc |
dd |
0 |
|
cbClsExtra |
dd |
0 |
|
cbWndExtra |
dd |
0 |
|
hInstance |
dd |
0 |
|
hIcon |
dd |
0 |
|
hCursor |
dd |
0 |
|
hbrBackground |
dd |
0 |
|
lpszMenuName |
dd |
0 |
|
lpszClassName |
dd |
0 |
|
hIconSm |
dd |
0 |
ends |
WndClassEx |
|
|
|
|
|
|
struct |
Point |
|
|
|
left |
dd |
0 |
|
top |
dd |
0 |
|
right |
dd |
0 |
|
bottom |
dd |
0 |
ends |
Point |
|
|
|
|
|
|
struct |
msgStruc |
dd |
0 |
|
hwnd |
dd |
0 |
|
message |
dd |
0 |
|
wParam |
dd |
0 |
|
lParam |
dd |
0 |
|
time |
dd |
0 |
|
pt |
dd |
0 |
ends |
msgStruc |
Point |
<> |
|
|
|
|
MyMenu |
= |
0065 |
ID_OPEN |
= |
9C41 |
ID_SAVE |
= |
9C42 |
ID_EXIT |
= |
9C43 |
|
|
|
CS_VREDRAW |
= |
0001 |
CS_HREDRAW |
= |
0002 |
IDI_APPLICATION |
= |
7F00 |
IDC_ARROW |
= |
7F00 |
COLOR_WINDOW |
= |
5 |
WS_EX_WINDOWEDGE |
= |
00000100 |
WS_EX_CLIENTEDGE |
= |
00000200 |
WS_EX_OVERLAPPEDWINDOW |
= |
WS_EX_WINDOWEDGE
OR WS_EX_CLIENTEDGE |
WS_OVERLAPPED |
= |
00000000 |
WS_CAPTION |
= |
00C00000 |
WS_SYSMENU |
= |
00080000 |
WS_THICKFRAME |
= |
00040000 |
WS_MINIMIZEBOX |
= |
00020000 |
WS_MAXIMIZEBOX |
= |
00010000 |
WS_OVERLAPPEDWINDOW |
= |
WS_OVERLAPPED
OR \ |
|
|
WS_CAPTION OR
\ |
|
|
WS_SYSMENU OR
\ |
|
|
WS_THICKFRAME
OR \ |
|
|
WS_MINIMIZEBOX
OR \ |
|
|
WS_MAXIMIZEBOX |
CW_USEDEFAULT |
= |
80000000 |
SW_SHOW |
= |
5 |
WM_COMMAND |
= |
0111 |
WM_DESTROY |
= |
0002 |
WM_CLOSE |
= |
0010 |
MB_OK |
= |
0 |
|
|
|
PROCTYPE |
ptGetModuleHandle |
stdcall
\ |
|
|
lpModuleName |
:dword |
|
|
|
|
PROCTYPE |
ptLoadIcon |
stdcall
\ |
|
|
hInstance |
:dword,
\ |
|
|
lpIconName |
:dword |
|
|
|
|
PROCTYPE |
ptLoadCursor |
stdcall
\ |
|
|
hInstance |
:dword,
\ |
|
|
lpCursorName |
:dword |
|
|
|
|
PROCTYPE |
ptLoadMenu |
stdcall
\ |
|
|
hInstance |
:dword,
\ |
|
|
lpMenuName |
:dword |
|
|
|
|
PROCTYPE |
ptRegisterClassEx |
stdcall
\ |
|
|
lpwcx |
:dword |
|
|
|
|
PROCTYPE |
ptCreateWindowEx |
stdcall
\ |
|
|
dwExStyle |
:dword,
\ |
|
|
LpClassName |
:dword,
\ |
|
|
lpWindowName |
:dword,
\ |
|
|
dwStyle |
:dword,
\ |
|
|
x |
:dword,
\ |
|
|
y |
:dword,
\ |
|
|
nWidth |
:dword,
\ |
|
|
nHeight |
:dword,
\ |
|
|
hWndParent |
:dword,
\ |
|
|
hMenu |
:dword,
\ |
|
|
hInstance |
:dword,
\ |
|
|
lpParam |
:dword |
|
|
|
|
PROCTYPE |
ptShowWindow |
stdcall
\ |
|
|
nWnd |
:dword,
\ |
|
|
nCmdShow |
:dword |
|
|
|
|
PROCTYPE |
ptUpdateWindow |
stdcall\ |
|
|
hWnd |
:dword |
|
|
|
|
PROCTYPE |
ptGetMessage |
stdcall\ |
|
|
pMsg |
:dword,
\ |
|
|
hWnd |
:dword,
\ |
|
|
wMsgFilterMin |
:dword,
\ |
|
|
wMsgFilterMax |
:dword |
|
|
|
|
PROCTYPE |
ptTranslateMessage |
stdcall
\ |
|
|
lpMsg |
:dword |
|
|
|
|
PROCTYPE |
ptDispatchMessage |
stdcall
\ |
|
|
pmsg |
:dword |
|
|
|
|
PROCTYPE |
ptSetMenu |
stdcall
\ |
|
|
hWnd |
:dword,\ |
|
|
hMenu |
:dword |
|
|
|
|
PROCTYPE |
ptPostQuitMessage |
stdcall
\ |
|
|
nExitCode |
:dword |
|
|
|
|
PROCTYPE |
ptDefWindowProc |
stdcall
\ |
|
|
hWnd |
:dword,\ |
|
|
Msg |
:dword,\ |
|
|
wParam |
:dword,\ |
|
|
lParam |
:dword |
|
|
|
|
PROCTYPE |
ptSendMessage |
stdcall
\ |
|
|
hWnd |
:dword,\ |
|
|
Msg |
:dword,\ |
|
|
wParam |
:dword,\ |
|
|
lParam |
:dword |
|
|
|
|
PROCTYPE |
ptMessageBox |
stdcall
\ |
|
|
hWnd |
:dword,\ |
|
|
lpText |
:dword,\ |
|
|
lpCaption |
:dword,\ |
|
|
uType |
:dword |
|
|
|
|
PROCTYPE |
ptExitProcess |
stdcall
\ |
|
|
exitCode |
:dword |
|
|
|
|
extrn |
GetModuleHandleA |
:pt:GetModuleHandle |
extrn |
LoadIconA |
:ptLoadIconA |
extrn |
LoadCursorA |
:ptLoadCursorA |
extrn |
RegisterClassExA |
:ptRegisterClassExA |
extrn |
LoadMenuA |
:ptLoadMenuA |
extrn |
CreateWindowExA |
:ptCreateWindowExA |
extrn |
ShowWindow |
:ptShowWindow |
extrn |
UpdateWindow |
:ptUpdateWindow |
extrn |
GetMessageA |
:ptGetMessageA |
extrn |
TranslateMessage |
:ptTranslateMessage |
extrn |
DispatchMessageA |
:ptDispatchMessageA |
extrn |
SetMenu |
:ptSetMenu |
extrn |
PostQuitMessage |
:ptPostQuitMessage |
extrn |
DefWindowProcA |
:ptDefWindowProcA |
extrn |
SendMessageA |
:ptSendMessageA |
extrn |
MessageBoxA |
:ptMessageBoxA |
extrn |
ExitProcess |
:ptExitProcess |
extrn |
|
|
|
|
|
UDataSeg |
hInst |
dd |
? |
|
hWnd |
dd |
? |
|
|
|
|
IFNDEF
VER1 |
hMenu |
dd |
? |
|
ENDIF |
|
|
|
DataSeg |
msg |
msgStruc |
<> |
classTitle |
db |
'Menu
demo' |
,0 |
wndTitle |
db |
'Demo
program' |
,0 |
msg_open_txt |
db |
'You
selected open' |
,0 |
msg_open_tlt |
db |
'Open
box' |
,0 |
msg_save_txt |
db |
'You
selected save' |
,0 |
msg_save_tlt |
db |
'Save
box' |
,0 |
|
|
|
CodeSeg |
|
|
Start: |
call |
GetModuleHandleA,
0 |
; не обязательно,
но желательно |
|
mov |
[hInst],eax |
|
|
sub |
esp,SIZE WndClassEx |
; отведём место
в стеке под структуру |
|
mov |
[(WndClassEx
esp).cbSize],SIZE WndClassEx |
|
mov |
[(WndClassEx
esp).style],CS_HREDRAW or CS_VREDRAW |
|
mov |
[(WndClassEx
esp).lpfnWndProc],offset WndProc |
|
mov |
[(WndClassEx
esp).cbWndExtra],0 |
|
mov |
[(WndClassEx
esp).cbClsExtra],0 |
|
mov |
[(WndClassEx
esp).hInstance],eax |
|
call |
LoadIconA,
0, IDI_APPLICATION |
|
mov |
[(WndClassEx
esp).hIcon],eax |
|
call |
LoadCursorA,
0, IDC_ARROW |
|
mov |
[(WndClassEx
esp).hCursor],eax |
|
mov |
[(WndClassEx
esp).hbrBackground],COLOR_WINDOW |
IFDEF VER1 |
|
mov |
[(WndClassEx
esp).lpszMenuName],MyMenu |
ELSE |
|
mov |
[(WndClassEx
esp).lpszMenuName],0 |
ENDIF |
|
mov |
[(WndClassEx
esp).lpszClassName],offset classTitle |
|
mov |
[(WndClassEx
esp).hIconSm],0 |
|
call |
RegisterClassExA,
esp |
; зарегистрируем
класс окна |
|
add |
esp,SIZE WndClassEx |
; восстановим
стек |
|
|
|
; и создадим
окно |
IFNDEF
VER2 |
call |
|
CreateWindowExA, |
WS_EX_OVERLAPPEDWINDOW, |
\ extended window style |
|
|
offset
classTitle,
\ pointer to registered class
name |
|
|
offset
wndTitle, \
pointer to window name |
|
|
WS_OVERLAPPEDWINDOW, |
\
window style |
|
|
CW_USEDEFAULT,
\ horizontal
position of window |
|
|
CW_USEDEFAULT,
\ vertical position
of window |
|
|
CW_USEDEFAULT,
\ window width |
|
|
CW_USEDEFAULT,
\ window height |
|
|
0,
\ handle
to parent or owner window |
|
|
0,
\ handle to
menu, or child-window identifier |
|
|
[hInst],
\ handle to
application instance |
|
|
0
; pointer to window-creation
data |
ELSE |
call |
LoadMenu, |
hInst |
MyMenu |
mov |
[hMenu],eax |
|
|
call |
|
|
|
|
CreateWindowExA |
WS_EX_OVERLAPPEDWINDOW,
\ extended window style |
|
|
offset classTitle,
\ pointer to registered class
name |
|
|
offset wndTitle,
\ pointer to window name |
|
|
WS_OVERLAPPEDWINDOW,
\ window style |
|
|
CW_USEDEFAULT,
\ horizontal position of window |
|
|
CW_USEDEFAULT,
\ vertical position of window |
|
|
CW_USEDEFAULT,
\ window width |
|
|
CW_USEDEFAULT,
\ window height |
|
|
0,
\ handle to
parent or owner window |
|
|
eax,
\ handle to
menu, or child-window identifier |
|
|
[hInst], \ handle
to application instance |
|
|
0
; pointer to
window-creation data |
|
|
|
|
|
mov |
|
[hMenu],eax |
|
|
call |
ShowWindow, |
eax,
SW_SHOW |
; show window |
|
|
UpdateWindow, |
[hWnd] |
; redraw window |
|
IFDEF VER3 |
|
call |
LoadMenuA, |
[hInst], MyMenu |
|
mov |
[hMenu],eax |
|
|
call |
SetMenu |
[hWnd], eax |
ENDIF |
|
msg
loop: |
|
call |
GetMessageA, |
offset
msg, |
0,
0, 0 |
|
or |
ax,ax |
|
|
jz |
exit |
|
|
call |
TranslateMessage, |
offset msg, |
|
call |
DispatchMessageA, |
offset msg, |
|
jmp |
msg
loop |
|
exit: |
|
call |
ExitProcess, |
0 |
|
|
|
public |
stdcall
WndProc |
proc |
WndProc
stdcall |
arg |
@@hwnd:
dword, @@msg: dword, @@wPar:
dword, @@lPar: dword |
|
mov |
eax,[@@msg] |
|
cmp |
eax,WM_COMMAND |
|
je |
@@command |
|
cmp |
eax,WM_DESTROY |
|
jne |
@@default |
|
call |
PostQuitMessage,
0 |
|
xor |
eax,eax |
|
jmp |
@@ret |
@@default |
|
call |
DefWindowProcA,
[@@hwnd], [@@msg], [@@wPar],
[@@lPar] |
@@ret |
ret |
|
@@command: |
|
mov |
eax,[@@wPar] |
|
cmp |
eax, ID_OPEN |
|
je |
@@open |
|
cmp |
eax, ID_SAVE |
|
je |
@@save |
|
call |
SendMessageA,
[@@hwnd], WM_CLOSE, 0, 0 |
|
xor |
eax, eax |
|
jmp |
@@ret |
@@open: |
|
mov |
eax, offset msg_open_txt |
|
mov |
edx, offset msg_open_tlt |
|
jmp |
@@mess |
@@save: |
|
mov |
eax, offset msg_save_txt |
|
mov |
edx, offset msg_save_tlt |
@@mess: |
|
call |
MessageBoxA,
0, eax, edx, MB_OK |
|
xor |
eax,eax |
|
jmp |
@@ret |
endp
WndProc |
endStart |
|
|