2017-10-28 1 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)"(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 
를 사용하여 Windows 프로그램에서 참조 예를 보았다

읽어 주셔서 감사합니다.

+1

대화 리소스는 코드 생성 도구가 아닙니다. 창을 만들고 위치를 지정하는 방법을 설명합니다. –

+0

대화 편집기는 가난한 사람의 UI 디자이너와 같습니다. 포인트 앤 클릭 디자인은 매우 편리하지만 여전히 코드를 가져와 사용해야합니다. 최소한의 프로그램 [여기에 있습니다] (https://stackoverflow.com/a/10233086/17034). –

+0

표준 대화 상자에는 이유가 있습니다. 새로운 기능 및/또는 디자인이 표준 대화 상자에 추가되면 기능이 부족하고 몇 년 후에 "oldschool"을 보게 될 자신 만의 파일 대화 상자를 구현하여 휠을 재발 명하지 마십시오. 'IFileOpenDialog' /'IFileSaveDialog' 주위에 작은 래퍼 함수를 ​​작성하면 파일 대화 상자를 호출 할 때마다 반복하지 않아도됩니다. – zett42

답변

0

귀하의 질문에 정답이 없으며 정직하게 말하면 의미가 없습니다.

리소스는 단순히 데이터이며, 자체적으로 구현하지 않습니다. (DialogBox * function 패밀리가 템플리트를 읽고, 이미 인스턴스화 된 컨트롤을 캡슐화 한 컴파일 된 리소스가 아닌, 표시된 각 컨트롤을 차례대로 생성함으로써 대화 상자가 템플릿으로부터 인스턴스화됩니다.

대화 상자를 만들 때 파일 열기 대화 상자를 표시하려면 위의 코드 (CoInitialize/CoUninitialize 사이의 부분)를 사용하여 WM_INITDIALOG 메시지를 처리 ​​할 수 ​​있습니다. 일반적으로 버튼이나 메뉴 항목이 있어야합니다. 해당 항목이 트리거 될 때 WM_COMMAND 메시지가 나타납니다.

관련 문제