创建简单的属性向导






3.16/5 (31投票s)
2003年6月28日
6分钟阅读

99089
属性页向导对于初学者来说可能是一项相当艰巨的任务。本文将尝试让初学者更容易理解属性页向导的基本功能。
引言与免责声明
属性页向导对于初学者来说可能是一项相当艰巨的任务。它们看似简单的表面外观隐藏了许多复杂性,使得理解其内部工作原理变得困难。本文将尝试让初学者更容易理解属性页向导的基本功能。对于所有选择阅读本文的人,我绝不声称本文内容100%准确,并鼓励对内容进行建设性的批评。一句善意的话能让你学到的东西比一句辱骂多得多 :-)
项目设置
设置属性页向导的第一步是配置项目本身。在本文中,我们将使用Microsoft Visual Studio 6来构建我们的属性页向导,但我相当确定将其移植到其他编译器环境的工作量很小。首先,我们需要创建基础对话框。我使用MFC AppWizard完成的。以下是我使用的步骤:
- 转到 文件 >> 新建
- 选择 MFC AppWizard (EXE)
- 输入 SimpleWizard 作为项目名称——您可以使用任何名称,但我选择这个是为了简单
- 点击 确定 按钮
以上步骤告知Visual Studio我们要创建一个名为SimpleWizard的MFC应用程序。在接下来的屏幕上,我们将配置项目,使其能够以与向导应用程序一致的方式运行。现在我们需要进一步配置项目。
- 选择 基于对话框 单选按钮。
您应该看到我们的应用程序的表示在设置窗口的左侧变为一个对话框。这表明我们的应用程序将被配置为对话框应用程序。除非您有充分的理由更改资源语言选项,否则最好将其保留为默认值,因为我遇到的绝大多数应用程序都使用英语资源。
- 点击 下一步 按钮
此对话框中的所有项目都应保留其默认设置,但 ActiveX控件支持 和 Windows套接字 支持除外,除非您有特定原因需要在向导应用程序中使用此类功能。
- 点击 下一步 按钮
同样,我建议将所有设置保留为默认值,因为这些设置中没有太多特别有用的东西,除了MFC DLL的链接方式。如果您选择 共享DLL,您将获得一个更小的可执行文件,但是,在某些情况下,我们不确定目标计算机是否安装了MFC DLL,因此使用 静态链接 将应用程序与MFC链接并导入所需函数可能很有用。请注意,这将大大增加可执行文件的大小,因此我强烈反对这样做。
- 点击 下一步 按钮
我们在这里可以更改的唯一设置是 类名,但我们没有实际理由更改它,所以让我们通过点击 完成 按钮来结束。
插入属性向导组件
现在我们已经创建了一个基于对话框的MFC应用程序,并带有一些默认设置,这将允许我们实现向导。总的来说,这是一个相当简单的设置,但现在我们开始进入有趣的部分。让我们继续。
- 转到 项目 >> 添加到项目 >> 组件和控件
- 选择目录 Visual C++ 组件
- 选择 属性页 组件
- 点击 插入 按钮
这将弹出用于实际将属性页插入我们对话框应用程序的配置参数。正确执行此操作很重要,否则属性页将无法被正确的类访问,我们不得不回去修复。最好第一次就做对。让我们继续。
- 选择 向导 单选按钮
- 点击 下一步 按钮
在下一个屏幕上,我们可以选择为向导类添加预览支持,这将允许我们的向导根据用户选择的选项显示反馈。如果这是一个更复杂的向导,我们可能会有兴趣使用它,但对于我们的目的,我们保持简单,所以将其留空。
- 点击 下一步 按钮
现在我们被询问要将哪个类赋予对我们向导页面的访问权限。我们可以将访问权限授予显示我们初始对话框的对话框类,或者将其授予基础应用程序类。如果我们授予对话框类访问权限,我们需要设置某种机制来触发向导的出现。如果我们授予基础应用程序类访问权限,我们可以通过修改一点代码来完全绕过对话框。在这种情况下,让我们授予基础应用程序访问权限。稍后我将展示一些代码来实际显示属性向导。
- 从下拉框中选择 CSimpleWizardApp 类
- 点击 下一步 按钮
在下一个屏幕上,我们可以设置我们向导中将存在的页数。在本例中,我们将使用四页,所以请将其设置为 4 并点击 下一步
在下一个屏幕上,我们可以选择更改将被插入我们应用程序的类的名称。例如,如果我们想拥有用于检测硬件、显示检测到的内容、更改配置设置和最终确定设置的页面,我们可以更改类名以反映向导的每个相应页面。现在,我们可以将其保留为默认值。所以让我们点击 完成。
好了,我们的属性向导现在已经插入了。还有一个主要问题。我们如何才能让我们的向导显示出来?
向导,显身吧...
现在我们已经设置好了一切,我们需要让向导可见。我们通过修改基础对话框类来实现。这是我们做到这一点的方法。打开 类视图 并找到名为 CSimpleWizardApp
的类。我们要查找的是该类的 InitInstance
方法,它看起来像这样:
///////////////////////////////////////////////////////////////////////////// // CSimpleWizardApp initialization BOOL CSimpleWizardApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif CSimpleWizardDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; }
为了让我们的对话框出现,我们需要用调用我们向导类来代替默认对话框创建的 <CODE>DoModal()
调用,所以我们需要将上面的代码改为:
///////////////////////////////////////////////////////////////////////////// // CSimpleWizardApp initialization BOOL CSimpleWizardApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif CMyPropertySheet propSheet; m_pMainWnd = &propSheet; propSheet.DoModal(); // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; }
这只是告诉应用程序调用向导类的 DoModal()
而不是调用基础对话框资源的 DoModal()
。这应该足够让你开始创建向导应用程序了。当然,这并不是创建完善向导的完整解决方案,但在CodeProject和其他网站上有很多资源可以讨论设置向导按钮和其他细节。我在这篇文章中的目的是向您展示如何让向导在您的应用程序中显示出来。
此外,我已经删除了插入向导类时插入的 OnWizard()
函数,因为在此修改后它几乎变得无用了。希望这篇文章能有所帮助。