;運行效果
;win32匯編環境,對多行編輯框添加或刪除文本
;主要要先設置文本的開始點與結束點,然后把一段文本頂替上去。沒有添加文本或刪除文本的概念,只有頂替。如果開始點與結束點都是前面文本的長度值,則成了從后面添加文本的效果。如果結束點大于開始點,則變成刪除
;直接抄進RadAsm可編譯運行。重點部分加備注。
;下面為asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386?
.model flat,stdcall?
option casemap:none?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定義;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include ? ?windows.inc?
include ? ?user32.inc?
include ? ?kernel32.inc?
includelib user32.lib?
includelib kernel32.lib?
; 自定義函數聲明;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ? ;對話框窗口函數
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 數據段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
DlgName ? ? ? ? ? db "MyDialog",0?
szTitle ? ? ? ? ? db "提示",0?
szHello01 ? ? ? ? db "我是后面添加的字符串",0
.data??
hInstance HINSTANCE ? ? ? ? ? ? ??
hEdit01 ? dd ? ? ? ? ? ? ? ? ? ??
.const?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定義
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ? ?equ 1000 ? ?;圖標
ID_EDIT01 ? equ 11 ? ? ?;編輯框控件標識符
IDB01 ? ? ? equ 21 ? ? ?;按鈕控件標識符
IDB02 ? ? ? equ 22 ? ?
; 代碼段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code?
start: ? ??
? ? ? ? invoke GetModuleHandle, NULL ? ??
? ? ? ? mov ? ?hInstance,eax ? ??
? ? ? ? invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL ? ??
? ? ? ? invoke ExitProcess,eax?
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ?
? ? ? ? LOCAL ? @szBuffer[1024]:byte
? ? ? ? LOCAL ? @szBuffer01[1024]:byte
? ? ? ? LOCAL ? @AllCount
? ? ? ??
? ? ? ?.if ? ? ?uMsg == WM_INITDIALOG ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? invoke ? ?LoadIcon,hInstance,ICO_MAIN ? ?;加載圖標 ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? invoke ? ?SendMessage,hWnd,WM_SETICON,ICON_BIG,eax?
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? invoke ?GetDlgItem,hWnd,ID_EDIT01
? ? ? ? ? ? ? ? ? ? ? ? mov hEdit01,eax
? ? ? ? .elseif uMsg == WM_COMMAND ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? mov eax,wParam ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? .if ax == IDB01 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?;添加文本操作 ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? invoke ?GetWindowTextLength,hEdit01
? ? ? ? ? ? ? ? ? ? ? ? mov @AllCount,eax
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? invoke SendMessage,hEdit01,EM_SETSEL ,@AllCount,@AllCount ? ? ? ?;后面兩個參數為所選文本的開始點與結束點,如果把它們都置為前面所有文本的長度值,則從前面文本的最后一個字符開始,即成為添加文本的操作
? ? ? ? ? ? ? ? ? ? ? ? ;invoke SendMessage,hEdit01,EM_SETSEL ,-1,-1 ? ? ? ? ? ? ? ? ? ? ;把上句換成此句,效果一樣。-1的值指全部文本。
? ? ? ? ? ? ? ? ? ? ? ? invoke SendMessage,hEdit01,EM_REPLACESEL,FALSE,addr szHello01 ? ?;把第一段文本發送給控件,EM_REPLACESEL是頂替所選文本內容的操作,嚴格上來說不是添加文本,而是代替。只不過代替的地方是最后字符的后面。但同樣實現了目地。?
? ? ? ? ? ? ? ? .elseif ax == IDB02 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?;刪除文本操作
? ? ? ? ? ? ? ? ? ? ? ? invoke ?GetWindowTextLength,hEdit01
? ? ? ? ? ? ? ? ? ? ? ? mov @AllCount,eax
? ? ? ? ? ? ? ? ? ? ? ? invoke lstrlen,addr szHello01
? ? ? ? ? ? ? ? ? ? ? ? mov ebx,eax
? ? ? ? ? ? ? ? ? ? ? ? mov eax,@AllCount
? ? ? ? ? ? ? ? ? ? ? ? sub eax,ebx
? ? ? ? ? ? ? ? ? ? ? ? invoke SendMessage,hEdit01,EM_SETSEL ,eax,@AllCount?
? ? ? ? ? ? ? ? ? ? ? ? invoke SendMessage,hEdit01,EM_REPLACESEL,FALSE,0
? ? ? ? ? ? ? ? .endif ? ? ? ? ? ? ?
? ? ? ? .elseif uMsg == WM_CLOSE ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? invoke EndDialog, hWnd,NULL ? ? ? ??
? ? ? ? .else ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? mov eax,FALSE ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ret ? ? ? ? ? ? ? ??
? ? ? ? .endif ? ? ? ? ? ? ? ??
? ? ? ? mov eax,TRUE ? ? ? ??
? ? ? ? ret?
DlgProc endp?
end start?
;下面為rc文件內容
#include "resource.h" ? ? ? ? ? ? ?//提示缺少該文件,可以在資源里下載
#define ? ?ICO_MAIN ? ? ? ?1000 ? ?//圖標
#define ? ?ID_EDIT01 ? 11 ? ? ? ? //編輯框標識符
#define ? ?IDB01 ? ? ? 21 ? ? ? ? ?//按鈕標識符
#define ? ?IDB02 ? ? ? 22
??
ICO_MAIN ? ?ICON ? ? ? ?"Main.ico"
//定義對話框
MyDialog DIALOG 10, 10, 140, 140?
STYLE ?DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK?
CAPTION "對話框程序模版"
BEGIN
? ? ?CONTROL "我是多行編輯框,按回車可以換行",ID_EDIT01,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL|WS_VSCROLL,10, 10, 120, 70,WS_EX_CLIENTEDGE ?//設置成多行編輯框,按回車時加回車符
? ? ?
? ? ?CONTROL "添加一段文字至編輯框",IDB01,"Button",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,10,90,120,14
? ? ?CONTROL "把剛才添加的內容刪了",IDB02,"Button",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,10,110,120,14?
END?
?