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;
}