在Windows环境中,无论是进行用户管理还是网络配置,经常需要选择计算机。本文将介绍如何实现一个类似于Windows标准对话框的“选择计算机”对话框。这个对话框允许用户在Windows网络环境中选择任意域的计算机(在WNetEnumResource()函数中称为“服务器”)。
以下是实现这个对话框的步骤和代码示例。
“选择计算机”对话框非常有用,如果需要类似于在Windows用户管理或网络配置工具中看到的“选择计算机/用户/组”对话框。这个对话框允许选择Windows网络环境中任何域的计算机。尝试使这个对话框尽可能接近原始的Microsoft对话框,包括可调整大小、支持多选和单选等特性。
要在项目中使用这个对话框,需要添加以下文件:
将SelectComputerDialog.rc文件包含到项目资源脚本文件中:
#include "SelectComputerDialog.rc"
在文件中包含SelectComputerDialog.h:
#include "SelectComputerDialog.h"
以下是一个CDialogImpl<T>派生类的非静态方法示例(实际上是一个BN_CLICKED通知处理程序):
CSelectComputerDialog dlg;
dlg.SingleSelection(IsDlgButtonChecked(IDC_CHECK_ALLOW_MULTIPLY_SELECTION) == BST_UNCHECKED);
dlg.NoALLDomain(IsDlgButtonChecked(IDC_CHECK_ALLOW_ALL_DOMAINS) == BST_UNCHECKED);
if (dlg.DoModal() == IDOK) {
typedef basic_string tstring;
tstring str;
typedef pair tstringpair;
vector::const_iterator ci = dlg.GetComputerNames().begin();
for (; ci != dlg.GetComputerNames().end(); ++ci) {
str += (ci->first + _T("\n/ ") + ci->second);
str += _T("\n\r\n");
}
SetDlgItemText(IDC_EDIT_COMPUTERNAME, str.c_str());
}
以下是一个CDialog派生类的非静态方法示例(实际上是一个BN_CLICKED通知处理程序):
CSelectComputerDialog dlg;
dlg.SingleSelection(!m_bAllowMultiplySelection);
dlg.NoALLDomain(!m_bAllowAllDomains);
m_strComputerName = _T("");
if (dlg.DoModal() == IDOK) {
typedef pair CStringPair;
vector::const_iterator ci = dlg.GetComputerNames().begin();
for (; ci != dlg.GetComputerNames().end(); ++ci) {
m_strComputerName += (ci->first + _T("\n/ ") + ci->second);
m_strComputerName += _T("\n\r\n");
}
UpdateData(FALSE);
}