![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:39 --------------------
|
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:39 --------------------
|
|||
|
||||
| Fin |
|
|||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 1 Всего: 10 |
Ну фирма Adobe славится своими компонентами при оформлении программ. Значит нужно будет самому писать такой же компонент или находить как использовать фотошопный компонент и как с ним работать.
-------------------- Пролетал мимо. |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Мне кажется что у фотошопа главное окно - это обыччное окно, а панели инструментов это окна со свойством "поверх всех окон"
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Dem_max, говорил я ему об этом уже.
MenSem, посмотри еще раз свою тему по созданию StatusBar'а. В фотошопе панельки без стиля WS_CAPTION, но со стилем WS_POPUP, поскольку он эмулирует MDI, вот там и приходится делать свой заголовок окна, кстати, заметь, заголовок не стандартный, без градиента, просто нарисована синяя полоска. Сделай статус бар, только наоборот - сверху, точно по такой же схеме, только рисуй его не бордером, а к примеру FillRect с синей кистью, или можешь градиентом заполнить. чтобы таскать за такой заголовок окошко, нужно перехватить сообщение WM_NCHITTEST и возвращать HTCAPTION при вхождении тестируемой точки в прямоугольник области заголовка. кнопки там так же - самопальные и рисуются они так же, в неклиентской области, чтобы отображать нажатие, залипание отпускание, нужно перехватывать сообщения WM_NCLBUTTONDOWN, WM_MOUSEMOVE, WM_CAPTURECHANGED, WM_LBUTTONUP, а чтобы пееррисовать часть неклиентской области в моменты срабатывания мышиных событий - RedrawWindow (с переводом прямоугольной области неклиента в клиент) но я бы не рекомендовал тебе щас так прямо сразу заниматься кнопками, реализуй хотя бы заголовок окна, это на много проще -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Вот как раз окошки панелей инструментов это скорее всего со стилем WS_EX_TOOLWINDOW, знаешь почему ? потому что если сменить цветовую схему в винде или стиль оформления, то заголовки этих окон меняются сообветствующим образом. Даже если используются левые темы оформления.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Dem_max, загляни в Spy.
Стиля WS_CAPTION у панелей фотошопа нет а WS_EX_TOOLWINDOW стоит только для того, чтобы скрыть эти попап-панельки из списка ALT+TAB и из панели задач. привязаться к теме оформления элементарно. Для этого можно использовать системные цвета GetSysColor, GetSysColorBrush - рисуй сколь дуже угодно: COLOR_ACTIVECAPTION COLOR_INACTIVECAPTION COLOR_GRADIENTACTIVECAPTION COLOR_GRADIENTINACTIVECAPTION это все, что качается заголовка Добавлено через 5 минут и 47 секунд С темами тут другая ситуация, которая не стандартизируется и не фиксируется, поскольку рисовать в стилях XP можно на любом месте и обоями любого контрола, например можно поставить тему любого окна вот так: SetWindowTheme(hwnd,L"explorer",L"scrolbar"), тогда, с включенной темой XP, можно наблюдать зрелище с полосой заголовка, раскрашенной как кнопки скроллера, но это не единственный способ сменить облик окна. Можно любой элемент окна раскрасить самостоятельно, для этого и существует весь набор ThemeAPI: OpenThemeData, CloseThemeData, DrawThemeBackground и т.п. поскольку заголовка окна в стилях нет, а он визуально присутствует, следовательно, его рисуют дополнительно, а для XP просто нашли какой-нить контрол подходящий (по моему какая-то кнопка, хп не использую, могу ошибаться). -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:39 --------------------
|
|||
|
||||
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
так и надо было сразу вопрос ставить про активность я тоже писал, правда и не так часто это вопрос в тему "как поставить фокус во второстепенное окно, не снимая при этом активность с главного" конечно, активное окно может быть только одно, но стратегия переключения этой активности предполагает наличие "дружественных" окон, которые как бы делят между собой эту активность. чтобы задать в приложении такой "дружественный" набор окон, в системе есть специальный фильтр, управляемый через сообщение WM_NCACTIVATE. Сразу скажу, что этот фильтр документирован только частично. параметры этого сообщения: (BOOL)wParam TRUE - строка заголовка должна быть перекрашена в активные цвета FALSE - строка заголовка должна быть перекрашена в неактивные цвета (HWND)lParam это дескриптор окна, которому, или с которого переносится активность (в зависимости от wParam) результат сообщения - булевый, TRUE означает, что система не будет делать действие, определенное в wParam FALSE - система сделает все как обычно, т.е. перекрасит заголовок Так, теперь можно организовать группу "дружественных" окон, Пусть, к примеру есть два окна A и B, активность которых не должна визуально переноситься друг на друга, тогда в процедуре окна A нужно переписать сообщение WM_NCACTIVATE примерно так:
аналогично и с окном B:
т.е. мы как бы настраиваем их друг на друга, результат увидишь сам наверное интересно, где в системе используется такой фильтр? в менюшках и распахивающихся списках, где требуется фокус ввода, это ведь те же самые попап окна, просто система по умолчанию фильтрует для них фокус активности, чтобы они не казались чужими по отношению к приложениям, в которых они используются. Добавлено через 14 минут и 12 секунд чтобы не было визуальных накладок при переходе глобальной активности с/на приложение, дополнительно к WM_NCACTIVATE нужно обработать сообщение WM_ACTIVATEAPP главного окна, в котором вызвать SetWindowPos с флагом SWP_FRAMECHANGED для всех окон, в союзе активности (т.е. в данном случае - и для A, и для B), ели приложение становится неактивным. если приложение активизируется, то нужно перенести активность через все окна союза активности по-порядку: вызвать для них SetActiveWindow (порядок не имеет значения, можно, к примеру, пойти с конца, чтобы последним активировалось главное окно) эффект будут в точности такой же как и в винформс, который ты показал: -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
вместо SetWindowPos можно использовать RedrawWindow с параметром RDW_FRAME, т.е. не обязательно пересчитывать клиентские области для окон союза, нужно просто перекрасить их заголовки, а каким способом - не имеет значения
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:40 --------------------
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
В дополнение к тому, что написал GremlinProg, расскажу, как это делается в MFC. Чтобы не заводить списки "дружественных" окон, заведен специальный (MFC-specific) стиль, что-то типа SYNCACTIVATE. По умолчанию он ставится всяким мини-док-фреймам, в которых живут панельки и прочая поп-ап мелочь. Обработчик NCACTIVATE проверяет не хандл окна, а его стиль, а дальше - все как вышеописано.
-------------------- ... |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:40 --------------------
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
если можно обойтись без функции ClipMouse, то лучше ее вообще не использовать, т.к. она ограничивает действия пользователя, у него появляются симптомы как при клаустрафобии, нервничает ).
ограничивать манипуляции с мышью при захвате мышиного фокуса (SetCapture) нужно на WM_MOUSEMOVE: просто проверяй сначала координаты, а затем уже принимай действия, с ними связанные:
PtInWorkArea - условная функция, в которой, например проверяется вхождение точки в область клиента (при захвате мышиного фокуса, WM_MOUSEMOVE приходит всякий раз, когда происходит передвижение мышью, даже если курсор не над клиентской областью) Earnest, ни каких списков в принципе заводить и не надо, обычно в таких приложениях четко заданное число окон союза активности, но, конечно, можно использовать отдельный флаг в стилях или посылать какое-нить сообщение, для идентификации окна, как члена союза (главное не забывать о нем и отдавать себе отчет в том, что стиль при версионализации может перекрыть некоторый функционал класса, как впрочем и сообщение, в этом случае надежнее будет использование RegisterWindowMessage). Если не использовать идентификацию, то списки могут потребоваться только при динамическом распределении набора таких попап окошек, но я такого еще не видел и, думаю, не увижу. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
GremlinProg, это в принципе отклонение от темы, но тем не менее, поспорю насчет "четко заданного числа окон союза активности". Не представляю себе приложение более или менее серьезное, где панели бы не плодились динамически в непредсказуемых количествах. Ну или хотя бы не создавалиь-исчезали по ходу работы. Конечно, их можно где-то регистрировать, но это уже лишняя сущность. Флаг-стиль гораздо более простое решение.
Честно сказать, удивил: я только такое и вижу. Ну, если не считать учебных примеров в разных книжках. -------------------- ... |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ок, убедила ), на счет панелек и правда, не подумал
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:40 --------------------
|
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:41 --------------------
|
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
корректируй координаты перед выводом линии:
а фильтруй только повторяющиеся точки, т.е. к примеру, если { last_line_x , last_line_y } == { line_x , line_y }, то рисовать ее смысла нет, т.к. она уже была нарисована на предыдущей итерации. Но все это, конечно, с учетом SetCapture - ReleaseCapture, иначе разницы не увидишь.
что значит под стиль системы? под стиль темы ХР? Если так, то я уже писал, используй API ThemeXP: библиотека UxTheme.dll и ее набор функций DrawThemeBackground, DrawThemeEdge и т.п. Практически все можно рисовать, используя только DrawThemeBackground. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:57 --------------------
|
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:58 --------------------
|
|||
|
||||
| GremlinProg |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
резервируем две переменные:
фокусируем мышь на клиенте, заодно добавляем в массив точек первую запись:
основная проверка, добавление очередной точки в набор и перерисовка клиента (перерисовывать нужно только линию, сам думай как):
дефокусировка:
обычный способ отображения такого массива:
если нужно зафиксировать не всю область клиента под рисование, а например какой-нить ее прямоугольник (rc), то добавляй проверку на вхождение точки него на WM_LBUTTONDOWN и в WM_MOUSEMOVE делай такой расчет точки:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||||||
|
|||||||||||||
| Lycifer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
QT поможет adobe юзает QT и не жалуется!!!
К стати вопрос наверное не в тему, но все же зачем программить на winApi GUI?????? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
судя по 7-й версии, среди более чем 200 окон фотошопа, не заметил ни одного намека на QT вопрос абсолютно некорректен, посмотри определение понятия "язык программирования" и расшифровку API. хочешь реально узнать ответ, задай корректный вопрос. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Lycifer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
- adobe юзает QT (я не писал про 7-й версии и не смотрел на неё, но вот что у adobe только один продукт?) вопрос абсолютно некорректен, посмотри определение понятия "язык программирования" и расшифровку API. хочешь реально узнать ответ, задай корректный вопрос. При чем тут язык? Я говорю о том что пользовательский интерфейс писать на API как то .... Понятное дело что все равно программа будет вызывать API (win API для Windows) но просто обращения программиста будет через ООП, более читабельным, да и писать намного быстрее и приятней. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
QT много кто юзает, только при чем он тут, если речь конкретно о фотошопе, который, как мы уже выяснили, к кути отношения не имеет. У нас с тобой разговор получается о тапках сапога, носками полнолуние. ) на API на пишут, API используют! и какой язык или обертка при этом выступает в роли связующего звена, не имеет абсолютно ни какого значения. хоть на ассемблере пиши, кто против. прямые вызовы API используют в основном только в тех случаях, когда инструментальные средства не позволяют напрямую что-то сделать, в остальных случаях используются соответствующие прототипы (редиректы) в инструментах разработчика, именно поэтому твой вопрос некорректен, поскольку писать на API еще ни кто не научился. Знание API подразумевает умение ориентироваться в инструментах контекстом API, т.е., собственно, понимать к каким следствиям приводят те или иные вызовы высокоуровневых методов обертки над API, будь то MFC, Builder, Delphi, Basic и прочие, что всегда приводит к разбору единого стандарта системных правил, которому все равно кто его будет исполнять, но благодаря которому мы всегда можем понять друг друга, независимо от того, кто на каком языке пишет. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Я так понял что у Вас стоит виндоуз ХП. Все приложения имеют красивые кнопки, а Ваше квадратные. Вопрос как применить к ГУИ стиль системы. так ? Добавьте в каталог с программой файл имя_проги.exe.Manifest с таким содержимым:
Это сообщение отредактировал(а) mes - 16.11.2008, 00:19 |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:58 --------------------
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
можно в ресурсы, подробней гугль подскажет как. |
|||
|
||||
| MenSem |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:59 --------------------
|
|||
|
||||
| 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. |