Windows格式化对话框的自定义实现

在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);

参数说明:

  • hWnd - 对话框父窗口的句柄,不能为NULL。
  • Drive - 驱动器代码(0代表A,1代表B,2代表C等)。可以使用定义好的常量,如DRIVEA、DRIVEB、DRIVEC等。
  • bQuickFormat - 如果为true,则默认选中快速格式化复选框。
  • vol_label - 要使用的默认卷标值。

返回值:

  • IDOK - 如果格式化成功完成。
  • IDCANCEL - 如果格式化操作被取消或发生错误。

以下是如何在一个按钮点击事件中使用这个类的示例。

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; }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485