![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Ловлю WM_NCPAINT в немодальном диалоге.
Меседж приходит только если диалог перекрывается другим окном, или сдвигается за край экрана. Хотелось бы получать его всегда. Код взял с какого-то сайта:
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
наоборот: 1. когда открывается из под другого окна 2. выдвигается из-за края экрана оно приходит всегда, когда нужно перерисовать "неклиента" именно в диалоге такой вызов должен быть трижды взвешен: -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Да, так и есть. Понимаю, но, разве при начальном выводе диалога этого делать не надо? Почему при этом не приходит WM_NCPAINT? Пример привел в первоначальном виде. Удаление вызова DefWindowProc проблемы не решает. Пробовал. |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
можно взглянуть на код, инициализирующий диалог, может даже еще и процедуру диалога? при начальном выводе диалога сообщение так же должно приходить -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
mekhanikus |
|
||||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Вот пример с модальным диалогом. Результат тотже.
main.cpp
BirthDay.rc
|
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
теперь понятно, т.е. результат - текст на посреди заголовка окна, а не приход события WM_NCPAINT явное приведение к LPSTR тут не нужно, наверное если вернуть FALSE, значит будет вызвана процедура по-умолчанию, т.е. заголовок снова затрется если вернуть TRUE, значит обработка сообщения на том и закончится в данном случае нужно вернуть TRUE здесь, как я понимаю, должен кричать warning (не прямо здесь, конечно, но здесь его причина ), кричать должен в конце самой DlgProc вместо DefWindowProc здесь должен стоять DefDlgProc, хотя в данном случае результат будет тот же, но это лучше просто сразу запомнить Добавлено через 8 минут и 24 секунды или прямо на обработчике: -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
mekhanikus |
|
||||||||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
А какже тогда:
С DefDlgProc программа вываливается с сообщением:
Оставил DefWindowProc, если его заремить, рамка вообще не рисуется, как и предполагалось. Вынес обработчик в отдельную функцию (через макрос HANDLE_MSG) - снова не работает. ![]() Пришлось подредактировать windowsx.h:
Насколько это правильно? |
||||||||
|
|||||||||
mekhanikus |
|
||||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Всеравно не работает так как надо.
Надпись пропадает.
|
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
процедура окна и процедура диалога - не одно и то же, смешивать их в куче не надо это делать не надо, у самой функции-обработчика WM_NCPAINT должно быть 2 параметра, а не 3 когда? -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
mekhanikus |
|
||||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Ну, правильно. Параметры функции я не менял:
2 параметра: HWND и HRGN. Я добавил тип возвращаемого значения - BOOL. Когда окно из активного пассивным делается, и наоборот. Опять эта мистическая формула. ![]() Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
не надо ни чего менять менять в windowsx.h, если хочешь переделать макрос, заведи собственный макросы в windowsx.h вообще не для функции диалога сделаны, это макросы для работы в процедуре окна процедура окна: http://msdn.microsoft.com/en-us/library/ms633573(VS.85).aspx функция диалога: http://msdn.microsoft.com/en-us/library/ms645469(VS.85).aspx все остальное работает как обычно:
ps: да, с DefDlgProc я погорячился, она вызывает рекурсию, если ее использовать в функции диалога (ее используют в процедуре окна диалога) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, действительно, сейчас заметил: при смене активности между 2-мя окнами,
перерисовка "неклиента" не вызывается ( скорее всего, вызывается DrawCaption, прямо из WM_NCACTIVATE ), приходится вызывать самому :
можно конечно оптимизировать: вырезать регион клиента из обновления RedrawWindow -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
вот так аккуратнее:
Это сообщение отредактировал(а) GremlinProg - 10.12.2009, 13:38 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Благодарю!
Сейчас будем обмозговывать. Добавлено через 4 минуты и 52 секунды
Достает толстую засаленую общую тетрадь, слюнявит карандаш: "Щас будем конспектировать. По-другому не доходит." ![]() |
|||
|
||||
mekhanikus |
|
|||
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Всетаки в case WM_NCACTIVATE должно быть так:
Подредактировал пример под свои нужды. Пока доволен. ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |