1. gzyueqian
      18529173453

      學(xué)寫基于對(duì)話框的程序

      更新時(shí)間: 2007-05-28 16:07:50來(lái)源: 粵嵌教育瀏覽量:910


        用匯編寫基于對(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ò)處理的消息更多而已。

      免費(fèi)預(yù)約試聽(tīng)課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲午夜成aⅴ人片 | 中出仑乱中文字幕在线 | 中文字老妇女偷乱视频在线 | 香蕉97人人乳视频观看 | 亚洲成a人在线电影 | 香港三级日本三级韩级人妇 |