/* Hook-функция для диалогового окна */
UINT CALLBACK Dialog_HookProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if (Msg == WM_NOTIFY)
{
if (((OFNOTIFY*)lParam)->hdr.code == CDN_SELCHANGE) // Сообщение о выборе файла
{
char FileName[MAX_PATH];
SendMessage(GetParent(Wnd), CDM_GETFILEPATH, sizeof(FileName), Integer(&FileName));
Dialog_PreviewFile(FileName, Wnd);
return true;
}
}
return false;
}
//---------------------------------------------------------------------------
/* Инициализация диалогового окна и его отображение */
bool Dialog_Execute()
{
TOpenFilename ofn;
char szFile[MAX_PATH - 1];
int Result;
memset(&ofn, 0, sizeof(TOpenFilename));
memset(&szFile, 0, MAX_PATH);
ofn.lStructSize = sizeof(TOpenFilename);
ofn.hwndOwner = Application->MainForm->Handle;
ofn.hInstance = HInstance;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = "Все файлы (*.*)\0*.*\0";
ofn.nFilterIndex = 0;
ofn.lpstrTitle = "Открыть файл";
ofn.lpstrInitialDir = NULL;
ofn.lCustData = LPARAM(&Info); // Передаем нашу структуру
ofn.lpfnHook = Dialog_HookProc; // Указатель на хук-процедуру
ofn.lpTemplateName = MAKEINTRESOURCE(101);
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY |
OFN_ENABLEHOOK | OFN_ENABLETEMPLATE; // <-- это главное
Result = GetOpenFileName(&ofn);
if (Result)
{
Info.FileName = ofn.lpstrFile; // Записываем имя файла в структуру
}
return Result;
}
//---------------------------------------------------------------------------
/* Предпросмотр файла в диалоговом окне выбора*/
void Dialog_PreviewFile(AnsiString FileName, HWND Wnd)
{
if (!FileExists(FileName)) return;
fMain->Caption = FileName;
}
//---------------------------------------------------------------------------
Предпросмотр файла в окне выбора - Проблема с отрисовкой окна
Код:
Когда я поднимаюсь на папку вверх (или выбираю быстрый путь слева), то элементы диалога не прорисовываются, пока на них не наведешь курсор... почему?
Ну для начала стоит определить, это из-за хука или из-за шаблона..
Цитата: Phodopus
Ну для начала стоит определить, это из-за хука или из-за шаблона..
Откопал причину проблемы...
Если я делаю так:
Код:
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK /*| OFN_ENABLETEMPLATE*/;
Окно диалога прорисовывается нормально во время навигации.
Но если я подключаю свой шаблон и добавляю соответствующий флаг:
Код:
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK | OFN_ENABLETEMPLATE;
То окно не прорисовывается как надо...
В чем может быть проблема?
В шаблоне! :D (он у тебя WS_CHILD?)
Цитата: Phodopus
В шаблоне! :D (он у тебя WS_CHILD?)
101 DIALOG 0, 0, 400, 75
STYLE DS_SETFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE
FONT 8, "MS Shell Dlg"
{
LTEXT "Высота:", 100, 68, 0, 30, 10, NOT WS_GROUP
LTEXT "Ширина:", 101, 68, 15, 30, 10, NOT WS_GROUP
LTEXT "12", 103, 100, 0, 15, 10, NOT WS_GROUP
LTEXT "12", 104, 100, 15, 15, 10, NOT WS_GROUP
CONTROL "", 106, "STATIC", SS_BITMAP, 130, 0, 350, 100, WS_EX_CLIENTEDGE
}
Так-так, что тут надо подправить? :)
для самого диалога попробуй STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | DS_3DLOOK
Цитата: Phodopus
:eek: что такое NOT WS_GROUP, убери срочно (вааааапсче, с предшествующей запятой)
для самого диалога попробуй STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | DS_3DLOOK
для самого диалога попробуй STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | DS_3DLOOK
Все решилось! Спасибо ;)