Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1191416861
KLAUS
2007-10-03 17:07
2007.10.28
IP адрес


3-1182325808
msc32
2007-06-20 11:50
2007.10.28
IN (....)


2-1191603024
smartleds
2007-10-05 20:50
2007.10.28
Господа, подскажите плз как програмно убрать с формы


2-1191824158
Quart
2007-10-08 10:15
2007.10.28
Текущая запись


2-1191477523
031178
2007-10-04 09:58
2007.10.28
Как создать приложение на Delphi 8 под Win32





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский