Форум: "WinAPI";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
ВнизПовторное открытие диалога Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c