冰楓論壇
標題:
對話盒
[打印本頁]
作者:
ikj78i
時間:
2024-12-3 10:07
標題:
對話盒
本帖最後由 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
複製代碼
執行結果:
DLG.png
(2.16 KB, 下載次數: 0)
2024-12-3 10:12 上傳
點擊文件名下載附件
歡迎光臨 冰楓論壇 (https://bingfong.com/)
Powered by 冰楓