自定义对话框

【勇芳软件工作室】汉化HomePreviousNext

应用程序可以通过使用应用程序定义的窗口类来创建自定义对话框,而不是使用预定义的对话框类。当对话框是主窗口时,应用程序通常使用这种方法,但是对于具有标准重叠窗口的应用程序,也可以创建模态和无模式对话框。

应用程序定义的窗口类允许应用程序在将对话框和进程消息发送到对话框过程之前定义一个窗口过程。它还允许应用程序为该对话框定义一个类图标,一个类背景画笔和一个类菜单。在尝试创建对话框之前,应用程序必须注册窗口类,并且必须提供具有窗口类的原子值或名称的对话框模板。

许多应用程序通过首先检索预定义对话框类的类信息,并将其传递给GetClassInfo函数来创建一个新的对话框类,该函数使用该信息填充WNDCLASS结构。应用程序修改结构的各个成员,例如类名,画笔和图标,然后使用RegisterClass函数注册新类。如果应用程序自己填写WNDCLASS结构,则必须将cbWndExtra成员设置为DLGWINDOWEXTRA,这是Windows对每个对话框需要的额外字节数。如果应用程序也为每个对话框使用额外的字节,则它们必须超出Windows所需的额外字节。

自定义对话框的窗口过程与任何其他窗口过程具有相同的参数和要求。但是,与其他窗口过程不同,此对话框的窗口过程应调用DefDlgProc函数,而不是DefWindowProc函数来处理其未处理的任何消息。DefDlgProc执行与预定义对话框的窗口过程相同的默认消息处理,其中包括调用对话框过程。

应用程序还可以通过对预定义对话框的窗口过程进行子类化来创建自定义对话框。SetWindowLong函数允许应用程序设置给定窗口的窗口过程的地址。应用程序也可能尝试使用SetClassLong函数进行子类化,但这样做会影响系统中的所有对话框,而不仅仅是属于应用程序的对话框。

创建自定义对话框的应用程序有时会为对话框提供一个备用键盘界面。对于无模式对话框,这可能意味着应用程序不调用IsDialogMessage函数,而是处理自定义窗口过程中的所有键盘输入。在这种情况下,应用程序可以使用WM_NEXTDLGCTL消息将输入焦点从一个控件移动到另一个控件所需的代码最小化。此消息传递给DefDlgProc时,将输入焦点移动到指定的控件,并更新控件的外观,例如移动默认按钮边框或设置自动单选按钮。