2017-10-28 13 views
-2

Windowsリソースを使用して、 標準のFileOpenDialogを呼び出すダイアログを定義できますか? アイデアは、このようなリソースファイルのエントリ(多分DIALOGまたはDIALOGEX?)リソースファイルから使用するCOMダイアログを指定することはできますか?

これが可能であると(source)の下に貼り付けた一人として、コードを交換するのですか?質問

/* https://msdn.microsoft.com/en-us/library/windows/desktop/ff485843(v=vs.85).aspx */ 
#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; 
} 

背景には、私が「RC」、リソースコンパイラでコンパイルしたウィンドウのリソースファイルを表示する他の場所での例でもMSDEV center からMSDNのチュートリアルを次しています。

私は最近、「ダイアログボックス(hInstanceは、MAKEINTRESOURCE(IDD_ABOUTDIALOG)、hWndを、& AboutDialogProc)を」ダイアログ「について」全体がリソースファイルに指定して使用してWindowsプログラムで参照されている例を見た(link)

IDD_ABOUTDIALOG DIALOGEX 0, 0, 147, 67 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |  WS_SYSMENU 
CAPTION "About" 
FONT 8, "MS Shell Dlg", 400, 0, 0x1 
BEGIN 
    ICON    IDI_APPICON,IDC_STATIC,7,7,20,20 
    LTEXT   "Win32 Test application.",IDC_STATIC,34,7,86,8 
    LTEXT   "©2013 Transmission Zero",IDC_STATIC,34,17,86,8 
    DEFPUSHBUTTON "OK",IDOK,90,46,50,14,WS_GROUP 
END 

読んでいただきありがとうございます!

+1

ダイアログリソースはコード生成ツールではありません。ウィンドウの作成方法と配置方法について説明しています。 –

+0

ダイアログエディタは、貧しい人のUIデザイナーのようなものです。ポイントアンドクリックのデザインは非常に便利ですが、それを使用するにはコードを持っていなければなりません。最小限のプログラム[ここにある](https://stackoverflow.com/a/10233086/17034)。 –

+0

理由のために、標準のダイアログがあります。新しい機能やデザインが標準のダイアログに追加されてから数年後に機能が不足し、 "oldschool"に見える独自のファイルダイアログを実装して、ホイールを再開発しようとしないでください。 'IFileOpenDialog' /' IFileSaveDialog'の周りに小さなラッパー関数を書くだけで、ファイルダイアログを呼び出す必要があるたびに自分自身を繰り返す必要はありません。 – zett42

答えて

0

あなたの質問には正直に言い表されていませんが、それほど意味がありません。

リソースは単純なデータであり、独自の実装は提供していません。 (DialogBox *ファンクションファミリーがテンプレートを読み込んで、すでにインスタンス化されたコントロールをカプセル化したコンパイル済みリソースではなく、指定されたコントロールを順番に作成することによって、ダイアログからテンプレートからインスタンス化されます)。

独自のダイアログが作成されたときにファイルを開くダイアログを表示する場合は、上記のようなコード(CoInitialize/CoUninitializeの間の部分)でWM_INITDIALOGメッセージを処理することができます。通常、ボタンまたはメニュー項目アイテムがトリガされたときにWM_COMMANDメッセージを受け取ります。

関連する問題