Save Dialog с выбором Encoding
От: pasenger  
Дата: 24.10.07 06:43
Оценка:
В нотепаде при сохранении документа (Save As) показывается практически стандартный диалог за исключением того, что
выпадающих списков 3. Два стандартных: 'File Name', 'Save as Type'. И третий 'Encoding'. Мне тоже понадобился такой диалог (функция GetSaveFileName). Но как от него добиться поля 'Encoding' никак не могу понять. Поможите пожалуйста.
Re: Save Dialog с выбором Encoding
От: Jeweller  
Дата: 24.10.07 07:03
Оценка:
Здравствуйте, pasenger, Вы писали:

P>Но как от него добиться поля 'Encoding' никак не могу понять.


Надо подменить template диалога открытия и написать обработку твоих дополнительных контролов
Re[2]: Save Dialog с выбором Encoding
От: pasenger  
Дата: 24.10.07 07:25
Оценка:
Здравствуйте, Jeweller, Вы писали:

P>>Но как от него добиться поля 'Encoding' никак не могу понять.

J>Надо подменить template диалога открытия и написать обработку твоих дополнительных контролов

Этого я и боялся. Не найдется ли на примете example для C++, в котором производится "подмена template диалога открытия" и реализована "обработка дополнительных контролов"? Не обязательно c выпадающим списком. Просто посмотреть, как это делается в общем. Спасибо
Re: Save Dialog с выбором Encoding
От: Conr Россия  
Дата: 24.10.07 08:28
Оценка:
Здравствуйте, pasenger, Вы писали:

P>В нотепаде при сохранении документа (Save As) показывается практически стандартный диалог за исключением того, что

P>выпадающих списков 3. Два стандартных: 'File Name', 'Save as Type'. И третий 'Encoding'. Мне тоже понадобился такой диалог (функция GetSaveFileName). Но как от него добиться поля 'Encoding' никак не могу понять. Поможите пожалуйста.

Надо добавлять свои template. Примеры как это сделать есть для MFC здесь(MFC) и на pure Win32 API в примере ComDlg32 из Platform SDK (Platform SDK\Samples\WinUI\CommDlg\ComDlg32\)
Re[3]: Save Dialog с выбором Encoding
От: Аноним  
Дата: 24.10.07 09:40
Оценка:
P>Этого я и боялся. Не найдется ли на примете example для C++, в котором производится "подмена template диалога открытия" и реализована "обработка дополнительных контролов"? Не обязательно c выпадающим списком. Просто посмотреть, как это делается в общем. Спасибо

Ничего не нужно "подменять". Просто нужно создать шаблон, который просто прибавится к уже существующему диалогу

Вот например взял из одной программы которая добавляет ещё одим комбобокс к этому диалогу (при чём в зависимости от того
какой именно диалог нужен) К тому же ещё и интернационализирует этот диалог.

// Инициалиация OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hParent;
ofn.lpstrFile = szFilePathBuf;
ofn.lpstrFile[0] = L'\0';
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = L"файлы этой программы\0*.this\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = szFileTitleBuf;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrDefExt = L"this";
ofn.lpstrInitialDir = szCustomDictionariesPath;
ofn.Flags = OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_ENABLEHOOK|OFN_EXPLORER;

switch(uActionID)
    {
    case  ID_CREATE:
        ofn.lpstrTitle = L"Создать файл"; break;
    case  ID_ADD:
        ofn.lpstrTitle = L"Добавить файл"; break;

    }

if (uActionID==ID_CREATE)
    {
    ofn.Flags|=OFN_ENABLETEMPLATE;
    ofn.hInstance  = GetModuleHandle(L"this.dll"); // Или если ексешник то просто NULL
    ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG_AUXTTEMPLATE);
    }

ofn.lCustData = MAKELPARAM((WORD)uLID,(WORD)uActionID);   // Это будет передавнно в функцию диалога то есть действие 
                                                          // определяющее  тип  и ID языка. Если нужно передать/получить больше 
                                                          // параметров в/из функции диалога, то вместо паковки передаём указатель 
                                                          // на соответсвующую им струтру в lCustData.

ofn.lpfnHook = ___OFNHookProc;

BOOL f = GetOpenFileName(&ofn) ;    // Save аналогично я думаю всё






/-------------------------------
//-------------------------------
    UINT_PTR CALLBACK ___OFNHookProc( HWND hdlg, UINT uMsg, 
                                  WPARAM wParam,LPARAM lParam)
    {
    OFNOTIFY * lpOFNNotify;
    switch (uMsg)
    {

    case WM_NOTIFY:
        lpOFNNotify = (LPOFNOTIFY) lParam;

        switch(lpOFNNotify->hdr.code)
            {            
            case  CDN_INITDONE:
                {
                
                HWND hEdt1 = GetDlgItem(lpOFNNotify->hdr.hwndFrom,edt1); 
                HWND hCmb1 = GetDlgItem(lpOFNNotify->hdr.hwndFrom,cmb1);
                HWND hCmb5 = GetDlgItem(hdlg,IDC_COMBO_MYCOMBO);     // Это как раз тот комбобокс который добавили.
                HWND hStc2 = GetDlgItem(lpOFNNotify->hdr.hwndFrom,stc2); 
                HWND hStc3 = GetDlgItem(lpOFNNotify->hdr.hwndFrom,stc3);
                HWND hStc5 = GetDlgItem(hdlg,IDC_LABEL_MYLABEL);  // А это надпись к нему
                
                // Замена надписей кнопок и.т.п.:    
                UINT uActionID = (UINT)HIWORD(lpOFNNotify->lpOFN->lCustData);        // Действие
                UINT uUILangID = (UINT)LOWORD(lpOFNNotify->lpOFN->lCustData);       // Язык  (пока не используем)
                LPWSTR szGFNAction = L"";
                switch(uActionID)
                    {
                     case ID_CREATE:
                        szGFNAction = L"Соз&дать"; break; // Можно сделать массив_надписей[количество языков]
                     case ID_ADD:
                            szGFNAction = L"&Добавить"; break;          
                                           
                    }
                SendMessage(lpOFNNotify->hdr.hwndFrom,CDM_SETCONTROLTEXT,
                               (WPARAM)IDOK,(LPARAM)szGFNAction);
                    SendMessage(lpOFNNotify->hdr.hwndFrom,CDM_SETCONTROLTEXT,
                               (WPARAM)IDCANCEL,(LPARAM)L"Отмена");
                SendMessage(lpOFNNotify->hdr.hwndFrom,CDM_SETCONTROLTEXT,
                               (WPARAM)stc2,(LPARAM)L"Т&ип файла:");          // Лэйбл для cmb1 
                SendMessage(lpOFNNotify->hdr.hwndFrom,CDM_SETCONTROLTEXT,
                               (WPARAM)stc3,(LPARAM)L"Им&я файла:");          // Лэйбл для  edt1
                SendMessage(lpOFNNotify->hdr.hwndFrom,CDM_SETCONTROLTEXT,         
                               (WPARAM)stc4,(LPARAM)L"&Путь:");               // Лэйбл для cmb2

                if(uActionID!=RUTA_DICTIONARYACTION_CREATE)
                    break;
                
                //--------------- Tamplate Aux: --------------------
    
                SetWindowText(hStc5,L"Над&ись для комбобокса:");
                                
                // Позиционирывание дополнительных контролов:
                RECT rcEdt1,rcCmb1,rcStc2,rcStc3;
                GetWindowRect(hEdt1,&rcEdt1);
                GetWindowRect(hCmb1,&rcCmb1);
                GetWindowRect(hStc2,&rcStc2);
                GetWindowRect(hStc3,&rcStc3);
                
                INT uStc5DY = rcStc2.top-rcStc3.top; 
                INT uCmb5DY = rcCmb1.top-rcEdt1.top;
                INT uStc5CX = rcStc2.right-rcStc2.left;
                INT uCmb5CX = rcCmb1.right-rcCmb1.left;  
                INT uStc5CY = rcStc2.bottom-rcStc2.top;
                INT uCmb5CY = rcCmb1.bottom-rcCmb1.top; 

                RECT rcStc5 ,rcCmb5;
                       CopyRect(&rcStc5,&rcStc2);
                CopyRect(&rcCmb5,&rcCmb1);
                MapWindowPoints(GetDesktopWindow(),hdlg,(LPPOINT)&rcStc5,1);
                MapWindowPoints(GetDesktopWindow(),hdlg,(LPPOINT)&rcCmb5,1);
                SetWindowPos(hStc5,0,rcStc5.left,rcStc5.top+uStc5DY,uStc5CX,uStc5CY,SWP_NOZORDER);
                SetWindowPos(hCmb5,0,rcCmb5.left,rcCmb5.top+uCmb5DY,uCmb5CX,uCmb5CY,SWP_NOZORDER);

                // Инициализация комбобокса дополнителльного контрола :
                SendMessage(hCmb5,CB_INSERTSTRING,(WPARAM)0,(LPARAM)L"Параметр 1");
                SendMessage(hCmb5,CB_INSERTSTRING,(WPARAM)1,(LPARAM)L"Параметр 2");
                SendMessage(hCmb5,CB_SETCURSEL,(WPARAM)0,0);
                
                break; 
                
                //------------------------------------------------
                }
            case  CDN_FILEOK:
                {
                // Запоминаем выбор дополнителльного комбобокса (возвращаем его через lCustData)


                HWND hCmb5 = GetDlgItem(hdlg,IDC_COMBO_MYCOMBOBOX);
                lpOFNNotify->lpOFN->lCustData = (LPARAM)SendMessage(hCmb5,CB_GETCURSEL,0,0);
                break;
                }
            }
        break; 
    }
Re[4]: Save Dialog с выбором Encoding
От: pasenger  
Дата: 24.10.07 16:34
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Ничего не нужно "подменять". Просто нужно создать шаблон, который просто прибавится к уже существующему диалогу

А>Вот например взял из одной программы которая добавляет ещё одим комбобокс к этому диалогу (при чём в зависимости от того

А>какой именно диалог нужен) К тому же ещё и интернационализирует этот диалог.

Спасибо. Работает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.