65.9K
CodeProject 正在变化。 阅读更多。
Home

构建 CD 目录数据库

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (6投票s)

2003年10月6日

2分钟阅读

viewsIcon

43408

downloadIcon

1713

一篇关于构建包含 CD 等目录的数据库的工具的文章。

引言

不久前,我想熟悉 Win32 API。因此,我需要构建一些能够让我使用各种控件和内置函数的东西。我决定编写一个程序来查看任何 HD 或 CD 的目录结构,我可以向其中添加自己的备注,并可以选择将这些信息保存到文件中。我还添加了一个搜索功能。由于我经常使用 CodeProject 上的信息来解决遇到的特定问题,所以与大家分享这个结果似乎是个好主意。

使用代码

我认为使用这个程序非常简单明了。有关详细信息,请参阅演示程序中包含的帮助文件。总结其功能如下:

  • 从任何 CD 或 HD 创建目录树;
  • 向树中的任何目录或文件添加自己的备注;
  • 将结果保存到文件中;
  • 在目录树或备注中搜索特定字符串;
  • 打印树,包括备注。

我不想详细说明我构建的代码。我想这都是对 API 的直接使用。我更喜欢使用 Hernán di Pietro 在这些页面中描述的消息拆解宏。它允许你将大型回调函数分解成外观简洁的代码片段,例如:

BOOL CALLBACK NewDlgProc(HWND hwnd, UINT Message, 
                         WPARAM wParam, LPARAM lParam)
{
  switch(Message)
  {
    HANDLE_MSG (hwnd, WM_INITDIALOG, NewDlgProc_OnInitDialog);
    HANDLE_MSG (hwnd, WM_COMMAND,    NewDlgProc_OnCommand);
    case WM_CLOSE:
      EndDialog(hwnd,0);
    break;
    default:
      return FALSE;
  }
  return TRUE;
}

void NewDlgProc_OnCommand(HWND hwnd, int id, 
                        HWND hwndCtl, UINT codeNotify)
{
  switch(id)
  {
    case ID_DIRNAME:
    {
      if(codeNotify == EN_UPDATE)
      {
        HWND hOkButton = GetDlgItem(hwnd, ID_POK);
        BOOL x = EnableWindow(hOkButton, TRUE);
      }
    }
    break;
    case ID_DRIVE:
      NewDlgProc_OnDrive(hwnd, id, hwndCtl, codeNotify);
    break;
    case ID_DIRLIST:
      NewDlgProc_OnDirlist(hwnd, id, hwndCtl, codeNotify);
    break;
    case ID_SELDRIVE:
      NewDlgProc_OnSeldrive(hwnd, id, hwndCtl, codeNotify);
    break;
    case ID_POPEN:
      NewDlgProc_OnOpen(hwnd, id, hwndCtl, codeNotify);
    break;
    case ID_POK:
            NewDlgProc_OnOk(hwnd, id, hwndCtl, codeNotify);
    break;
    case ID_PCANCEL:
      if (!DestroyWindow(hwnd))
        MessageBox(NULL, "Window Destruction Failed!", "Error!",
                  MB_ICONEXCLAMATION | MB_OK);
    break;
  }
}

对于其他新手,我推荐 Brook Miles 的教程。我发现 lcc 编译器很有用。它具有不错的 Win32 支持,并包含各种模板。

关注点

我在 GetSaveFileName 函数中遇到一个奇怪的问题。除非我将 OPENFILENAME 结构中的 lpstrDefExt 成员设置为大写字符,否则该函数会失败。在此之前,它什么也不做,甚至不产生错误返回值。

历史

  • 这是第一个版本,日期为 2003 年 10 月 2 日
© . All rights reserved.