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; 
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.