用RadASM 开发窗口程序

本文介绍使用RadASM创建Win32应用程序的过程,包括在窗体上显示文本、获取并显示Windows目录及系统目录,以及绘制圆形等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


用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








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值