В нотепаде при сохранении документа (Save As) показывается практически стандартный диалог за исключением того, что
выпадающих списков 3. Два стандартных: 'File Name', 'Save as Type'. И третий 'Encoding'. Мне тоже понадобился такой диалог (функция GetSaveFileName). Но как от него добиться поля 'Encoding' никак не могу понять. Поможите пожалуйста.
Здравствуйте, 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\)
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;
}
Здравствуйте, Аноним, Вы писали:
А>Ничего не нужно "подменять". Просто нужно создать шаблон, который просто прибавится к уже существующему диалогу
А>Вот например взял из одной программы которая добавляет ещё одим комбобокс к этому диалогу (при чём в зависимости от того
А>какой именно диалог нужен) К тому же ещё и интернационализирует этот диалог.
Спасибо. Работает