您的位置:首页 > 其它

用RadASM 开发窗口程序

2016-05-20 19:09 375 查看
用RadASM新建一个项目;选择Win32exe模板;

一 在窗体上输出文字

在.data区添加

szText db
'小狗狗,小兔兔,小猫猫 !',0

在WM_PAINT消息处理段中添加

invoke
BeginPaint,hWnd,addr @stPs
mov @hDc,eax

invoke
GetClientRect,hWnd,addr @stRect
invoke
DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke
EndPaint,hWnd,addr @stPs

实现在窗体上输出文字;

二 获取Windows目录和系统目录并在窗体上输出

在.data?段添加

   bufferw db 50 dup(?)

   buffers db 50 dup(?)

在WM_CREATE消息处理段添加,

invoke GetWindowsDirectory, addr bufferw, sizeof bufferw ; 置Windows目录于缓冲区中

invoke GetSystemDirectory, addr buffers, sizeof buffers ;置系统目录于缓冲区中

在WM_PAINT消息处理段添加,

invoke DrawText,@hDc,addr bufferw,-1,\
addr @stRect,\
DT_SINGLELINE or DT_VCENTER or DT_LEFT

invoke
DrawText,@hDc,addr buffers,-1,\
addr @stRect,\
DT_SINGLELINE or DT_VCENTER or DT_RIGHT

三 在窗体上画圆

添加一个画圆过程circle,代码见后;
在WM_PAINT消息处理段添加,
invoke  circle,hWnd,00E5C27Fh,10,10,50,50

效果;



代码:
windemo1.asm

.586
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc

includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.data
ClassName db "MainWinClass",0
AppName  db "Main Window",0
szText		db	'小狗狗,小兔兔,小猫猫 !',0
hCap db "WindowsDirectory",0

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
bufferw db 50 dup(?)
buffers db 50 dup(?)

.code

; ---------------------------------------------------------------------------

circle proc hndl:DWORD,colr:DWORD,tx:DWORD,ty:DWORD,lx:DWORD,ly:DWORD

LOCAL hDC     :DWORD
LOCAL hPen    :DWORD
LOCAL hPenOld :DWORD

invoke GetDC,hndl
mov hDC, eax

invoke CreatePen,0,3,colr
mov hPen, eax

invoke SelectObject,hDC,hPen
mov hPenOld, eax

invoke Arc,hDC,tx,ty,lx,ly,0,0,0,0

invoke SelectObject,hDC,hPenOld
invoke DeleteObject,hPen

ret

circle endp

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:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND

mov   wc.cbSize,SIZEOF WNDCLASSEX
mov   wc.style, CS_HREDRAW or CS_VREDRAW
mov   wc.lpfnWndProc, OFFSET WndProc
mov   wc.cbClsExtra,NULL
mov   wc.cbWndExtra,NULL
push  hInstance
pop   wc.hInstance
mov   wc.hbrBackground,COLOR_BTNFACE+1
mov   wc.lpszMenuName,NULL
mov   wc.lpszClassName,OFFSET ClassName

invoke LoadIcon,NULL,IDI_APPLICATION
mov   wc.hIcon,eax
mov   wc.hIconSm,eax

invoke LoadCursor,NULL,IDC_ARROW
mov   wc.hCursor,eax

invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,300,200,NULL,NULL,\
hInst,NULL
mov   hwnd,eax

invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd

.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW

mov     eax,msg.wParam
ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local	@stPs:PAINTSTRUCT
local	@stRect:RECT
local	@hDc

.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke GetWindowsDirectory, addr bufferw, sizeof bufferw ; 置Windows目录于缓冲区中
invoke GetSystemDirectory, addr buffers, sizeof buffers ;置系统目录于缓冲区中

.ELSEIF	uMsg ==	WM_PAINT
invoke	BeginPaint,hWnd,addr @stPs
mov	@hDc,eax

invoke	GetClientRect,hWnd,addr @stRect
invoke	DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER

invoke	DrawText,@hDc,addr bufferw,-1,\
addr @stRect,\
DT_SINGLELINE or DT_VCENTER or DT_LEFT

invoke	DrawText,@hDc,addr buffers,-1,\
addr @stRect,\
DT_SINGLELINE or DT_VCENTER or DT_RIGHT

invoke  circle,hWnd,00E5C27Fh,10,10,50,50

invoke	EndPaint,hWnd,addr @stPs

.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF

xor eax,eax
ret
WndProc endp

end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  win32汇编 RadASM