Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Окна в фотошопе, как сделать подобное? 
:(
    Опции темы
GremlinProg
Дата 21.11.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(MenSem @  16.11.2008,  01:52 Найти цитируемый пост)
В чем смысл рисования именно в неклиентской области?

смысл в том, что все объекты неклиентской области не принадлежат клиентской, поэтому обычный вызов GetDC вернет девайс, который не вмещает такие объекты, они всегда ЗА областью такого девайса.

а смысл использования объектов в неклиентской области в том, чтобы разделить основные и вспомогательные элементы окна
как правило, вспомогательные объекты рисуются намного быстрее, чем основные, поэтому, чтобы увеличить быстродействие, а соответственно и интерактивность окна, их предпочитают и рисовать раздельно и обрабатывать(см. далее) так же раздельно 

небольшой набор "мышиных" сообщений так же делится на 2 группы: клиентские и неклиентские
неклиентским всегда предшествует префикс NC, например WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE и т.п.
смысл этого деления - примерно такой же, как и с рисованием - ускорить обработку объектов окна
Цитата(MenSem @  16.11.2008,  01:52 Найти цитируемый пост)
Че-то слишком сложно получается... Может легче отдельное окно делать?

я старался минимизировать код, попробуй найти проще, а если что-то непонятно - спрашивай
отдельное окно не сделает за тебя эту работу, я лишь описал стандартное управление мышиным фокусом и более корректный (с точки зрения управления данными) способ организации данных в задаче интерактивного рисования кривой.
ни кто никогда не рисует " на налету" такие объекты, они всегда должны централизованно храниться в удобоваримом виде, в данном случае - в векторе line
Цитата(MenSem @  16.11.2008,  12:27 Найти цитируемый пост)
Только я че-то не пойму, почему кнопка исчезает в хп с класической темой?

показывай код резервирования и рисования кнопок,  будем разбираться


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MenSem
Дата 26.11.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



del

Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:59
--------------------
PM MAIL   Вверх
MenSem
Дата 26.11.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



А как обработать щелчок мышкой в неклиентской области? WM_NCLBUTTONDOWN работает только при щелчке на заголовок формы!
--------------------
PM MAIL   Вверх
GremlinProg
Дата 26.11.2008, 16:09 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(MenSem @  26.11.2008,  15:55 Найти цитируемый пост)
А как обработать щелчок мышкой в неклиентской области? WM_NCLBUTTONDOWN работает только при щелчке на заголовок формы!

WM_NCLBUTTONDOWN работает на все элементы неклиентской области:
HTCAPTION
HTSYSMENU
HTGROWBOX
HTMENU
HTHSCROLL
HTVSCROLL
HTMINBUTTON
HTMAXBUTTON
HTLEFT
HTRIGHT
HTTOP
и т.п., таких объектов довольно много

Объект, распределенный в ответ на сообщение WM_NCCALCSIZE - это еще не полноценный объект неклиентской области, он только рисуется за пределами клиентской области.
Чтобы с ним можно было работать полноценно, как с "неклиентом", его нужно "застолбить" в ответ на сообщение WM_NCHITTEST

WM_NCHITTEST приходит в процедуру окна с текущими экранными координатами указателя мыши всякий раз, когда требуется определить тип области окна под мышью. До тех пор, пока ответ на это сообщение будет равен HTCLIENT, область под мышью всегда будет считаться клиентской.

Чтобы изменить такое поведение для твоего объекта, который ты уже рисуешь в неклиентской области, нужно перехватить WM_NCHITTEST примерно так:

Код

...
case WM_NCHITTEST:
  RECT rw;
  POINT pt;
  HWND parent;

  pt.x = (short)LOWORD(lParam);
  pt.y = (short)HIWORD(lParam);

  parent = ::GetAncestor(hwnd,GA_PARENT);
  ::GetWindowRect(hwnd,&rw);
  ::MapWindowPoints(HWND_DESKTOP,parent,(POINT*)&rw,2);
  ::MapWindowPoints(HWND_DESKTOP,parent,&pt,1);
  pt.x -= rw.left;
  pt.y -= rw.top;

  if(::PtInRect(&non_client_rect,pt)){
    return HTOBJECT;
  }
break;
...
return::DefWindowProc(...);

обработку этого сообщения я разделил на 3 части:

1. в первой извлекаются координаты мыши из параметра lParam

2. во второй эта точка преобразуется в координаты неклиентской области окна hwnd.
суть преобразования в том, чтобы перевести точку, координаты которой считаются относительно левого-верхнего угла экрана в точку, координаты которой считаются относительно левого-верхнего угла окна (не путать с координатами относительно левого-верхнего угла клиентской области)

3. в третьей проверяется вхождение этой точки в прямоугольную облать non_client_rect, которая была распределена в ответ на сообщение WM_NCCALCSIZE (в теме про статусбар я уже показал как можно распределить "неклиента") и, в случае, если точка входит в этот прямоугольник, возвращается прямой ответ HTOBJECT в систему, минуя DefWindowProc

В принципе, возвращать именно HTOBJECT не обязательно, главное вернуть любое положительное значение (за исключением HTCLIENT), чтобы система знала, что в данной точке находится объект именно неклиентской области.

Вот и все, теперь все неклиентские сообщения будут реагировать на неклиентскую область non_client_rect. Здесь прямоугольник взят для упрощения, можно использовать лубые формы, главное не особо-то и увлекаться, поскольку лишняя нагрузка на WM_NCHITTEST будет увеличивать время реакции на перемещения мыши (я в своих приложениях даже преобразование второй части минимизирую, чтобы исключить некоторые системные вызовы, но, в принципе, это зависит от конкретной задачи, в данном случае этим можно пренебречь)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MenSem
Дата 26.11.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



del

Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:59
--------------------
PM MAIL   Вверх
GremlinProg
Дата 26.11.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(MenSem @  26.11.2008,  18:19 Найти цитируемый пост)
У меня тамтолько FillRect и битмап рисуется.

а при чем тут рисование?
Цитата(MenSem @  26.11.2008,  18:19 Найти цитируемый пост)
error C2065: 'GetAncestor' : undeclared identifiererror C2065: 'GA_PARENT' : undeclared identifier

ну замени на GetParent, но тогда в popup-окне, имеющее владельца, расчет неклиента будет некорректный, если у тебя такого нет, значит пойдет и GetParent.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MenSem
Дата 26.11.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



del

Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:59
--------------------
PM MAIL   Вверх
MenSem
Дата 4.12.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



Цитата(GremlinProg @  21.11.2008,  16:13 Найти цитируемый пост)
а если что-то непонятно - спрашивай


Я так понял создается массив точек, в котором хранятся все линии. При рисовании проверяются кординаты, и в зависимости от результата линия добавляется/не добавляется в массив точек, затем клиент перерисовывается. 
Или я не донал?
--------------------
PM MAIL   Вверх
GremlinProg
Дата 5.12.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



нет, все правильно понял, так держать!


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MenSem
Дата 6.12.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:00
--------------------
PM MAIL   Вверх
MenSem
Дата 19.12.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:00
--------------------
PM MAIL   Вверх
GremlinProg
Дата 19.12.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



какие симптомы?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MenSem
Дата 19.12.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:00
--------------------
PM MAIL   Вверх
GremlinProg
Дата 19.12.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



SetWindowPos активирует окно, если не стоит флаг SWP_NOACTIVATE
т.е. в случае деактивации, у тебя так-же проходит фокус ввода, а  окна в этот момент нужно только перерисовать

Добавлено через 5 минут и 40 секунд
Код

RedrawWindow(hwnd,NULL,NULL,RDW_FRAME | RDW_ERASE | RDW_INVALIDATE);

это ближе к тому, что нужно делать в момент деактивации приложения


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MenSem
Дата 20.12.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 10.7.2008

Репутация: нет
Всего: нет



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:01
--------------------
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.