用匯編寫基于對(duì)話框的程序,可以和寫VB程序一樣清晰簡(jiǎn)單,并且相當(dāng)多的程序都是這樣的結(jié)構(gòu)。用VB寫的所以程序幾乎都是這樣的
設(shè)計(jì)程序界面
和在VC中一樣,界面(對(duì)話框已經(jīng)各種控件)一般是以資源的方式存在的。編輯資源文件完全可以使用VC的資源編輯器。但是熟悉一下資源文件的寫法及意義是編程所必須的。下面是一個(gè)資源文件的例子:
#include "\masm32\include\resource.h"
#define IDC_EDIT 3000
#define IDC_BUTTON 3001
#define IDC_EXIT 3002
MyDialog DIALOG 10, 10, 205, 60
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "我的對(duì)話框"
{
EDITTEXT IDC_EDIT, 15,17,111,13, ES_AUTOHSCROLL | ES_LEFT
DEFPUSHBUTTON "顯示編輯框中的內(nèi)容", IDC_BUTTON, 141,10,52,13
PUSHBUTTON "退出程序", IDC_EXIT, 141,26,52,13
}
記住,在使用QE時(shí)為了使得編譯成功,必須將它保存為rsrc.rc這個(gè)文件名(使用命令行就無(wú)所謂了)。選擇Project->Compile Resource File。資源文件就編譯成功了,就可以被連接使用了。建議你用VC的資源編輯器打開(kāi)這個(gè)資源文件看看。
行的#include "\masm32\include\resource.h"就和C一樣,是包含一個(gè)頭文件,這個(gè)文件中有各種常數(shù)的定義,如
PUSHBUOTTON等,感興趣的話,可以打開(kāi)這個(gè)文件看看。
接下來(lái)定義了一些常數(shù),就和C中的用法一樣,是為了增強(qiáng)程序的可讀性。
"MyDialog DIALOG 10, 10, 205, 60"這一句用DIALOG這個(gè)關(guān)鍵字定義一個(gè)名為MyDialog的對(duì)話框,名字當(dāng)然可以隨便取。后面 的4個(gè)數(shù)字是對(duì)話框的位置大小,一般是在資源編輯器中調(diào)試。
"STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK "是描述對(duì)話框的風(fēng)格的。如WS_MINIMIZEBOX是說(shuō)有小化按鈕。DS_3DLOOK是說(shuō)對(duì)話框是3D外形
等等。這些一般在資源編輯器中改動(dòng),各種常數(shù)的意義,可以在MSDN中查找。
CAPTION "我的對(duì)話框"就是指定對(duì)話框的標(biāo)題是"我的對(duì)話框"
再下面用{}框起來(lái)的就是對(duì)話框中的各個(gè)控件。這個(gè)例子中用到了EDITTEXT編輯框控件,PUSHBUTTON按鈕控件,
DEFPUSHBUTTON默認(rèn)按鈕控件(默認(rèn)選中狀態(tài)),IDC_EDIT,IDC_EXIT,IDC_BUTTON分別是他們3個(gè)的ID號(hào),注意上面的定義,是不能相同的。不一定非要使用#define來(lái)預(yù)先定義,使用數(shù)字也可以,前者可以增強(qiáng)程序的可讀性。其他的很多控件如單選框,復(fù)選框等等的使用可以在資源編輯器下編輯后查看源代碼獲得。
程序的界面就設(shè)計(jì)完了,接下來(lái)是設(shè)計(jì)程序。
程序的設(shè)計(jì)
我們來(lái)做一個(gè)簡(jiǎn)單的程序,在按下“顯示編輯框中的內(nèi)容”這個(gè)按鈕時(shí),將彈出一個(gè)消息框顯示現(xiàn)在編輯框中的內(nèi)容。按“退出程序”按鈕將退出程序。
.386
.model flat,stdcall
option casemap:none
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
. data
DlgName db "MyDialog",0
AppName db "My own dialog",0
.data?
hInstance HINSTANCE ?
buffer db 512 dup(?)
.const
IDC_EDIT equ 3000
IDC_BUTTON equ 3001
IDC_EXIT equ 3002
.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
.IF uMsg==WM_INITDIALOG
invoke GetDlgItem, hWnd,IDC_EDIT
invoke SetFocus,eax
.ELSEIF uMsg==WM_CLOSE
invoke EndDialog, hWnd,NULL
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF eax==IDC_BUTTON
invoke GetDlgItemText,hWnd,IDC_EDIT,ADDR buffer,512
invoke MessageBox,NULL,ADDR buffer,ADDR AppName,MB_OK
.ELSEIF ax==IDC_EXIT
invoke EndDialog, hWnd,NULL
.ENDIF
.ELSE
mov eax,FALSE
ret
.ENDIF
mov eax,TRUE
ret
DlgProc endp
end start
猛一看,這個(gè)程序挺長(zhǎng)的,如果用VB實(shí)現(xiàn)這個(gè)功能的話,大概只需要寫5-6行。但是,這個(gè)程序中相當(dāng)一部分代碼是固定的,也就是說(shuō),寫任何基于對(duì)話框的程序都需要這樣寫。VB中正是VB的編譯器自動(dòng)幫你做了這些工作。
.386; 聲明使用386指令系統(tǒng)
.model flat,stdcall;聲明內(nèi)存的尋址方式
option casemap:none;聲明是否對(duì)大小寫敏感
;上面3行可以認(rèn)為是固定的,必須的
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
;..........此處聲明自己定義的函數(shù),上面的這個(gè)是對(duì)話框的主函數(shù)(必須有),名字可以換成別的
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
;...........此處包含需要的頭文件,上面幾個(gè)是長(zhǎng)用到的
.data
DlgName db "MyDialog",0
AppName db "My own dialog",0
;............這里定義各個(gè)預(yù)先賦值的變量,db是定義一個(gè)字節(jié)長(zhǎng),dw是定義一個(gè)字長(zhǎng)等等,還有很多類型的宏定義,包含在
windows.h中。
.data?
hInstance HINSTANCE ?
;............這里定義各個(gè)變量,但是是沒(méi)有預(yù)先賦值的
. const
;..........如果需要預(yù)先定義一些常量,放在這段里面,用關(guān)鍵字equ定義
.code ;以下就是代碼段,注意函數(shù)也是放在代碼段里面的!
start:;不一定非要使用start,可以是任何的字符串如begin,entry等等。
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
上面的幾行也是比較固定的,invoke是用來(lái)調(diào)用函數(shù)的,用過(guò)VB的人都知道call,這就相當(dāng)于那個(gè)命令
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
;..............這是你主要集中精力要寫的地方
DlgProc endp
end start;主要和上面的start對(duì)應(yīng)
基本上,你可以把上面的綠色部分當(dāng)作模版使用,只需要在.data和.data?以及.const段增加你所需要的變量和常量就可以了。剩下的任務(wù)就是寫上面紅色的部分,也就是處理各個(gè)消息。
我們來(lái)分析幾個(gè)消息,在調(diào)用DialogBoxPrarm創(chuàng)建對(duì)話框后,對(duì)話框會(huì)收到WM_INITDIALOG即對(duì)話框初始化消息,uMsgz這個(gè)參數(shù)接受到消息。在這個(gè)程序中,我們用GetDlgItem這個(gè)函數(shù)來(lái)取得編輯框控件的句柄,然后調(diào)用SetFocus來(lái)將焦點(diǎn)設(shè)置在它上面。
注意這些函數(shù)都是API函數(shù),這些函數(shù)的意義都可以在msdn中找到。
當(dāng)按下對(duì)話框右上角的關(guān)閉按鈕時(shí),會(huì)產(chǎn)生WM_CLOSE,必須處理這個(gè)函數(shù),否則不能用×來(lái)關(guān)閉對(duì)話框(這是由于內(nèi)置的函數(shù)設(shè)有設(shè)計(jì)處理這個(gè)消息),而對(duì)于化小化等消息則有默認(rèn)的處理。
當(dāng)按下對(duì)話框上的按鈕時(shí)會(huì)產(chǎn)生WM_COMMAND消息,并且wParam中傳遞的是控件的ID。根據(jù)不同的ID完成不同的功能,在本例中如果是IDC_BUTTON這個(gè)ID說(shuō)明是顯示編輯框內(nèi)容的控件按鈕被按下,這樣就執(zhí)行GetDlgItemText函數(shù)得到編輯框的內(nèi)容,然后用messagebox來(lái)顯示。如果是IDC_EXIT說(shuō)明按下了“退出程序”這個(gè)按鈕,則執(zhí)行EndDialog這個(gè)函數(shù)退出程序。
程序就是通過(guò)處理各種消息完成的!在更大的程序里面也都是這種結(jié)結(jié)構(gòu),只不過(guò)處理的消息更多而已。
學(xué)寫基于對(duì)話框的程序
更新時(shí)間: 2007-05-28 16:07:50來(lái)源: 粵嵌教育瀏覽量:910
粵嵌動(dòng)態(tài)
推薦閱讀
- ·Linux字符設(shè)備驅(qū)動(dòng)框架解析:file_operations的核心作用與實(shí)現(xiàn)
- ·廣東朝歌數(shù)碼科技股份有限公司專場(chǎng)招聘會(huì)
- ·深化產(chǎn)教融合,共筑技能人才培養(yǎng)新生態(tài) —— 廣州華立學(xué)院到訪粵嵌從化校區(qū)為深化產(chǎn)教
- ·校企合作新突破 | 粵嵌科技與三亞學(xué)院共探產(chǎn)教融合新路徑
- ·粵嵌科技入選國(guó)家級(jí)職業(yè)數(shù)字展館聯(lián)合建設(shè)單位,賦能計(jì)算機(jī)程序設(shè)計(jì)員高技能人才培養(yǎng)
- ·嵌入式實(shí)時(shí)操作系統(tǒng)的性能優(yōu)化與實(shí)現(xiàn)路徑
- ·校企攜手賦能教育!粵嵌科技助力海南科技職業(yè)大學(xué)探索 AGI 時(shí)代教學(xué)新范式
- ·嵌入式系統(tǒng)中的低功耗設(shè)計(jì)策略與實(shí)現(xiàn)路徑
- ·深圳市軒宇軟件開(kāi)發(fā)有限公司專場(chǎng)招聘會(huì)
- ·嵌入式系統(tǒng)中的代碼空間優(yōu)化:策略與實(shí)踐