![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| PirateTigo |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
Я уверен в том, что у меня классическая проблема и разобраться с ней не составит труда опытным программистам WinAPI.
В общем так: В программе создано несколько диалоговых окон в числе которых существует три немодальных. Программа работает с графическим объектом, который в процессе работы программы видоизменяется. Для поддержки двойной буферизации создан пользовательский обработчик перерисовки клиентской области приложения, который вызывается по сообщению USER_WM, вот его объявление:
в обработчике сообщения WM_PAINT находится следующий код:
в обработчике сообщения USER_WM используется совместимый с контекстом окна hdc контекст memdc. Все действия по обработке изображения выполняются в контексте memdc, а затем содержимое контекста копируется в контекст окна hdc с помощью этой функции:
В обработчике сообщения WM_CREATE создается немодальное диалоговое окно, использующееся для отображения некоторых параметров графического объекта:
Здесь hActVert - дескриптор немодального диалогового окна, ActVert - Процедура обработки сообщений для этого окна, IDD_ACTVERT - шаблон этого окна, hInst - дескриптор экземпляра основного окна приложения. А теперь вопрос: Какой код и куда мне нужно поместить, чтобы мое немодальное диалоговое окно не затиралось, а вполне себе успешно отображалось в клиентской области окна приложения в процессе работы программы? Заранее благодарен. |
||||||||
|
|||||||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а зачем пересылать из WM_PAINT к USER_WM, когда все можно рисовать прямо в WM_PAINT
не совсем понятно, что значит "затиралось", тут могут быть разные ситуации: - рисование немодального диалога (который затирается) не производится на WM_PAINT (при этом затирается не весь диалог, а только пользовательское содержимое) - процедура окна немодального диалога блокируется каким-либо образом - производится какое-либо долгосрочное вычисление, мещающее основной работе окна (в диспетчере задач при этом показана 100% загрузка CPU) и во всех случаях нужно видеть исходный код, чтобы определить причину такого поведения, а без кода можешь расчитывать только на диалог с самим собой, т.к. все, что за пределами кода - телепатия, а у нас пока большинство участников бегают со старыми сервис-паками, без апгрейда "телепатия", не обессудь -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| PirateTigo |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
На счет WM_PAINT согласен - не подумал.
Код достаточно объемный, поэтому весь его я привести не могу, так как размер сообщения ограничен, попробую отписаться вырезками из диалоговой процедуры основного окна..
Под словом "затиралось" я имел в виду то, что при запуске программы окно отображается, но как только я вызываю обработчик сообщения USER_WM окно исчезает (это понятно потому что происходит копирование с контекста памяти memdc на контекст hdc без отсчения регионов) Из тех вариантов, что вы привели сюда НЕ подходят: - производится какое-либо долгосрочное вычисление, мещающее основной работе окна (в диспетчере задач при этом показана 100% загрузка CPU) Ну и по поводу пакета "телепатия". Я и так по-моему достаточно хорошо все описал и изложил суть проблемы. Дело ведь не в том, что я что-то забыл написать в коде, а в том, что я не знаю как это делается в классическом варианте (это я про немодальное диалоговое окно сейчас), так как использую его в таком контексте впервые. А хамить не нужно. |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
так это и есть обработчик на немодальном диалоге, который "затирается"? если так, то просто убери DefWindowProc, чтобы она не подтверждала регион коррекции в данном случае оно было обоюдным, т.к. просить помощи без разъяснения ситуации - хамство по отношению к участникам форума -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| PirateTigo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
Убрал - программа зависла как только я попытался изобразить графический объект.
Добавлено через 5 минут и 1 секунду Так... Кажется опять не понятно, что я хочу узнать от всех... Мне в общем код не важен, мне нужен просто принцип. Как это делается? А если точнее, то какими средствами можно перерисовать немодальное диалоговое окно. Ну то есть как явно его обновить? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, рисование в 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/sh...2580/index.html Добавлено через 6 минут и 27 секунд вот такой запрос немного точнее: http://forum.vingrad.ru/act-Search/CODE/sh...2522/index.html -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| PirateTigo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
В общем я нашел решение.
Нужно просто установить для главного окна стиль WS_CLIPCHILDREN, и/или для дочерних окон стиль WS_CLIPSIBLINGS. Добавлено через 1 минуту и 45 секунд Ответ найден. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |