Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

Повторное открытие диалога   Найти похожие ветки 

 
capkoh ©   (2007-04-26 12:18) [0]

Я пытаюсь сделать диалог выбора файла через GetOpenFileName(). Всё работает. Но я хочу каждый раз центрировать диалог относительно главного окна. Использую сообщение WM_INITDIALOG в OFNHookProc (диалог имеет стили OFN_ENABLEHOOK и OFN_EXPLORER) так:

// MainWnd_hWnd -- Handle окна, относительно которого хочу центрировать.

   WM_INITDIALOG :
     begin
       hDlg := GetParent(Wnd);

       GetWindowRect(hDlg, r);
       GetWindowRect(MainWnd_hWnd, rp);

       w := r.Right - r.Left;
       h := r.Bottom - r.Top;

       wp := rp.Right - rp.Left;
       hp := rp.Bottom - rp.Top;

       r.Left := rp.Left + (wp - w) div 2;
       r.Top := rp.Top + (hp - h) div 2;

       SetWindowPos(hDlg, HWND_TOP, r.Left, r.Top, 0, 0, SWP_NOSIZE);

       Result := 0;
     end;

Первый вызов GetOpenFileName() прекрасно центрирует диалог. Я его не закрываю и передвигаю в сторону. Теперь закрываю. Открываю снова, но диалог остается в той позиции, куда я передвинул его в предыдущем вызове! При этом в дебаггере видно, что WM_INITDIALOG вызывается, т.е. положение должно измениться, но оно не меняется.

Где я мог ошибиться? Почему все вызовы, кроме первого, не центритуют диалог?


 
Сергей М. ©   (2007-04-26 12:59) [1]

Win32Check(SetWindowPos(hDlg, HWND_TOP, r.Left, r.Top, 0, 0, SWP_NOSIZE))


 
capkoh ©   (2007-04-26 13:47) [2]

Попробовал. Никакой ошибки не вылезает, т.е. SetWindowPos() успешно отрабатывает (возвращает значение не равное нулю). Более того, если поставить бряк на сообщение WM_SIZE, в котором получить через GetWindowRect() положение диалога, то оно соответствует нужному (тому, что я задаю в WM_INITDIALOG). Но что потом с ним происходит?..

Попробовал через MoveWindow(). Также никакого результата. Первый вызов центрирует диалог, а остальные -- нет. Причем, сообщение WM_MOVE вообще не приходит в OFNHookProc, хотя в SDK имеем: MoveWindow sends the WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, and WM_NCCALCSIZE messages to the window.

Возможно, сказывается специфика OFNHookProc?


 
clickmaker ©   (2007-04-26 15:45) [3]

WM_SHOWWINDOW?


 
capkoh ©   (2007-04-26 16:17) [4]

Нет, не помогло. Сообщение WM_SHOWWINDOW приходит раньше WM_SIZE и при вызове GetWindowRect() оттуда, также возвращает установленные мной координаты (те, которые я хочу). На всякий случай (хотя это и не имеет смысла) вызвал из обработчика WM_SHOWWINDOW функцию SetWindowPos(), ничего не изменилось...

Может, так и должно быть? Я ещё почитал SDK, но подобного в Remarks не нашел...


 
clickmaker ©   (2007-04-26 17:51) [5]

по крайней мере, центровка по этому сообщению работает в ShBrowseForFolder с колбэком...


 
capkoh ©   (2007-04-26 21:12) [6]

Ясно, либо это только у меня, либо я всё же где-то ошибся...


 
Rouse_ ©   (2007-04-26 23:57) [7]


> clickmaker ©   (26.04.07 17:51) [5]
> по крайней мере, центровка по этому сообщению работает в
> ShBrowseForFolder с колбэком...

Ошибка - в калбэк это сообщение не приходит так как нужно... Неделю назад же объяснял :)

Общее решение приводил тут: http://rouse.drkb.ru/components.php#fwopendirectory


 
clickmaker ©   (2007-04-27 09:43) [8]


> Ошибка - в калбэк это сообщение не приходит так как нужно...
> Неделю назад же объяснял

так у него же OFNHook - это разве не то же самое, что он WndProc подменит?
Ну можно в WM_InitDialog конечно это сделать, если есть смысл...


 
clickmaker ©   (2007-04-27 10:36) [9]

хм... щас проверил - ни так, ни так не работает


 
capkoh ©   (2007-04-29 14:08) [10]

Однако так и не центрируется диалог после первого вызова. Ошибок у себя не нашел. Придется считаться с этой, новой для меня, фичей WinAPI.

Признайтесь, кто знал об этом, но не сказал мне? :)



Страницы: 1 вся ветка

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
15-1190734016
ProgRAMmer Dimonych
2007-09-25 19:26
2007.10.28
Вопрос по ресурсам


15-1190811568
Azize
2007-09-26 16:59
2007.10.28
подскажите книжку


2-1191514478
Pacific
2007-10-04 20:14
2007.10.28
Можно ли...


3-1182508157
AleksandrR
2007-06-22 14:29
2007.10.28
Рисунок в DBGrid


2-1191751244
foreverDelphi
2007-10-07 14:00
2007.10.28
как изменить курсор