³o¤@³¹¡A±N¤¶²Ð¦bµ{¦¡¤¤¥[¤J¦Û¤v³]pªº¡y¹Ï¥Ü¡z( icon )¡A¦Ó¤£¨Ï¥Î¨t²Î¤¤¤º©wÈ¡C¥[¤J¹Ï¥Ü«áªºµ{¦¡¥i¥H¦b®à±¤W¡B¸ê®Æ§¨ùØÅã¥Ü³oӹϥܡA¦P®Éµ{¦¡°õ¦æ®É¡A¯à¦b¼ÐÃDÄæ³BÅã¥Ü³oӹϥܡC
´N¦p¦P¤W¤@³¹´¿»´»´¦a´£¨ì¡A¹Ï¥Ü¤]¬OÄÝ©ó UI ¸ê·½ªº¤@ºØ¡Cn¦bµ{¦¡¤¤¥[¤J¹Ï¥Ü¡A¥²¶·¥ý³]p¦n¤@Ó·sªº¹Ï¥ÜÀÉ¡A¨ä°ÆÀɦW³q±`¬O *.ico¡A±z¥i¥H¥Î¹Ï¥Ü½s¿è¾¹¦Û¦æÃ¸»s¹Ï¥ÜÀÉ¡A¤]¥i¥H¦bºô»Úºô¸ô¤W´M§ä«e½ṳ́w»s§@¦nªº¹Ï¥ÜÀÉ¡C
»s§@¦n©Î§ä¨ì¤¤·Nªº¹Ï¥ÜÀÉ«á¡A¦b¸ê·½´yzÀɤ¤¥[¤W¤@¬q¦³Ãö¹Ï¥Üªº´yz¡A¨ä®æ¦¡¦p¤U¡G
nameID ICON filename
ICON ¬O©T©wªº¡Aªí¥Ü¦¹¬q¸¨¬O´y¬O¹Ï¥Ü¤§¥Î¡CnameID ¬O¹Ï¥Üªº¦WºÙ©ÎÃѧO½X¡A¥i¥H¬O¤@Ó¦r¦ê¡A¤]¥i¥H¬O¤@Ó¤p©ó 65535 ªº¥¿¾ã¼Æ¡A±N¨Ó¦bµ{¦¡¤¤¾a nameID »Pµ{¦¡½X³s±µ¡Cfilename ¬O¹Ï¥ÜÀÉ¡A¤@¯ë°ÆÀɦW¬° *.ico¡A°²¦p¹Ï¥ÜÀɤ£¦b²{¦æ¤l¥Ø¿ý¤º¡Afilename ¤]¥i¥H¥]§t¸ô®|¡C
¦bì©lµ{¦¡¤¤«h¥H LoadIcon API ¨Ïµ{¦¡¦Û UI ¸ê·½¤¤¸ü¤J¹Ï¥Ü¡CLoadIcon ªºì«¬½Ð°Ñ¦Ò²Ä¤G³¹¦³Ãö LoadIcon API ªº»¡©ú¡C¦ý¦¹³B¤£¬On¸ü¤J¨t²Î¹w³]È¡A©Ò¥H¥²¶·¥ý¦b¸ê®ÆÂ_¤¤³]©w¤@Ó¥H NULL µ²§Àªº¦r¦ê¡A¦Ó¦¹¦r¦ê´N¬O¹Ï¥Ü¦WºÙ¡A¤]´N¬O¦b¸ê·½´yzÀɤ¤ªº nameID¡C
©³¤U³oÓ¨Ò¤l¡A±N¬°«e¤@³¹ªº DRAW.EXE ¥[¤W¹Ï¥Ü¡A¥[¤W¹Ï¥Ü«áªº¥i°õ¦æÀɺ٬° DRAW2.EXE¡C©Ò¥[¤Jªº¹Ï¥ÜÀɦW¬° elephant.ico¡A¦p¤U¹Ï¡G
#define IDM_Exit 10
#define IDM_Line 21
#define IDM_Ellipse 22
#define IDM_Trace 23
#define IDM_Red 24
#define IDM_Green 25
#define IDM_Blue 26
DRAW MENU
{
MENUITEM "Â÷¶}(&E)",IDM_Exit
POPUP "ø¹Ï(&D)"
{
MENUITEM "½u¬q(&L)",IDM_Line
MENUITEM "¾ò¶ê(&E)",IDM_Ellipse
MENUITEM "¤âø¹Ï(&T)",IDM_Trace
MENUITEM SEPARATOR
MENUITEM "¬õ(&R)",IDM_Red
MENUITEM "ºñ(&G)",IDM_Green
MENUITEM "ÂÅ(&B)",IDM_Blue
}
}
TinyDraw ICON elephant.ico
DRAW2.ASM ¨Ó·½Àɤº®e¦p¤U¡G
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include gdi32.inc
include kernel32.inc
includelib user32.lib
includelib gdi32.lib
includelib kernel32.lib
IDM_Exit equ 10 ;12 ¿ï¶µ½s¸¹
IDM_Line equ 21
IDM_Ellipse equ 22
IDM_Trace equ 23
IDM_Red equ 24
IDM_Green equ 25
IDM_Blue equ 26
red_color equ 0ffh ;19 ÃC¦â
green_color equ 0ff00h
blue_color equ 0ff0000h
WndProc proto :HWND,:UINT,:WPARAM,:LPARAM
.DATA
ClassName db 'SimpleWinClass',0
AppName db '¤p¤pø¹Ïµ{¦¡',0
AskExit db '¬O§_°h¥X¦¹µ{¦¡¡H',0
AskExitTitle db '¸ß°Ý',0
MenuName db 'DRAW',0
IconName db 'TinyDraw',0
PenDown db FALSE ;31 FALSE¡Jµeµ§´£°_¡ATRUE¡Jµeµ§Ä²¯È
command dw IDM_Line ;32 ¨Ï¥ÎªÌ¥Ñ¿ï³æ¿ï¾Üªº©R¥O
color dd red_color ;33 ¨Ï¥ÎªÌ¥Ñ¿ï³æ¿ï¾ÜªºÃC¦â
hMenu HMENU ?
hInstance HINSTANCE ?
hwnd HWND ?
wc WNDCLASSEX <30h,?,?,0,0,?,?,?,?,0,offset ClassName,?>
msg MSG <?>
start_point POINT <?> ;39 °_ÂI®y¼Ð
end_point POINT <?> ;40 ²×ÂI®y¼Ð
.CODE
start: invoke GetModuleHandle,NULL
mov hInstance,eax
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,offset WndProc
mov eax,hInstance
mov wc.hInstance,eax
mov wc.hbrBackground,COLOR_WINDOW+1
invoke LoadIcon,hInstance,offset IconName
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke LoadMenu,hInstance,offset MenuName ;55 ¨ú±o¿ï³æ
mov hMenu,eax
invoke RegisterClassEx,offset wc
invoke CreateWindowEx,NULL,offset ClassName,\
offset AppName,WS_OVERLAPPEDWINDOW,0,\
0,400,400,0,hMenu,hInstance,NULL ;60 ¥[¤W¿ï³æ
mov hwnd,eax
invoke ShowWindow,hwnd,SW_SHOWNORMAL
invoke UpdateWindow,hwnd
.while TRUE
invoke GetMessage,offset msg,NULL,0,0
.break .if !eax
invoke DispatchMessage,offset msg
.endw
mov eax,msg.wParam
invoke ExitProcess,eax
;---------------------------------------
;pºâ EAX ¤ºªº®y¼Ð¡A¦s©ó EDX ©Ò«üªº¦ì§}¡AEAX¡J°ª¦ì¤¸¬° Y ®y¼Ð¡A§C¦ì¤¸¬° X ®y¼Ð
get_crd proc
push eax
and eax,0ffffh
mov [edx],eax
pop eax
shr eax,10h
mov [edx+4],eax
ret
get_crd endp
;---------------------------------------
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
local rectangle:RECT
local PS:PAINTSTRUCT
local hdc:HDC
local newPen:DWORD
local oldPen:DWORD
.if uMsg==WM_COMMAND
mov eax,wParam
mov PenDown,FALSE
.if ax==IDM_Exit
jmp exit
.elseif (ax==IDM_Line)||(ax==IDM_Ellipse)||(ax==IDM_Trace)
mov command,ax
.elseif ax==IDM_Red
mov color,red_color
.elseif ax==IDM_Green
mov color,green_color
.elseif ax==IDM_Blue
mov color,blue_color
.endif
.elseif uMsg==WM_LBUTTONDOWN ;105 «ö¤U·Æ¹«¥ªÁä
.if (command==IDM_Line)||(command==IDM_Ellipse)
.if PenDown
mov eax,lParam ;108 µeµ§Ä²¯È®É
mov edx,offset end_point
call get_crd
invoke GetClientRect,hWnd,addr rectangle
invoke InvalidateRect,hWnd,addr rectangle,FALSE
.else
mov eax,lParam ;114 µeµ§´£°_®É
mov edx,offset start_point
call get_crd
.endif
.elseif command==IDM_Trace
.if (!PenDown)
mov eax,lParam
mov edx,offset start_point
call get_crd
.endif
.endif
xor PenDown,1 ;118 ¤Á´«µeµ§´£°_©ÎIJ¯È
.elseif uMsg==WM_MOUSEMOVE
.if (command==IDM_Trace)&&(PenDown)
mov eax,lParam
mov edx,offset end_point
call get_crd
invoke GetClientRect,hWnd,addr rectangle
invoke InvalidateRect,hWnd,addr rectangle,FALSE
.endif
.elseif uMsg==WM_PAINT
.if command==IDM_Line
invoke BeginPaint,hWnd,addr PS
mov hdc,eax
invoke CreatePen,PS_SOLID,1,color
mov newPen,eax
invoke SelectObject,hdc,newPen
mov oldPen,eax
invoke MoveToEx,hdc,start_point.x,start_point.y,NULL
invoke LineTo,hdc,end_point.x,end_point.y
invoke SelectObject,hdc,oldPen
invoke DeleteObject,newPen
invoke EndPaint,hdc,addr PS
.elseif command==IDM_Ellipse
invoke BeginPaint,hWnd,addr PS
mov hdc,eax
invoke CreatePen,PS_SOLID,1,color
mov newPen,eax
invoke SelectObject,hdc,newPen
mov oldPen,eax
mov eax,start_point.x
add eax,end_point.x
shr eax,1
push eax
invoke Arc,hdc,start_point.x,start_point.y,\ ;161 µe¥X¥b¾ò¶ê
end_point.x,end_point.y,eax,400,eax,0
pop eax
invoke Arc,hdc,start_point.x,start_point.y,\ ;164 µe¥X¥t¥~¤@¥b¾ò¶ê
end_point.x,end_point.y,eax,0,eax,400
invoke SelectObject,hdc,oldPen
invoke DeleteObject,newPen
invoke EndPaint,hdc,addr PS
.elseif command==IDM_Trace
invoke BeginPaint,hWnd,addr PS
mov hdc,eax
invoke CreatePen,PS_SOLID,1,color
mov newPen,eax
invoke SelectObject,hdc,newPen
mov oldPen,eax
invoke MoveToEx,hdc,start_point.x,start_point.y,NULL
invoke LineTo,hdc,end_point.x,end_point.y
invoke SelectObject,hdc,oldPen
invoke DeleteObject,newPen
invoke EndPaint,hdc,addr PS
mov eax,end_point.x
mov edx,end_point.y
mov start_point.x,eax
mov start_point.y,edx
.else
jmp def
.endif
.elseif uMsg==WM_CLOSE
exit: invoke MessageBox,NULL,offset AskExit,\
offset AskExitTitle,MB_YESNO or MB_ICONQUESTION
.if eax==IDYES
invoke DestroyWindow,hWnd
.endif
.elseif uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.else
def: invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start
DRAW2.MAK ¤§¤º®e¦p¤U¡G
# ²£¥Í DRAW2.EXE
ALL : DRAW2.EXE
# ²Õ;¹¤Î³sµ²¾¹
DRAW2.EXE : DRAW2.ASM DRAW2.RES
# ²Õ;¹·|¦Û°Ê¶Ç DRAW2.OBJ µ¹³sµ²¾¹¡A¬G /link ¤§«á¤£¥Î¦A¥[¤W DRAW2.OBJ
ml /coff DRAW2.ASM /link /SUBSYSTEM:WINDOWS DRAW2.RES
# ¸ê·½½s;¹
DRAW2.RES : DRAW2.RC elephant.ico
rc DRAW2.RC
²ÕͮɡA¶È»Ý¦b DOS ¼Ò¦¡¤U¿é¤J
d:\homepage\source>nmake -f draw2.mak [Enter]
Microsoft (R) Program Maintenance Utility Version 1.50
Copyright (c) Microsoft Corp 1988-94. All rights reserved.
ml /coff DRAW2.ASM /link /SUBSYSTEM:WINDOWS DRAW2.RES
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: DRAW2.ASM
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/SUBSYSTEM:WINDOWS /SUBSYSTEM:WINDOWS
"DRAW2.obj"
"/OUT:DRAW2.exe"
"DRAW2.RES"
d:\homepage\source>
´N¥i¥H±o¨ì DRAW2.EXE ÀÉ¡A¥´¶} DRAW2.EXE ©Ò¦b¸ê®Æ§¨¡AÀ˵ø¬Ý¬Ý¬O§_¹Ï¥Ü¤w¸g´«¦¨ elephant.ico ¤F¡G

µ{¦¡´X¥G©M¤W¤@³¹¬Û¦P¡A¦]¦¹¨ä¥L³¡¥÷´N¤£¦A¸ÑÄÀ¡A¦Ü©ó¥[¤J¹Ï¥Üªº³¡¥÷¡A±z¥unª`·Nì©lµ{¦¡¤¤¬õ¦âªº³¡¥÷´N¥i¥H¤F¡C