冰楓論壇

標題: 對話盒 [打印本頁]

作者: ikj78i    時間: 2024-12-3 10:07
標題: 對話盒
本帖最後由 ikj78i 於 2024-12-3 14:49 編輯

這次介紹對話盒程式。它執行時會生成一個對話盒,可讓使用者在對話盒內的編輯框輸入姓名,
,而後對話盒會向你問好。
製作對話盒程式必須原始程式(副檔名為.ASM)與資源描述檔(副檔名為.RC)配合才可以。.RC內
可以有許多不同的資源,用來顯示使用者介面,幫助使用者操作程式。.RC內可以定義許多資源
例如圖示、游標、對話盒等。定義對話核時語法如下:
  1. nameID  DIALOG  x, y, w, h
  2. [ optional-statements ]
  3. BEGIN
  4.   control-statements
  5.   ...
  6. 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的內容:
  1. #include "C:\MASM32\INCLUDE\RESOURCE.H"
  2. #define IDD_DLG  1000
  3. #define IDS_NAME 1001
  4. #define IDE_NAME 1002
  5. #define IDS_GOOD 1003
  6. #define IDB_QUIT 1004

  7. IDD_DLG DIALOG 340,150,120,50
  8. CAPTION "問候"
  9. FONT 10,"細明體"
  10. STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
  11. BEGIN
  12. LTEXT "請輸入姓名:",IDS_NAME,2,3,72,10
  13. EDITTEXT IDE_NAME,50,2,50,12
  14. LTEXT "",IDS_GOOD,2,15,100,12
  15. PUSHBUTTON "離開",IDB_QUIT,75,30,40,15
  16. END
複製代碼
底下是DLG.ASM:
  1. .586
  2. .MODEL  FLAT,STDCALL
  3. OPTION  CASEMAP:NONE
  4. IDD_DLG    EQU  1000
  5. IDS_NAME   EQU  1001
  6. IDE_NAME   EQU  1002
  7. IDS_GOOD   EQU  1003
  8. IDB_QUIT   EQU  1004
  9. INCLUDE    c:\masm32\include\windows.inc
  10. INCLUDE    c:\masm32\include\kernel32.inc
  11. INCLUDE    c:\masm32\include\user32.inc
  12. INCLUDELIB c:\masm32\lib\kernel32.lib
  13. INCLUDELIB c:\masm32\lib\user32.lib
  14. ;*******************************************************************************
  15. .DATA
  16. hInst   DD ?
  17. sGood   DB "你好,"
  18. szName  DB 20h DUP (0)
  19. ;*******************************************************************************
  20. .CODE
  21. ;-------------------------------------------------------------------------------
  22. DlgProc PROC    hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
  23. .IF uMsg==WM_COMMAND
  24.         mov     edx,wParam
  25.         mov     eax,wParam
  26.         shr     edx,10h    ;DX=通知碼
  27.         and     eax,0ffffh ;AX=控制元件識別碼
  28.   .IF dx==BN_CLICKED
  29.     .IF AX==IDB_QUIT
  30.         jmp     quit
  31.     .ENDIF
  32.   .ELSEIF dx==EN_CHANGE
  33.         INVOKE  GetDlgItemText,hDlg,IDE_NAME,OFFSET szName,SIZEOF szName-1
  34.         INVOKE  SetDlgItemText,hDlg,IDS_GOOD,OFFSET sGood
  35.   .ENDIF

  36. .ELSEIF uMsg==WM_CLOSE
  37. quit:   INVOKE  EndDialog,hDlg,0

  38. .ELSE   ;其他未處理的訊息返回0,通知系統此訊息未處理
  39.         xor     eax,eax
  40.         ret

  41. .ENDIF  ;已處理的訊息返回1,通知系統此訊息已處理
  42.         mov     eax,1
  43.         ret
  44. DlgProc ENDP
  45. ;-------------------------------------------------------------------------------
  46. main    PROC
  47.         INVOKE  GetModuleHandle,0
  48.         mov     hInst,eax
  49.         INVOKE  DialogBoxParam,hInst,IDD_DLG,0,OFFSET DlgProc,0
  50.         INVOKE  ExitProcess,0
  51. main    ENDP
  52. ;*******************************************************************************
  53. 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放在同一資料夾,打開命令提示字元,輸入下面指令即可。
  1. path c:\masm32\bin;%path%
  2. rc dlg.rc
  3. ml /coff dlg.asm /link dlg.res /subsystem:windows
複製代碼
執行結果:


DLG.png (2.16 KB, 下載次數: 0)

DLG.png






歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓