您的位置:首页 > 其它

用RadASM开发窗口程序(2)

2016-05-23 17:11 405 查看
首先用RadASM新建一个Win32exe程序,该程序仅是一个窗口。



.data段添加

   slEdit db "EDIT",0

   adrpoem db "七月七日长生殿,夜半无人私语时。",0

   adrnxz db "C:\南乡子.txt",0

.data?段添加

   hEdit1 dd
?

   hEdit2 dd


把RadASM附带的三个proc加入项目;

EditSl

Read_File_In

ofCallBack

看这三个过程的代码,其作用应该大体是:创建编辑框;读文件到编辑框;

在WM_CREATE消息处理中调用,

invoke EditSl,ADDR adrpoem,50,10,350,25,hWnd,700

invoke EditSl,NULL,50,50,350,175,hWnd,700

mov hEdit2,eax

invoke Read_File_In,hEdit2,addr adrnxz

创建文本框,再创建一个文本框,然后读入C盘一个文本文件到第二个编辑框;

构建,运行;



读入文件到编辑框没有成功;

在RadASM菜单中选择 在调试器中运行,看下情况;

也看不出啥,给的文件名是正确的;

那么这两个过程是干嘛的;Read_File_In和ofCallBack;前者调用的后者;下次再搞;

全部代码如下;

.586
.model flat,stdcall
option casemap:none

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

includelib user32.lib
includelib kernel32.lib

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

.data
ClassName db "MainWinClass",0
AppName  db "Main Window",0
slEdit db "EDIT",0
adrpoem db "七月七日长生殿,夜半无人私语时。",0
adrnxz db "C:\南乡子.txt",0

.data?
hInstance HINSTANCE ?
hEdit1		dd	?
hEdit2		dd	?
CommandLine LPSTR ?

.code

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

EditSl proc szMsg:DWORD,a:DWORD,b:DWORD,
wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD

; EditSl PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
; invoke EditSl,ADDR adrTxt,200,10,150,25,hWnd,700

invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR slEdit,szMsg,
WS_VISIBLE or WS_CHILDWINDOW or \
ES_AUTOHSCROLL or ES_NOHIDESEL,
a,b,wd,ht,hParent,ID,hInstance,NULL

ret

EditSl endp

Read_File_In proc hEdit:DWORD,lpszFileName:DWORD

LOCAL hFile :DWORD
LOCAL ofs   :OFSTRUCT
LOCAL est   :EDITSTREAM

invoke OpenFile,lpszFileName,ADDR ofs,OF_READ
mov hFile, eax

mov est.dwCookie, eax
mov est.dwError, 0
mov eax, offset ofCallBack
mov est.pfnCallback, eax

invoke SendMessage,hEdit,EM_STREAMIN,SF_TEXT,ADDR est
invoke CloseHandle,hFile

invoke SendMessage,hEdit,EM_SETMODIFY,0,0

mov eax, 0
ret

Read_File_In endp

ofCallBack proc dwCookie:DWORD,pbBuff:DWORD,cb:DWORD,pcb:DWORD

invoke ReadFile,dwCookie,pbBuff,cb,pcb,NULL

mov eax, 0
ret

ofCallBack 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,CW_USEDEFAULT,CW_USEDEFAULT,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

.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke EditSl,ADDR adrpoem,50,10,350,25,hWnd,700
invoke EditSl,NULL,50,50,350,175,hWnd,700
mov hEdit2,eax
invoke Read_File_In,hEdit2,addr adrnxz
;
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF

xor eax,eax
ret
WndProc endp

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