Модераторы: 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   Вверх
GremlinProg
Дата 21.10.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ок, убедила ), на счет панелек и правда, не подумал


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


Бывалый
*


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

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



del

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


Бывалый
*


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

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



del

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


Эксперт
****


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

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



Цитата(MenSem @  25.10.2008,  14:51 Найти цитируемый пост)
Проблема в том, что когда мышь вновь попадает в область рисования, появляется линия от того места в области рисования, где мышь была последний раз до выхода из обл. рис. до текущей позиции курсора.

корректируй координаты перед выводом линии:
Код

line_x = min( max( mouse_x , 0 ) , width - 1 );
line_y = min( max( mouse_y , 0 ) , height - 1 );

а фильтруй только повторяющиеся точки, т.е. к примеру, если { last_line_x , last_line_y } == { line_x , line_y }, то рисовать ее смысла нет, т.к. она уже была нарисована на предыдущей итерации.
Но все это, конечно, с учетом SetCapture - ReleaseCapture, иначе разницы не увидишь.

Цитата(MenSem @  25.10.2008,  16:30 Найти цитируемый пост)
 что касается кнопок, как можно сделать их покрасивей, т.е. что бы под стиль системы?

что значит под стиль системы? под стиль темы ХР? Если так, то я уже писал, используй API ThemeXP: библиотека UxTheme.dll и ее набор функций DrawThemeBackground, DrawThemeEdge и т.п. Практически все можно рисовать, используя только DrawThemeBackground.


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


Бывалый
*


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

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



del

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


Бывалый
*


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

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



del

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


Эксперт
****


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

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



Цитата(MenSem @  25.10.2008,  21:36 Найти цитируемый пост)
можно чуть подробней

резервируем две переменные:
Код

#include <vector>
static std::vector<POINT>line;
static captured = FALSE;

фокусируем мышь на клиенте, заодно добавляем в массив точек первую запись:
Код

case WM_LBUTTONDOWN:
  POINT pt;
  pt.x = (short)LOWORD(lParam);
  pt.y = (short)HIWORD(lParam);

  line.push_back(pt);

  ::SetCapture(hwnd);
  captured = TRUE;
  break;

основная проверка, добавление очередной точки в набор и перерисовка клиента (перерисовывать нужно только линию, сам думай как):
Код

case WM_MOUSEMOVE:
  POINT pt;
  pt.x = min( max( (short)LOWORD(lParam) , 0 ) , width - 1 );
  pt.y = min( max( (short)HIWORD(lParam) , 0 ) , height - 1 );
  if( captured && ( ( line.back().x != pt.x ) || ( line.back().y != pt.y ) ) ){
    line.push_back(pt);
    ::InvalidateRect(hwnd,NULL,FALSE);
  }

дефокусировка:
Код

case WM_LBUTTONUP:{
  ::ReleaseCapture();
  captured = FALSE;
  break;
}

обычный способ отображения такого массива:
Код

case WM_PAINT:{
  ...
  if( !lines.empty() ){
    ::MoveToEx( hdc , lines.back().x , lines.back().y,NULL);
    for(int i = lines.size();i--;){
      ::LineTo( hdc , lines.at(i).x , lines.at(i).y);
    }
  }
  ...
}

если нужно зафиксировать не всю область клиента под рисование, а например какой-нить ее прямоугольник (rc), то добавляй проверку на вхождение точки него на WM_LBUTTONDOWN и в WM_MOUSEMOVE делай такой расчет точки:
Код

  pt.x = min( max( (short)LOWORD(lParam) , rc.left ) , rc.right );
  pt.y = min( max( (short)HIWORD(lParam) , rc.top ) , rc.bottom );




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


Шустрый
*


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

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



QT поможет adobe юзает QT и не жалуется!!!
К стати вопрос наверное не в тему, но все же зачем программить на winApi GUI??????
PM MAIL ICQ   Вверх
GremlinProg
Дата 11.11.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lycifer @  10.11.2008,  21:08 Найти цитируемый пост)
QT поможет adobe юзает QT и не жалуется!!!

судя по 7-й версии, среди более чем 200 окон фотошопа, не заметил ни одного намека на QT
Цитата(Lycifer @  10.11.2008,  21:08 Найти цитируемый пост)
зачем программить на winApi GUI?

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


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


Шустрый
*


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

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



Цитата

судя по 7-й версии, среди более чем 200 окон фотошопа, не заметил ни одного намека на QT 


 - adobe юзает QT (я не писал про 7-й версии и не смотрел на неё, но вот что у adobe только один продукт?)


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

При чем тут язык? Я говорю о том что пользовательский интерфейс писать на API как то .... 
Понятное дело что все равно программа будет вызывать API (win API для Windows) но просто обращения программиста будет через ООП, более читабельным, да и писать намного быстрее и приятней.

PM MAIL ICQ   Вверх
GremlinProg
Дата 11.11.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Lycifer @  11.11.2008,  17:13 Найти цитируемый пост)
adobe юзает QT (я не писал про 7-й версии и не смотрел на неё, но вот что у adobe только один продукт?)

QT много кто юзает, только при чем он тут, если речь конкретно о фотошопе, который, как мы уже выяснили, к кути отношения не имеет.
У нас с тобой разговор получается о тапках сапога, носками полнолуние. )
Цитата(Lycifer @  11.11.2008,  17:13 Найти цитируемый пост)
писать на API как то .... 

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

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

Знание API подразумевает умение ориентироваться в инструментах контекстом API, т.е., собственно, понимать к каким следствиям приводят те или иные вызовы высокоуровневых методов обертки над API, будь то MFC, Builder, Delphi, Basic и прочие, что всегда приводит к разбору единого стандарта системных правил, которому все равно кто его будет исполнять, но благодаря которому мы всегда можем понять друг друга, независимо от того, кто на каком языке пишет.



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


любитель
****


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

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



Цитата(MenSem @  25.10.2008,  19:19 Найти цитируемый пост)
Короче что бы по красивей были, а не квадратные.

Я так понял что у Вас стоит виндоуз ХП. Все приложения имеют красивые кнопки, а Ваше квадратные.
Вопрос как применить к ГУИ стиль системы. так ? 
Добавьте в каталог с программой файл имя_проги.exe.Manifest с таким содержимым:
Цитата

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
  xmlns="urn:schemas-microsoft-com:asm.v1"
  manifestVersion="1.0">
<assemblyIdentity
    name= "имя_проги "
    processorArchitecture="x86"
    version="1.0.0.0"
    type="win32"/>
<description> имя_проги </description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>


Это сообщение отредактировал(а) mes - 16.11.2008, 00:19


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


Бывалый
*


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

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



del

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


любитель
****


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

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



Цитата(MenSem @  15.11.2008,  23:52 Найти цитируемый пост)
Только в exeшник её никак не запихать? 

можно в ресурсы, подробней гугль подскажет как. 


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


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 21.12.2010, 23:59
--------------------
PM MAIL   Вверх
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.0959 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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