2015-04-27 3 views
-1

Я пытаюсь настроить стандартное диалоговое окно «Сохранить как» win32. Мой код выглядит так:Пример диалогового определения для настройки общего диалогового окна «Сохранить как»

OPENFILENAME ofn; 
//... skipped 
ofn.Flags = OFN_ENABLETEMPLATE; 
ofn.lpTemplateName = MAKEINTRESOURCEW(RES); // what is the RES? 
//... skipped 
GetSaveFileName(&ofn); 

Но я не могу найти ни одного примера того, что такое ВИЭ. Это должен быть файл ресурсов или что-то вроде этого. Для начала мне нужен простой пример. Все, что мне нужно в данный момент, это добавить текстовую строку в нижнюю часть стандартного диалогового окна «Сохранить как».

+0

Нет, это не так, как вы это делаете. Это механизм для XP. Теперь вы используете 'IFileDialogCustomize'. –

+0

Хорошо, но мне все еще нужно поддерживать XP. – YuriM

+0

Затем вам нужно использовать 'GetSaveFileName' на XP, с ресурсом шаблона и' IFileDialog' и 'IFileDialogCustomize' на Vista и позже. –

ответ

0

Наконец я нашел образец: CommDlgCust.zip

составляет 14 лет, но до сих пор работает. Старый файл проекта можно легко открыть с помощью Visual C++ 2013.

Таким образом, «RES» - это определение диалога, расположенное в файле rc. Ответ, который я хотел это:

IDD_OPENSAVE DIALOG FIXED IMPURE 0, 0, 280, 53 
STYLE WS_CHILD | WS_CLIPSIBLINGS 
FONT 8, "MS Shell Dlg" 
BEGIN 
    CONTROL   "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,6,266,38 
    CTEXT   "",IDC_STATIC_HINT,12,10,256,28,SS_CENTERIMAGE 
END 

Вот пример кода на основе CommDlgCust.zip:

// ---------- resource.h 
// last line of the file must be an empty line! 

#ifndef IDC_STATIC 
#define IDC_STATIC    -1 
#endif 

#define IDC_STATIC_HINT     1001 
#define IDD_OPENSAVE     110 

// ---------- project.rc 

#include "resource.h" 

#include "targetver.h" 
#include "windows.h" 

IDD_OPENSAVE DIALOG FIXED IMPURE 0, 0, 280, 53 
STYLE WS_CHILD | WS_CLIPSIBLINGS 
FONT 8, "MS Shell Dlg" 
BEGIN 
    CONTROL   "",IDC_STATIC,"Static",SS_ETCHEDFRAME,6,6,266,38 
    CTEXT   "",IDC_STATIC_HINT,12,10,256,28,SS_CENTERIMAGE 
END 

// ---------- main.cpp 

// ...skipped... 

UINT CALLBACK OfnHookProc(HWND hDlg, UINT uMsg, UINT /*wParam*/, LONG lParam) 
{ 
    switch (uMsg) 
    { 
    case WM_NOTIFY: 
     OFNOTIFY* pofNotify = (OFNOTIFY*)lParam; 
     switch (pofNotify->hdr.code) 
     { 
      case CDN_FOLDERCHANGE: 
      { 
       LPTSTR pszPathName; 
       pszPathName = new TCHAR[_MAX_DIR]; 
       HWND hTrueDlg = GetParent(hDlg); 
       SendMessage(hTrueDlg, CDM_GETFOLDERPATH, _MAX_PATH, (LONG)pszPathName); 
       SetDlgItemText(hDlg, IDC_STATIC_HINT, pszPathName); 
       delete[] pszPathName; 
       return TRUE; 
      } 
     } 
    } 
    return FALSE; 
} 

bool MyGetSaveFileName() 
{ 
    WCHAR lpstrFile[1024] = {0}; 

    OPENFILENAME ofn; 
    memset(&ofn, 0, sizeof(ofn)); 
    ofn.lStructSize = sizeof(ofn); 
    ofn.hwndOwner = hWnd; 
    ofn.hInstance = (HINSTANCE)GetWindowLong(ofn.hwndOwner, GWL_HINSTANCE); 
    ofn.lpstrFilter = L"*.TXT"; 
    ofn.lpstrFile = lpstrFile; 
    ofn.nMaxFile = 1023; 
    ofn.lpstrTitle = L"Save"; 
    ofn.Flags = OFN_EXPLORER | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK; 
    ofn.lpTemplateName = MAKEINTRESOURCE(IDD_OPENSAVE); 
    ofn.lpfnHook = OfnHookProc; 

    if (GetSaveFileName(&ofn) != 0) 
     return true; 

    return false; 
} 

Я надеюсь, что это поможет кому-то.

Смежные вопросы