概述 这门课基本上打开窗户磁盘格式对话框。你会有 认为它会成为通用对话框的一部分了。更糟糕的是 KB文章中,一些信息Q173688现在是不正确的的 Windows XP和Windows 2000。我推测知识库文章 写在9 x天,他们忘了删除或更新。什么 我困惑的是知识库article 状态的信息 适用于XP和2 k。我首先感到震惊的发现 快速格式化选项表现完全相反的它是如何描述的KB 篇文章。除了Make-system-disk选项甚至没有正常工作。 无论如何我写一个类,CFormatDriveDialog基本上包裹的东西 给你。我已经坚持推荐女士常数定义他们 工作,但在其他情况下我丢弃他们或者添加自己的。 强烈的警告 KB文章中的信息Q173688部分是不正确的。不遵循 盲目地如果你打算建立在这个类。还请注意,这类 只能用在Win2K / XP系统。知识库文章随访 旧的操作系统版本9 x和我。 类引用 这里有一个公共方法(当然,除了 parameter-less构造函数)。 DoModal 隐藏,复制Code
int CFormatDriveDialog::DoModal(HWND hWnd, UINT Drive, bool bQuickFormat, LPCTSTR vol_label);
hWnd,对话框的父窗口句柄。这是不可能的 NULL。驱动的驱动代码(0,1 B 2 C等等)我 像DRIVEA定义常量,DRIVEB DRIVEC 等等,你可以使用,而不是原始数据。他们是在标题中定义 文件。bQuickFormat——如果真的那么“快速格式化”复选框标记 违约。vol_label——默认值的卷标 使用。 返回值 如果成功的格式完成和IDCANCEL IDOK 如果格式操作被取消或者一些错误发生。 示例使用 隐藏,复制Code
void Cnish_testDlg::OnBnClickedButton1() { UpdateData(true); CFormatDriveDialog dlg; int d=dlg.DoModal(AfxGetMainWnd()->m_hWnd,DRIVEA, bQuickFormat,m_vollab); if(d==IDOK) MessageBox("yeah"); }
技术细节 我们从二调用SHFormatDrive函数。我使用 LoadLibrary和 负载二,然后调用GetProcAddress SHFormatDrive地址。我 还使用SetWindowsHookEx设置CBT钩,因为我们需要设置音量 标签。钩proc调用EnumChildWindows当我们遇到子窗口 “编辑”类,我们知道这是卷标编辑框,因为 只在对话框编辑框。请参考详细的源代码。一个剪掉 部分下面的清单给出评论中没有实际的来源 代码。 隐藏,收缩,复制Code
int CFormatDriveDialog::DoModal(...) { //... // Function pointer to hold SHFormatDrive FMTDRIVEFUNC* pshfd; // Load the dll HMODULE hMod = LoadLibrary("shell32.dll"); // Chk for error - just in case if(hMod) { // Assign function pointer pshfd = reinterpret_cast<FMTDRIVEFUNC*> (GetProcAddress(hMod,"SHFormatDrive")); // Set a WH_CBT hook m_hHook = SetWindowsHookEx(WH_CBT,CBTProc, AfxGetApp()->m_hInstance,AfxGetApp()->m_nThreadID); // Call the function via the function pointer rv = ((*pshfd)(hWnd,Drive,SHFMT_ID_DEFAULT,Options)== SHFMT_FMTSUCCESS) ? IDOK : IDCANCEL; // Free the dll FreeLibrary(hMod); } //... } LRESULT CALLBACK CFormatDriveDialog::CBTProc(...) { if (nCode == HCBT_ACTIVATE ) { // Get handle of Format dialog HWND hWnd = reinterpret_cast<HWND>(wParam); // Enumerate all child windows to get // volume label the edit box EnumChildWindows(hWnd,EnumChildProc,NULL); // Finished our need for the hook UnhookWindowsHookEx(m_hHook); CFormatDriveDialog::m_hHook = NULL; } return FALSE; } BOOL CALLBACK CFormatDriveDialog::EnumChildProc(...) { char buff[256]; GetClassName(hwnd,buff,255); // The vol label edit box is the only edit control if(strcmp(buff,"Edit")==0) { SetWindowText(hwnd,m_vol_label); return FALSE; } return TRUE; }
结论 有几个返回代码和选项代码上面提到的 提到KB文章。但没有一个像预期的那样工作,他们中的一些人不喜欢 在所有的工作。除了代码常数给出快速格式化的工作 完全相反的态度。当然我基地尝试的结果代码 我自己的机器是XP专业盒子。我也得到了詹姆斯·T·约翰逊 测试部分在XP专业箱和Smitha(翠迪)来测试它 她的Windows 2000专业盒子。但是我不知道这个类将是如何工作的 在未经测试的操作系统版本有或没有服务包。 本文转载于:http://www.diyabc.com/frontweb/news2537.html