![]() |
|
Модераторы: 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, это в принципе отклонение от темы, но тем не менее, поспорю насчет "четко заданного числа окон союза активности". Не представляю себе приложение более или менее серьезное, где панели бы не плодились динамически в непредсказуемых количествах. Ну или хотя бы не создавалиь-исчезали по ходу работы. Конечно, их можно где-то регистрировать, но это уже лишняя сущность. Флаг-стиль гораздо более простое решение.
Честно сказать, удивил: я только такое и вижу. Ну, если не считать учебных примеров в разных книжках. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "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. |