在Windows操作系统中,格式化磁盘是一个常见的操作,但是标准的格式化对话框并没有被整合到公共对话框中。此外,一些旧的KB文章中提供的信息可能已经过时,不再适用于Windows XP和Windows 2000系统。本文将介绍如何自定义一个格式化对话框,并提供一个C++类的实现示例。
在Windows 9x时代,格式化对话框的信息可能被记录在KB文章Q173688中,但随着操作系统的更新,这些信息可能已经不再准确。例如,快速格式化选项的行为与KB文章中的描述完全相反,而且制作系统盘的选项也存在问题。
为了避免使用过时的KB文章信息,编写了一个名为CFormatDriveDialog的C++类,该类封装了格式化对话框的功能。这个类遵循微软推荐的常量定义,但在必要时也会舍弃或添加自己的定义。
KB文章Q173688中的信息部分不准确,如果打算基于这个类进行开发,请不要完全依赖它。此外,这个类应该只在Win2K/XP系统上使用。对于旧的操作系统版本,如9x和ME,应该遵循KB文章的指导。
这个类只有一个公共方法(当然,除了无参数的构造函数)。
这个方法是用于显示格式化对话框并处理用户输入的。
int CFormatDriveDialog::DoModal(HWND hWnd, UINT Drive, bool bQuickFormat, LPCTSTR vol_label);
参数说明:
返回值:
以下是如何在一个按钮点击事件中使用这个类的示例。
void Cnish_testDlg::OnBnClickedButton1()
{
UpdateData(true);
CFormatDriveDialog dlg;
int d = dlg.DoModal(AfxGetMainWnd()->m_hWnd, DRIVEA, bQuickFormat, m_vollab);
if (d == IDOK)
MessageBox("yeah");
}
int CFormatDriveDialog::DoModal(...)
{
// ...
FMTDRIVEFUNC* pshfd;
HMODULE hMod = LoadLibrary("shell32.dll");
if (hMod)
{
pshfd = reinterpret_cast(GetProcAddress(hMod, "SHFormatDrive"));
m_hHook = SetWindowsHookEx(WH_CBT, CBTProc, AfxGetApp()->m_hInstance, AfxGetApp()->m_nThreadID);
rv = ((*pshfd)(hWnd, Drive, SHFMT_ID_DEFAULT, Options) == SHFMT_FMTSUCCESS) ? IDOK : IDCANCEL;
FreeLibrary(hMod);
}
// ...
}
LRESULT CALLBACK CFormatDriveDialog::CBTProc(...)
{
if (nCode == HCBT_ACTIVATE)
{
HWND hWnd = reinterpret_cast(wParam);
EnumChildWindows(hWnd, EnumChildProc, NULL);
UnhookWindowsHookEx(m_hHook);
CFormatDriveDialog::m_hHook = NULL;
}
return FALSE;
}
BOOL CALLBACK CFormatDriveDialog::EnumChildProc(...)
{
char buff[256];
GetClassName(hwnd, buff, 255);
if (strcmp(buff, "Edit") == 0)
{
SetWindowText(hwnd, m_vol_label);
return FALSE;
}
return TRUE;
}