- UID
- 460236
- 帖子
- 22
- 主題
- 12
- 精華
- 0
- 積分
- 24
- 楓幣
- 796
- 威望
- 23
- 存款
- 0
- 贊助金額
- 0
- 推廣
- 0
- GP
- 13
- 閱讀權限
- 10
- 性別
- 保密
- 在線時間
- 20 小時
- 註冊時間
- 2024-10-12
- 最後登入
- 2024-12-4
|
本帖最後由 ikj78i 於 2024-12-3 14:49 編輯
這次介紹對話盒程式。它執行時會生成一個對話盒,可讓使用者在對話盒內的編輯框輸入姓名,
,而後對話盒會向你問好。
製作對話盒程式必須原始程式(副檔名為.ASM)與資源描述檔(副檔名為.RC)配合才可以。.RC內
可以有許多不同的資源,用來顯示使用者介面,幫助使用者操作程式。.RC內可以定義許多資源
例如圖示、游標、對話盒等。定義對話核時語法如下:- nameID DIALOG x, y, w, h
- [ optional-statements ]
- BEGIN
- control-statements
- ...
- END
複製代碼 底下是說明:
nameID 是對話盒識別碼,1~65535之間的正整數
x,y對話盒左上角座標
w,h對話盒寬度與高度
optional-statements是可選的描述,可以省略。如果不省略,下面是幾種常用的描述
CAPTION "對話盒標題欄的文字"
FONT 字型大小,字形名稱
MENU MenuID:可以在此對話盒標題欄下方加上功能表。MenuID是功能表識別碼。
control-statements是控制項描述,控制項有很多種,像按鈕、編輯框、靜態控制項
(即字串或圖片)都是,下面只介紹三種,都必須包含在BEGIN與END之間
1.靜態控制項:也有很多種,最常用的是向左對齊的字串:LTEXT "文字",識別碼,x,y,w,h
x,y,w,h是靜態控制項的x,y座標及寬度與高度
2.編輯框:EDITTEXT 識別碼,x,y,w,h
3.按鈕:PUSHBUTTON "文字",識別碼,x,y,w,h
底下是DLG.RC的內容:- #include "C:\MASM32\INCLUDE\RESOURCE.H"
- #define IDD_DLG 1000
- #define IDS_NAME 1001
- #define IDE_NAME 1002
- #define IDS_GOOD 1003
- #define IDB_QUIT 1004
- IDD_DLG DIALOG 340,150,120,50
- CAPTION "問候"
- FONT 10,"細明體"
- STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
- BEGIN
- LTEXT "請輸入姓名:",IDS_NAME,2,3,72,10
- EDITTEXT IDE_NAME,50,2,50,12
- LTEXT "",IDS_GOOD,2,15,100,12
- PUSHBUTTON "離開",IDB_QUIT,75,30,40,15
- END
複製代碼 底下是DLG.ASM:- .586
- .MODEL FLAT,STDCALL
- OPTION CASEMAP:NONE
- IDD_DLG EQU 1000
- IDS_NAME EQU 1001
- IDE_NAME EQU 1002
- IDS_GOOD EQU 1003
- IDB_QUIT EQU 1004
- INCLUDE c:\masm32\include\windows.inc
- INCLUDE c:\masm32\include\kernel32.inc
- INCLUDE c:\masm32\include\user32.inc
- INCLUDELIB c:\masm32\lib\kernel32.lib
- INCLUDELIB c:\masm32\lib\user32.lib
- ;*******************************************************************************
- .DATA
- hInst DD ?
- sGood DB "你好,"
- szName DB 20h DUP (0)
- ;*******************************************************************************
- .CODE
- ;-------------------------------------------------------------------------------
- DlgProc PROC hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
- .IF uMsg==WM_COMMAND
- mov edx,wParam
- mov eax,wParam
- shr edx,10h ;DX=通知碼
- and eax,0ffffh ;AX=控制元件識別碼
- .IF dx==BN_CLICKED
- .IF AX==IDB_QUIT
- jmp quit
- .ENDIF
- .ELSEIF dx==EN_CHANGE
- INVOKE GetDlgItemText,hDlg,IDE_NAME,OFFSET szName,SIZEOF szName-1
- INVOKE SetDlgItemText,hDlg,IDS_GOOD,OFFSET sGood
- .ENDIF
- .ELSEIF uMsg==WM_CLOSE
- quit: INVOKE EndDialog,hDlg,0
- .ELSE ;其他未處理的訊息返回0,通知系統此訊息未處理
- xor eax,eax
- ret
- .ENDIF ;已處理的訊息返回1,通知系統此訊息已處理
- mov eax,1
- ret
- DlgProc ENDP
- ;-------------------------------------------------------------------------------
- main PROC
- INVOKE GetModuleHandle,0
- mov hInst,eax
- INVOKE DialogBoxParam,hInst,IDD_DLG,0,OFFSET DlgProc,0
- INVOKE ExitProcess,0
- main ENDP
- ;*******************************************************************************
- END main
複製代碼 話盒有許多種,這裡介紹的是強制回應對話盒(modal dialog boxes)為主要介面的應用程式
最重要的地方有兩處:
是52行呼叫DialogBoxParam建立強制回應對話盒。第二個參數指定使用DLG.RC中的對話盒
第四個參數指定對話盒函式。
是第22~47行的對話盒函式。對話盒函式對使用者的操作做出回應。
當使用者按下按鈕,系統會監視到此事件而加以處理,製作成WM_COMMAND訊息,傳給
對話盒函式。
1.這就是第22行的第二個參數,uMsg。
2.而第三個參數wParam分為兩部分:
A.高字組(第16~31位元)是通知碼,進一步指出使用者做了什麼動作,例如按下按鈕
的通知碼是BN_CLICKED,改變編輯框的內容是EN_CHANGE。
B.低字組(第0~15位元)是控制項(或稱控制元件)識別碼,必須跟在DLG.RC內
control-statements所定義的識別碼相同數值。
檢查這兩部分,就知道使用者對哪個控制項做了什麼動作。
3.第四個參數是其他額外資料,通常是位址。
對話盒函式就是檢查這些參數,做出回應。
如,當使用者按下「離開」按鈕,WM_COMMAND訊息通知碼是BN_CLICKED,識別碼是IDB_QUIT
DLG.ASM第23~29行負責判斷,第30行跳到quit:處進行結束應用程式的過程。
使用者改變編輯框內容時,系統發出WM_COMMAND訊息的通知碼是EN_CHANGE,識別碼是IDE_NAME
處並沒有檢查IDE_NAME),第32行判斷好之後,第33~34行做出回應。回應的方式是呼叫
tDlgItemText取得編輯框內容(假設是使用者名字),然後填在第17行的「你好,」之後,就變
一句問候語,再呼叫SetDlgItemText印出來。
生視窗的應用程式結束時,有可能是使用者按右上角X,或是左上角系統功能表中的關閉,或是
接按快捷鍵Alt-F4,這些事件都由系統轉換成WM_CLOSE訊息,而在對話盒函式中處理。
組譯方式:把DLG.ASM、DLG.RC放在同一資料夾,打開命令提示字元,輸入下面指令即可。- path c:\masm32\bin;%path%
- rc dlg.rc
- ml /coff dlg.asm /link dlg.res /subsystem:windows
複製代碼 執行結果:
|
|