📄 lion-tut-c10.htm
字号:
invoke SetDlgItemText,hWnd,IDC_EDIT,NULL</b> <br>
<b> .ELSE</b>
<br>
<b>
invoke DestroyWindow,hWnd</b> <br>
<b> .ENDIF</b>
<br>
<b> .ELSE</b> <br>
<b> mov edx,wParam</b>
<br>
<b> shr edx,16</b>
<br>
<b> .IF dx==BN_CLICKED</b>
<br>
<b>
.IF ax==IDC_BUTTON</b> <br>
<b>
invoke SetDlgItemText,hWnd,IDC_EDIT,ADDR TestString</b> <br>
<b>
.ELSEIF ax==IDC_EXIT</b> <br>
<b>
invoke SendMessage,hWnd,WM_COMMAND,IDM_EXIT,0</b> <br>
<b>
.ENDIF</b> <br>
<b> .ENDIF</b>
<br>
<b> .ENDIF</b> <br>
<b> .ELSE</b> <br>
<b> invoke DefWindowProc,hWnd,uMsg,wParam,lParam</b>
<br>
<b> ret</b> <br>
<b> .ENDIF</b> <br>
<b> xor eax,eax</b> <br>
<b> ret</b> <br>
<b>WndProc endp</b> <br>
<b>end start</b> <br>
<hr width="100%">
<center>
<b>Dialog.rc</b>
</center>
<hr width="100%">
<br>
<b>#include "resource.h"</b>
<p><b>#define IDC_EDIT
3000</b> <br>
<b>#define IDC_BUTTON
3001</b> <br>
<b>#define IDC_EXIT
3002</b>
<p><b>#define IDM_GETTEXT
32000</b> <br>
<b>#define IDM_CLEAR
32001</b> <br>
<b>#define IDM_EXIT
32003</b> <br>
<p><b>MyDialog DIALOG 10, 10, 205, 60</b> <br>
<b>STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |</b> <br>
<b>WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK</b> <br>
<b>CAPTION "Our First Dialog Box"</b> <br>
<b>CLASS "DLGCLASS"</b> <br>
<b>BEGIN</b> <br>
<b> EDITTEXT
IDC_EDIT, 15,17,111,13, ES_AUTOHSCROLL | ES_LEFT</b> <br>
<b> DEFPUSHBUTTON "Say Hello", IDC_BUTTON,
141,10,52,13</b> <br>
<b> PUSHBUTTON "E&xit",
IDC_EXIT, 141,26,52,13, WS_GROUP</b> <br>
<b>END</b> <br>
<p><b>MyMenu MENU</b> <br>
<b>BEGIN</b> <br>
<b> POPUP "Test Controls"</b> <br>
<b> BEGIN</b> <br>
<b> MENUITEM "Get Text", IDM_GETTEXT</b>
<br>
<b> MENUITEM "Clear Text", IDM_CLEAR</b>
<br>
<b> MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/</b>
<br>
<b> MENUITEM "E&xit", IDM_EXIT</b>
<br>
<b> END</b> <br>
<b>END</b>
<h3> <font color="#ff0000">分析:</font></h3>
我们先来分析第一个例子: <br>
该例显示了如何把一个对话框模板注册成一个窗口类,然后创建一个由该窗口类派生的窗口。由于您没有必要自己去创建子窗口控件,所以就简化了许多的工作。<br>
我们先来分析对话框模板。
<p><b>MyDialog DIALOG 10, 10, 205, 60</b>
<p>先是对话框的名字,然后是关键字“DAILOG”。接下来的四个数字中,前两个是对话框的坐标,后两个是对话框的宽和高(注意:它们的单位是对话框的单位,而不一定是像素点)。
<p><b>STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |</b> <br>
<b>WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK</b>
<p>上面定义了对话框的风格。
<p><b>CAPTION "Our First Dialog Box"</b>
<p>这是显示在对话框标题条上的标题。
<p><b>CLASS "DLGCLASS"</b>
<p>这一行非常关键。正是有了关键字CLASS,我们才可以用它来声明把一个对话框当成一个窗口来用。跟在关键字后面的是“窗口类”的名称。
<p><b>BEGIN</b> <br>
<b> EDITTEXT
IDC_EDIT, 15,17,111,13, ES_AUTOHSCROLL | ES_LEFT</b> <br>
<b> DEFPUSHBUTTON "Say Hello", IDC_BUTTON,
141,10,52,13</b> <br>
<b> PUSHBUTTON "E&xit",
IDC_EXIT, 141,26,52,13</b> <br>
<b>END</b>
<p>上面的一块定义了对话框中的子窗口控件,它们是声明在一头一尾的两个关键字BEGIN和END之间的。
<ul>
<b>control-type "text" ,controlID, x, y, width, height [,styles]</b>
</ul>
控件的类型是资源编辑器定义好了的常数,您可以查找有关的手册。
<br>
现在我们来看看汇编源代码。先看这部分:
<ul>
<b>mov wc.cbWndExtra,DLGWINDOWEXTRA</b> <br>
<b>mov wc.lpszClassName,OFFSET ClassName</b>
</ul>
通常cbWndExtra被设成NULL,但我们想把一个对话框模板注册成一个窗口类,我们必须把该成员的值设成DLGWINDOWEXTRA。注意类的名称必须和模板中跟在CLASS关键字后面的名称一样。余下的成员变量和声明一般的窗口类相同。填写好窗口类结构变量后调用函数RegisterClassEx进行注册。看上去这一切和注册一个普通的窗口类是一样的。
<ul>
<b>invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL</b>
</ul>
注册完毕后,我们就创建该对话框。在这个例子中,我们调用函数CreateDialogParam产生一个无模式对话框。这个函数共有5个参数,其中前两个参数是必须的:实例句柄和指向对话框模板名称的指针。注意第二个参数是指向模板名称而不是类名称的指针。这时,WINDOWS将产生对话框和子控件窗口。同时您的应用程序将接收到由WINDOWS传送的第一个消息WM_CREATE。
<ul>
<b>invoke GetDlgItem,hDlg,IDC_EDIT</b> <br>
<b>invoke SetFocus,eax</b>
</ul>
在对话框产生后,我们把输入输出焦点设到编辑控件上。如果在WM_CREATE消息处理段中假如设置焦点的代码,GetDlgItem函数就会失败,因为此时空间窗口还未产生,为了在对话框和所有的子窗口控件都产生后调用该函数我们把它安排到了函数UpdatWindow后,GetDlgItem函数返回该控件的敞口句柄。
<p> <b>invoke IsDialogMessage, hDlg, ADDR
msg</b> <br>
<b> .IF eax ==FALSE</b> <br>
<b> invoke
TranslateMessage, ADDR msg</b> <br>
<b> invoke
DispatchMessage, ADDR msg</b> <br>
<b> .ENDIF</b>
<p>现在程序进入消息循环,在我们翻译和派发消息前,该函数使得对话框内置的对话框管理程序来处理有关的键盘跳转逻辑。如果该函数返回TRUE,则表示消息是传给对话框的已经由该函数处理了。注意和前一课不同,当我们想得到控件的文本信息时调用GetDlgItemText函数而不是GetWindowText函数,前者接受的参数是一个控件的ID 号,而不是窗口的句柄,这使得在对话框中调用该函数更方便。<br>
<hr width="100%">
<br>
好我们现在使用第二种方法把一个对话框当成一个主窗口来使用。在接下来的例子中,我们将产生一个应用程序的模式对话框,您将会发现其中根本没有消息循环或窗口处理过程,因为它们根本没有必要!
<hr width="100%">
<center>
<b>dialog.asm (part 2)</b>
</center>
<hr width="100%">
<br>
<b>.386</b> <br>
<b>.model flat,stdcall</b> <br>
<b>option casemap:none</b>
<p><b>DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD</b>
<p><b>include \masm32\include\windows.inc</b> <br>
<b>include \masm32\include\user32.inc</b> <br>
<b>include \masm32\include\kernel32.inc</b> <br>
<b>includelib \masm32\lib\user32.lib</b> <br>
<b>includelib \masm32\lib\kernel32.lib</b>
<p><b>.data</b> <br>
<b>DlgName db "MyDialog",0</b> <br>
<b>AppName db "Our Second Dialog Box",0</b> <br>
<b>TestString db "Wow! I'm in an edit box now",0</b>
<p><b>.data?</b> <br>
<b>hInstance HINSTANCE ?</b> <br>
<b>CommandLine LPSTR ?</b> <br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -