首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

Win32 組合語言教程:對話框架構程式設計完整指南

     編輯:組合語言

前言

對話框是 Windows 應用程式最常見的介面形式,資源驅動設計讓介面編輯與程式邏輯分離,開發效率媲美 Visual Basic。本文詳細說明對話框資源腳本編寫、DialogBoxParam 模態對話框建立流程、訊息處理迴路,並提供 MASM 完整範例實作編輯框顯示與退出功能。

對話框資源腳本

資源檔(.rc)定義對話框佈局與控件,可用 VC++ 資源編輯器視覺化編輯,或手寫腳本。範例:

#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 "我的對話框"
BEGIN
    EDITTEXT IDC_EDIT, 15, 17, 111, 13, ES_AUTOHSCROLL | ES_LEFT
    DEFPUSHBUTTON "顯示編輯框中的內容", IDC_BUTTON, 141, 10, 52, 13
    PUSHBUTTON "退出程序", IDC_EXIT, 141, 26, 52, 13
END

關鍵點:

  • DIALOG x, y, w, h:座標單位為對話框單位(非像素),依系統字型縮放
  • STYLE:組合視窗樣式與對話框專用樣式(DS_CENTER 置中、DS_MODALFRAME 模態邊框、DS_3DLOOK 立體外觀)
  • 控件定義:EDITTEXT、DEFPUSHBUTTON(預設按鈕,Enter 觸發)、PUSHBUTTON
  • 控件 ID 需唯一,建議 #define 管理
  • 編譯:QEditor 專案需存為 rsrc.rc,選擇 Project → Compile Resource File

程式架構:模態對話框進入點

對話框程式無傳統 WinMain 訊息迴圈,直接呼叫 DialogBoxParam 進入模態迴圈,由系統內部處理訊息分派:

.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
  ; 訊息處理...
  ret
DlgProc endp
end start

DialogBoxParam 參數:實例控制碼、對話框資源名/ID、父視窗(NULL=無)、對話框程式指標、建立參數(lParam 傳給 WM_INITDIALOG)。

對話框程式訊息處理模板

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

回傳值慣例:處理過訊息回傳 TRUE,未處理回傳 FALSE 讓系統預設處理。

常用對話框 API

非模態對話框

使用 CreateDialogParam 建立,需在主訊息迴圈插入 IsDialogMessage 處理 Tab/Enter 等鍵盤導航:

.WHILE TRUE
  invoke GetMessage, ADDR msg, NULL, 0, 0
  .BREAK .IF (!eax)
  .if !IsDialogMessage(hModelessDlg, ADDR msg)
    invoke TranslateMessage, ADDR msg
    invoke DispatchMessage, ADDR msg
  .endif
.ENDW

資源編輯器技巧

  • VC++ 資源編輯器支援拖拉佈局、屬性視窗設定樣式、自動生成 ID 定義
  • 編輯後可切換至「原始碼」檢視複製腳本至 MASM 專案
  • 對話框單位換算:GetDialogBaseUnits 取得系統字型寬高,1 單位 = 1/4 字型寬 / 1/8 字型高

總結

對話框架構將介面宣告式定義於資源,程式碼專注訊息回應,結構清晰、維護容易。掌握 DialogBoxParam/CreateDialogParam 兩種建立模式、WM_INITDIALOG 初始化、WM_COMMAND 控件通知、EndDialog 結束流程,即可高效開發專業級對話框應用程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函式用途
GetDlgItem(hDlg, nIDDlgItem)取得控件控制碼
SetFocus(hWnd)設定鍵盤焦點
GetDlgItemText(hDlg, nID, lpString, nMaxCount)取得編輯框文字
SetDlgItemText(hDlg, nID, lpString)設定控件文字
EndDialog(hDlg, nResult)結束模態對話框
SendDlgItemMessage(hDlg, nID, Msg, wParam, lParam)直接發送訊息給控件
CheckDlgButton / IsDlgButtonChecked核取/選項按鈕狀態