GetSaveFileName 操作函数笔记

来源:互联网 发布:云计算上市公司龙头 编辑:程序博客网 时间:2024/06/08 16:26

GetSaveFileName 操作函数笔记

【作者】:Ackarlix

 

在工作中,实现控件对IE端打开的Word文档另存为的时候,我陷入了困惑。如何获取到当前的文档,假如打开多个文档如何判断要保存的是哪一篇文档,文档保存后的格式是怎样的,是一个新的普通文档还是一个与IE端打开的文档一样格式的文档?这些都是我需要好好考虑的问题!
首先便是怎样将文档保存到本地!我查找了网上许多论坛社区,都没有找到有价值的内容。所以干脆自己动手,编写一个直接调用Word文档另存为按钮的代码,来实现以上的功能。
要实现另存为功能,那肯定是离不开另存为对话框。通过这个对话框可以将要保存文档的路径获取出来,提供给SaveAs函数,从而实现将目标保存在选定的路径下。所以我这里采用GetSaveFileName函数来实现!
调用GetSaveFileName函数显示 另存为 对话框时,对话框本身可以返回有效或者无效的文件夹,也就是当你不选择任何文件夹时,默认是当前打开的路径,当您单击 保存 。 选中了无效的文件夹时, GetSaveFileName 将使用当前工作目录,当返回完整路径和文件名。 无效的文件夹示例包括网上邻居和网络服务器名。
以下是一个调用例子:(来源微软的MSDN)

 

  1. /*使用 GetSaveFileName 的应用程序可以验证是否目标文件夹是使用处理 CDN_FILEOK 通知的挂钩过程的文件系统的一部分。
  2. 在处理 CDN_FILEOK 通知,挂钩过程获得的指针在选定文件夹的 ITEMIDLIST (PIDL) 发送 CDM_GETFOLDERIDLIST 消息对话框。 返回的 PIDL 然后传递给 SHGetFileInfo 请求文件夹的属性。 如果该文件夹具有 SFGAO_FILESYSTEM 属性它将是文件系统的一部分,可以作为目标文件夹。 */
  3. // 
  4. //  SaveDialog.cpp
  5. // 
  6. #include <windows.h>
  7. #include <commdlg.h>
  8. #include <shellapi.h>
  9. #include <shlobj.h>
  10. UINT_PTR WINAPI SaveAs_OnFileOK (HWND hWnd, OFNOTIFY *pofn)
  11. {
  12.     LPMALLOC pMalloc = NULL;
  13.     LPITEMIDLIST pidlFolder = NULL;
  14.     SHFILEINFO shfi = {0};
  15.     INT cbPidl = 0;
  16.     UINT_PTR nReturn = 0;
  17.     UINT_PTR nResult = 0;
  18.     // 
  19.     //  Get a pointer to the shell's IMalloc interface
  20.     //  
  21.     if (FAILED(SHGetMalloc(&pMalloc)))
  22.         goto Cleanup;
  23.     // 
  24.     //  Get the size of the pidl
  25.     // 
  26.     cbPidl = SendMessage (pofn->hdr.hwndFrom, CDM_GETFOLDERIDLIST, 0, 0);
  27.     if (cbPidl == -1)
  28.         goto Cleanup;
  29.     // 
  30.     //  Allocate memory for the pidl
  31.     // 
  32.     pidlFolder = (LPITEMIDLIST) pMalloc->Alloc (cbPidl);
  33.     if (pidlFolder == NULL)
  34.         goto Cleanup;
  35.     // 
  36.     //  Get the pidl
  37.     // 
  38.     cbPidl = SendMessage (pofn->hdr.hwndFrom, CDM_GETFOLDERIDLIST, 
  39.                           (WPARAM) cbPidl, (LPARAM) pidlFolder);
  40.     if (cbPidl == -1)
  41.         goto Cleanup;
  42.     // 
  43.     //  Determine if the folder has the SFGAO_FILESYSTEM attribute
  44.     // 
  45.     if (!SHGetFileInfo ((LPCTSTR) pidlFolder, 0, &shfi, 
  46.                         sizeof(SHFILEINFO), 
  47.                         SHGFI_PIDL | SHGFI_ATTRIBUTES))
  48.     goto Cleanup;
  49.     if (!(shfi.dwAttributes & SFGAO_FILESYSTEM))
  50.     {
  51.         // 
  52.         //  Display an error and prevent the dialog from closing by
  53.         //  returning 1 from the hook proc and by setting 
  54.         //  DWL_MSGRESULT to 1.
  55.         // 
  56.         MessageBox (hWnd, 
  57.                     TEXT("You cannot save in the folder you specified. Please choose another location."),
  58.                     TEXT("Save As"), MB_OK | MB_ICONINFORMATION);
  59.         nResult = nReturn = 1;
  60.     }
  61. Cleanup:
  62.     if (pMalloc)
  63.     {
  64.         if (pidlFolder)
  65.             pMalloc->Free ((LPVOID)pidlFolder);
  66.         pMalloc->Release();
  67.     }
  68.     SetWindowLong (hWnd, DWL_MSGRESULT, nResult);
  69.     return nReturn;
  70. }
  71. UINT_PTR WINAPI SaveAs_OnNotify (HWND hWnd, NMHDR *phdr)
  72. {
  73.     switch (phdr->code)
  74.     {
  75.         case CDN_FILEOK:
  76.             return SaveAs_OnFileOK (hWnd, (OFNOTIFY *) phdr);
  77.     }
  78.     return 0;
  79. }
  80. UINT_PTR CALLBACK SaveAsHookProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  81. {
  82.     switch (uMsg)
  83.     {
  84.         case WM_NOTIFY:
  85.             return SaveAs_OnNotify (hWnd, (NMHDR *)lParam);
  86.     }
  87.     return 0;
  88. }
  89. INT WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
  90.                     LPSTR lpCmdLine, INT nShowCmd)
  91. {
  92.     TCHAR szFilename[MAX_PATH] = TEXT("");
  93.     BOOL bResult = FALSE;
  94.     DWORD dwError = NOERROR;
  95.     OPENFILENAME ofn = {0};
  96.     ofn.lStructSize = sizeof (OPENFILENAME);
  97.     ofn.lpstrFilter = TEXT("All Files/0*.*/0/0");
  98.     ofn.lpstrFile = szFilename;
  99.     ofn.nMaxFile = MAX_PATH;
  100.     ofn.Flags = OFN_EXPLORER | 
  101.                 OFN_ENABLEHOOK | 
  102.                 OFN_HIDEREADONLY | 
  103.                 OFN_NOCHANGEDIR | 
  104.                 OFN_PATHMUSTEXIST;
  105.     ofn.lpfnHook = (LPOFNHOOKPROC) SaveAsHookProc;
  106.     bResult = GetSaveFileName (&ofn);
  107.     if (bResult == FALSE)
  108.     {
  109.         dwError = CommDlgExtendedError ();
  110.         return dwError;
  111.     }
  112.     MessageBox (NULL, szFilename, TEXT("SaveAs returned..."), MB_OK);
  113.     return 0;
  114. }
原创粉丝点击