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

Поиск:

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


Бывалый
*


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

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



del

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


Бывалый
*


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

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



del

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


Дракон->Спать();
**


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

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



Ну фирма Adobe славится своими компонентами при оформлении программ. Значит нужно будет самому писать такой же компонент или находить как использовать фотошопный компонент и как с ним работать.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Dem_max
Дата 16.10.2008, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Мне кажется что у фотошопа главное окно - это обыччное окно, а панели инструментов это окна со свойством "поверх всех окон"


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 16.10.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 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 (с переводом прямоугольной области неклиента в клиент)

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


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 16.10.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 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 просто нашли какой-нить контрол подходящий (по моему какая-то кнопка, хп не использую, могу ошибаться).


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


Бывалый
*


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

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



del

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


Эксперт
****


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

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



Цитата(MenSem @  16.10.2008,  22:43 Найти цитируемый пост)
вообще главный вопрос совершенно не в оформлении формы, а  в том, что бы при работе с главным окном это окно выглядело как активное и наоборот.

так и надо было сразу вопрос ставить

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

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

чтобы задать в приложении такой "дружественный" набор окон, в системе есть специальный фильтр, управляемый через сообщение WM_NCACTIVATE. Сразу скажу, что этот фильтр документирован только частично.

параметры этого сообщения: 

(BOOL)wParam
  TRUE - строка заголовка должна быть перекрашена в активные цвета
  FALSE - строка заголовка должна быть перекрашена в неактивные цвета
(HWND)lParam
  это дескриптор окна, которому, или с которого переносится активность (в зависимости от wParam)

результат сообщения - булевый,
  TRUE означает, что система не будет делать действие, определенное в wParam
  FALSE - система сделает все как обычно, т.е. перекрасит заголовок

Так, теперь можно организовать группу "дружественных" окон, 
Пусть, к примеру есть два окна A и B, активность которых не должна визуально переноситься друг на друга,
тогда в процедуре окна A нужно переписать сообщение WM_NCACTIVATE примерно так:
Код

...
case WM_NCACTIVATE:
  if( !wParam && ((HWND)lParam == hwndB) ){
    return TRUE;
  }
  break;
...
return ::DefWindowProc(...);

аналогично и с окном B:
Код

...
case WM_NCACTIVATE:
  if( !wParam && ((HWND)lParam == hwndA) ){
    return TRUE;
  }
  break;
...
return ::DefWindowProc(...);

т.е. мы как бы настраиваем их друг на друга, результат увидишь сам

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

Добавлено через 14 минут и 12 секунд
чтобы не было визуальных накладок при переходе глобальной активности с/на приложение, дополнительно к WM_NCACTIVATE нужно обработать сообщение WM_ACTIVATEAPP главного окна,

в котором вызвать SetWindowPos с флагом SWP_FRAMECHANGED для всех окон, в союзе активности (т.е. в данном случае - и для  A, и для B), ели приложение становится неактивным.

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

эффект будут в точности такой же как и в винформс, который ты показал:
Цитата(MenSem @  16.10.2008,  22:43 Найти цитируемый пост)
Я нашел хороший пример на тему таких окон: Paint.NET 




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


Эксперт
****


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

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



вместо SetWindowPos можно использовать RedrawWindow с параметром RDW_FRAME, т.е. не обязательно пересчитывать клиентские области для окон союза, нужно просто перекрасить их заголовки, а каким способом - не имеет значения


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


Бывалый
*


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

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



del

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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



В дополнение к тому, что написал GremlinProg, расскажу, как это делается в MFC. Чтобы не заводить списки "дружественных" окон, заведен специальный (MFC-specific) стиль, что-то типа SYNCACTIVATE. По умолчанию он ставится всяким мини-док-фреймам, в которых живут панельки и прочая поп-ап мелочь. Обработчик NCACTIVATE проверяет не хандл окна, а его стиль, а дальше - все как вышеописано.


--------------------
...
PM   Вверх
MenSem
Дата 20.10.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

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


Эксперт
****


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

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



если можно обойтись без функции ClipMouse, то лучше ее вообще не использовать, т.к. она ограничивает действия пользователя, у него появляются симптомы как при клаустрафобии, нервничает ).

ограничивать манипуляции с мышью при захвате мышиного фокуса (SetCapture) нужно на WM_MOUSEMOVE: просто проверяй сначала координаты, а затем уже принимай действия, с ними связанные:
Код

...
case WM_MOUSEMOVE:{
  POINT pt;
  pt.x = (short)LOWORD(lParam);
  pt.y = (short)HIWORD(lParam);
  if( !PtInWorkArea(pt) )break;
  // рисуем линию и т.п., если конечно мы в режиме захвата мыши
  break;
}
...

PtInWorkArea - условная функция, в которой, например проверяется вхождение точки в область клиента (при захвате мышиного фокуса, WM_MOUSEMOVE приходит всякий раз, когда происходит передвижение мышью, даже если курсор не над клиентской областью)

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


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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



GremlinProg, это в принципе отклонение от темы, но тем не менее, поспорю насчет "четко заданного числа окон союза активности". Не представляю себе приложение более или менее серьезное, где панели бы не плодились динамически в непредсказуемых количествах. Ну или хотя бы не создавалиь-исчезали по ходу работы. Конечно, их можно где-то регистрировать, но это уже лишняя сущность. Флаг-стиль гораздо более простое решение.
Цитата(GremlinProg @  21.10.2008,  09:50 Найти цитируемый пост)
динамическом распределении набора таких попап окошек, но я такого еще не видел и, думаю, не увижу

Честно сказать, удивил: я только такое и вижу. Ну, если не считать учебных примеров в разных книжках. smile 



--------------------
...
PM   Вверх
Страницы: (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.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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