| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Затирание немодального диалогового окна основным |
| Автор: PirateTigo 20.9.2009, 14:20 | ||||||||
| Я уверен в том, что у меня классическая проблема и разобраться с ней не составит труда опытным программистам WinAPI. В общем так: В программе создано несколько диалоговых окон в числе которых существует три немодальных. Программа работает с графическим объектом, который в процессе работы программы видоизменяется. Для поддержки двойной буферизации создан пользовательский обработчик перерисовки клиентской области приложения, который вызывается по сообщению USER_WM, вот его объявление:
в обработчике сообщения WM_PAINT находится следующий код:
в обработчике сообщения USER_WM используется совместимый с контекстом окна hdc контекст memdc. Все действия по обработке изображения выполняются в контексте memdc, а затем содержимое контекста копируется в контекст окна hdc с помощью этой функции:
В обработчике сообщения WM_CREATE создается немодальное диалоговое окно, использующееся для отображения некоторых параметров графического объекта:
Здесь hActVert - дескриптор немодального диалогового окна, ActVert - Процедура обработки сообщений для этого окна, IDD_ACTVERT - шаблон этого окна, hInst - дескриптор экземпляра основного окна приложения. А теперь вопрос: Какой код и куда мне нужно поместить, чтобы мое немодальное диалоговое окно не затиралось, а вполне себе успешно отображалось в клиентской области окна приложения в процессе работы программы? Заранее благодарен. |
| Автор: PirateTigo 20.9.2009, 15:07 | ||||
| На счет WM_PAINT согласен - не подумал. Код достаточно объемный, поэтому весь его я привести не могу, так как размер сообщения ограничен, попробую отписаться вырезками из диалоговой процедуры основного окна..
Под словом "затиралось" я имел в виду то, что при запуске программы окно отображается, но как только я вызываю обработчик сообщения USER_WM окно исчезает (это понятно потому что происходит копирование с контекста памяти memdc на контекст hdc без отсчения регионов) Из тех вариантов, что вы привели сюда НЕ подходят: - производится какое-либо долгосрочное вычисление, мещающее основной работе окна (в диспетчере задач при этом показана 100% загрузка CPU) Ну и по поводу пакета "телепатия". Я и так по-моему достаточно хорошо все описал и изложил суть проблемы. Дело ведь не в том, что я что-то забыл написать в коде, а в том, что я не знаю как это делается в классическом варианте (это я про немодальное диалоговое окно сейчас), так как использую его в таком контексте впервые. А хамить не нужно. |
| Автор: GremlinProg 20.9.2009, 15:59 | ||||
так это и есть обработчик на немодальном диалоге, который "затирается"? если так, то просто убери DefWindowProc, чтобы она не подтверждала регион коррекции в данном случае оно было обоюдным, т.к. просить помощи без разъяснения ситуации - хамство по отношению к участникам форума |
| Автор: PirateTigo 20.9.2009, 16:03 |
| Убрал - программа зависла как только я попытался изобразить графический объект. Добавлено через 5 минут и 1 секунду Так... Кажется опять не понятно, что я хочу узнать от всех... Мне в общем код не важен, мне нужен просто принцип. Как это делается? А если точнее, то какими средствами можно перерисовать немодальное диалоговое окно. Ну то есть как явно его обновить? |
| Автор: GremlinProg 20.9.2009, 16:24 | ||
да, рисование в USER_WM организовано мягко говоря некорректно, я расчитывал на более обыденную форму, с BeginPaint и EndPaint да и инициализацию второго буфера в WM_CREATE привязывать к hWnd не нужно, т.к. до вызова встронного обработчика его координаты еще не определены на данном этапе, я предлагаю: 1. отвязаться от посылки USER_WM, 2. рисовать все в ответ на WM_PAINT 3. двойной буфер создавать прямо в WM_PAINT 4. пользоваться исключительно BeginPaint и EndPaint 5. если нужно отвязаться от создания второго буфера в WM_PAINT, это можно будет сделать в WM_SIZE, сразу как только будут решены текущие проблемы на форуме много готовых примеров, выбирай наиболее подходящий: http://forum.vingrad.ru/act-Search/CODE/show/searchid-40cb68bda4aeef49e4564f727a049d43/search_in-posts/result_type/topics/flag/search/highlite/wm_paint+%25D0%25B4%25D0%25B2%25D0%25BE%25D0%25B9%25D0%25BD%25D0%25BE%25D0%25B9+%25D0%25B1%25D1%2583%25D1%2584%25D0%25B5%25D1%2580/index.html Добавлено через 6 минут и 27 секунд вот такой запрос немного точнее: http://forum.vingrad.ru/act-Search/CODE/show/searchid-1526993cb5a40a27a97bae001145b8f7/search_in-posts/result_type/topics/flag/search/highlite/wm_paint+%2522%25D0%25B4%25D0%25B2%25D0%25BE%25D0%25B9%25D0%25BD%25D0%25BE%25D0%25B9+%25D0%25B1%25D1%2583%25D1%2584%25D0%25B5%25D1%2580%2522/index.html |
| Автор: PirateTigo 20.9.2009, 17:33 |
| В общем я нашел решение. Нужно просто установить для главного окна стиль WS_CLIPCHILDREN, и/или для дочерних окон стиль WS_CLIPSIBLINGS. Добавлено через 1 минуту и 45 секунд Ответ найден. |