![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
смысл в том, что все объекты неклиентской области не принадлежат клиентской, поэтому обычный вызов GetDC вернет девайс, который не вмещает такие объекты, они всегда ЗА областью такого девайса. а смысл использования объектов в неклиентской области в том, чтобы разделить основные и вспомогательные элементы окна как правило, вспомогательные объекты рисуются намного быстрее, чем основные, поэтому, чтобы увеличить быстродействие, а соответственно и интерактивность окна, их предпочитают и рисовать раздельно и обрабатывать(см. далее) так же раздельно небольшой набор "мышиных" сообщений так же делится на 2 группы: клиентские и неклиентские неклиентским всегда предшествует префикс NC, например WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE и т.п. смысл этого деления - примерно такой же, как и с рисованием - ускорить обработку объектов окна
я старался минимизировать код, попробуй найти проще, а если что-то непонятно - спрашивай отдельное окно не сделает за тебя эту работу, я лишь описал стандартное управление мышиным фокусом и более корректный (с точки зрения управления данными) способ организации данных в задаче интерактивного рисования кривой. ни кто никогда не рисует " на налету" такие объекты, они всегда должны централизованно храниться в удобоваримом виде, в данном случае - в векторе line
показывай код резервирования и рисования кнопок, будем разбираться -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:59 --------------------
|
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
А как обработать щелчок мышкой в неклиентской области? WM_NCLBUTTONDOWN работает только при щелчке на заголовок формы!
--------------------
|
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
WM_NCLBUTTONDOWN работает на все элементы неклиентской области: HTCAPTION HTSYSMENU HTGROWBOX HTMENU HTHSCROLL HTVSCROLL HTMINBUTTON HTMAXBUTTON HTLEFT HTRIGHT HTTOP и т.п., таких объектов довольно много Объект, распределенный в ответ на сообщение WM_NCCALCSIZE - это еще не полноценный объект неклиентской области, он только рисуется за пределами клиентской области. Чтобы с ним можно было работать полноценно, как с "неклиентом", его нужно "застолбить" в ответ на сообщение WM_NCHITTEST WM_NCHITTEST приходит в процедуру окна с текущими экранными координатами указателя мыши всякий раз, когда требуется определить тип области окна под мышью. До тех пор, пока ответ на это сообщение будет равен HTCLIENT, область под мышью всегда будет считаться клиентской. Чтобы изменить такое поведение для твоего объекта, который ты уже рисуешь в неклиентской области, нужно перехватить WM_NCHITTEST примерно так:
обработку этого сообщения я разделил на 3 части: 1. в первой извлекаются координаты мыши из параметра lParam 2. во второй эта точка преобразуется в координаты неклиентской области окна hwnd. суть преобразования в том, чтобы перевести точку, координаты которой считаются относительно левого-верхнего угла экрана в точку, координаты которой считаются относительно левого-верхнего угла окна (не путать с координатами относительно левого-верхнего угла клиентской области) 3. в третьей проверяется вхождение этой точки в прямоугольную облать non_client_rect, которая была распределена в ответ на сообщение WM_NCCALCSIZE (в теме про статусбар я уже показал как можно распределить "неклиента") и, в случае, если точка входит в этот прямоугольник, возвращается прямой ответ HTOBJECT в систему, минуя DefWindowProc В принципе, возвращать именно HTOBJECT не обязательно, главное вернуть любое положительное значение (за исключением HTCLIENT), чтобы система знала, что в данной точке находится объект именно неклиентской области. Вот и все, теперь все неклиентские сообщения будут реагировать на неклиентскую область non_client_rect. Здесь прямоугольник взят для упрощения, можно использовать лубые формы, главное не особо-то и увлекаться, поскольку лишняя нагрузка на WM_NCHITTEST будет увеличивать время реакции на перемещения мыши (я в своих приложениях даже преобразование второй части минимизирую, чтобы исключить некоторые системные вызовы, но, в принципе, это зависит от конкретной задачи, в данном случае этим можно пренебречь) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:59 --------------------
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а при чем тут рисование?
ну замени на GetParent, но тогда в popup-окне, имеющее владельца, расчет неклиента будет некорректный, если у тебя такого нет, значит пойдет и GetParent. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:59 --------------------
|
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
Я так понял создается массив точек, в котором хранятся все линии. При рисовании проверяются кординаты, и в зависимости от результата линия добавляется/не добавляется в массив точек, затем клиент перерисовывается. Или я не донал? --------------------
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
нет, все правильно понял, так держать!
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:00 --------------------
|
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:00 --------------------
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
какие симптомы?
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:00 --------------------
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
SetWindowPos активирует окно, если не стоит флаг SWP_NOACTIVATE
т.е. в случае деактивации, у тебя так-же проходит фокус ввода, а окна в этот момент нужно только перерисовать Добавлено через 5 минут и 40 секунд
это ближе к тому, что нужно делать в момент деактивации приложения -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:01 --------------------
|
|||
|
||||
![]()
|
| Правила форума "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. |