iczelion tut10[4]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 jimgreen 的 blog

    edittext         idc_edit,   15,17,111,13, es_autohscroll | es_left
    defpushbutton   "say hello", idc_button,    141,10,52,13
    pushbutton      "e&xit", idc_exit,  141,26,52,13
end

上面的一块定义了对话框中的子窗口控件,它们是声明在一头一尾的两个关键字begin和end之间的。

    control-type  "text"   ,controlid, x, y, width, height [,styles]
控件的类型是资源编辑器定义好了的常数,您可以查找有关的手册。
现在我们来看看汇编源代码。先看这部分:
    mov   wc.cbwndextra,dlgwindowextra
    mov   wc.lpszclassname,offset classname
通常cbwndextra被设成null,但我们想把一个对话框模板注册成一个窗口类,我们必须把该成员的值设成dlgwindowextra。注意类的名称必须和模板中跟在class关键字后面的名称一样。余下的成员变量和声明一般的窗口类相同。填写好窗口类结构变量后调用函数registerclassex进行注册。看上去这一切和注册一个普通的窗口类是一样的。
    invoke createdialogparam,hinstance,addr dlgname,null,null,null
注册完毕后,我们就创建该对话框。在这个例子中,我们调用函数createdialogparam产生一个无模式对话框。这个函数共有5个参数,其中前两个参数是必须的:实例句柄和指向对话框模板名称的指针。注意第二个参数是指向模板名称而不是类名称的指针。这时,windows将产生对话框和子控件窗口。同时您的应用程序将接收到由windows传送的第一个消息wm_create。
    invoke getdlgitem,hdlg,idc_edit
    invoke setfocus,eax
在对话框产生后,我们把输入输出焦点设到编辑控件上。如果在wm_create消息处理段中假如设置焦点的代码,getdlgitem函数就会失败,因为此时空间窗口还未产生,为了在对话框和所有的子窗口控件都产生后调用该函数我们把它安排到了函数updatwindow后,getdlgitem函数返回该控件的敞口句柄。

       invoke isdialogmessage, hdlg, addr msg
        .if eax ==false
            invoke translatemessage, addr msg
            invoke dispatchmessage, addr msg
        .endif

现在程序进入消息循环,在我们翻译和派发消息前,该函数使得对话框内置的对话框管理程序来处理有关的键盘跳转逻辑。如果该函数返回true,则表示消息是传给对话框的已经由该函数处理了。注意和前一课不同,当我们想得到控件的文本信息时调用getdlgitemtext函数而不是getwindowtext函数,前者接受的参数是一个控件的id 号,而不是窗口的句柄,这使得在对话框中调用该函数更方便。



好我们现在使用第二种方法把一个对话框当成一个主窗口来使用。在接下来的例子中,我们将产生一个应用程序的模式对话框,您将会发现其中根本没有消息循环或窗口处理过程,因为它们根本没有必要!
dialog.asm (part 2)


.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 "our second dialog box",0
teststring db "wow! i'm in an edit box now",0

.data?
hinstance hinstance ?
commandline lpstr ?
buffer db 512 dup(?)

.const
idc_edit            equ 3000
idc_button     equ 3001
idc_exit            equ 3002
idm_gettext  equ 32000
idm_clear       equ 32001
idm_exit           equ 32002
 

.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 sendmessage,hwnd,wm_command,idm_exit,0
    .elseif umsg==wm_command
        mov eax,wparam
        .if lparam==0
            .if ax==idm_gettext
                invoke getdlgitemtext,hwnd,idc_edit,addr buffer,512
                invoke messagebox,null,addr buffer,addr appname,mb_ok
            .elseif ax==idm_clear
                invoke setdlgitemtext,hwnd,idc_edit,null

本文关键:iczelion asm
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top