Windows桌面應用程式(1-2-3-5th) 示例:開啟對話方塊
阿新 • • 發佈:2019-02-06
我們一直使用的Shapes示例有點人為設計。現在我們來看一個可以在真正的Windows程式中使用的COM物件:開啟對話方塊。
顯示“開啟”對話方塊的螢幕截圖
要顯示“ 開啟”對話方塊,程式可以使用一個名為Common Item Dialog物件的COM物件。Common Item對話方塊實現了一個名為IFileOpenDialog的介面,該介面在標頭檔案Shobjidl.h中宣告。
這是一個向用戶顯示“ 開啟”對話方塊的程式。如果使用者選擇一個檔案,程式將顯示一個包含檔名的對話方塊。
#include<windows.h>
#include<shobjidl.h>
int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE,PWSTR pCmdLine,int nCmdShow){
HRESULT hr=CoInitializeEx(NULL,COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE);
if(SUCCEEDED(hr)){
IFileOpenDialog *pFileOpen;
// Create the FileOpenDialog object.
hr=CoCreateInstance(CLSID_FileOpenDialog,NULL,CLSCTX_ALL,IID_IFileOpenDialog,reinterpret_cast <void**>(&pFileOpen));
if(SUCCEEDED(hr)){
// Show the Open dialog box.
hr=pFileOpen->Show(NULL);
// Get the file name from the dialog box.
if(SUCCEEDED(hr)){
IShellItem *pItem;
hr=pFileOpen->GetResult(&pItem);
if (SUCCEEDED(hr)){
PWSTR pszFilePath;
hr=pItem->GetDisplayName(SIGDN_FILESYSPATH,&pszFilePath);
// Display the file name to the user.
if(SUCCEEDED(hr)){
MessageBox(NULL,pszFilePath,L"File Path",MB_OK);
CoTaskMemFree(pszFilePath);
}
pItem->Release();
}
}
pFileOpen->Release();
}
CoUninitialize();
}
return 0;
}
這段程式碼使用了將在後面的模組中介紹的概念,所以如果你不瞭解這裡的所有內容,請不要擔心。這是程式碼的基本概述:
- 呼叫物件的Show方法,該方法向用戶顯示對話方塊。此方法阻塞,直到使用者關閉對話方塊。
- 呼叫物件的GetResult方法。此方法返回一個指向第二個COM物件的指標,稱為Shell專案物件。實現IShellItem介面的Shell項表示使用者選擇的檔案。
- 呼叫Shell專案的GetDisplayName方法。此方法以字串的形式獲取檔案路徑。
- 顯示一個顯示檔案路徑的訊息框。
步驟1,2和7呼叫由COM庫定義的函式。這些是通用的COM功能。步驟3-5呼叫通用專案對話方塊物件定義的方法。
此示例顯示了兩種不同的物件建立方式:通用CoCreateInstance函式和特定於Common Item Dialog物件的方法(GetResult)。