Fenixs wrote: > > Как можно сделать свой титл окна (размер, положение, кнопки....)?
1.
WM_NCPAINT переписать. Но размер при этом не изменить.
2.
WS_CAPTION убрать.
Нарисовать свой псевдо-заголовок требуемого размера.
Нарисовать в нем кнопки (круглые, шестиугольные, фигурные .
Обрабатывать WM_MOUSEMOVE при проходе над ними курсора, WM_LBUTTONDOWN
при нажатии, когда курсор над ними. И т.д.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Привет!
PD>Fenixs wrote: >> >> Как можно сделать свой титл окна (размер, положение, кнопки....)?
PD>1.
PD>WM_NCPAINT переписать. Но размер при этом не изменить.
PD>2.
PD>WS_CAPTION убрать. PD>Нарисовать свой псевдо-заголовок требуемого размера. PD>Нарисовать в нем кнопки (круглые, шестиугольные, фигурные . PD>Обрабатывать WM_MOUSEMOVE при проходе над ними курсора, WM_LBUTTONDOWN PD>при нажатии, когда курсор над ними. И т.д.
PD>-- PD>С наилучшими пожеланиями PD> Дворкин Павел
мдя это конечно здорово самому написать все процедуры работы с титле
( перемещение окна, минимизация/максимизация по дабл клику... )
а стандартных апишных функций нету?
во многих оболочках (том же Visual C 6, WSAD, Eclipse... ) там титлы с кнопками свои не стандартные...
Fenixs wrote: > мдя это конечно здорово самому написать все процедуры работы с титле > ( перемещение окна, минимизация/максимизация по дабл клику... ) > а стандартных апишных функций нету?
Кое-что есть : DrawFrameControl, но толку от него мало.
Ну так хватай WM_NCPAINT... и заодно WM_NCHITTEST.
Никакую максимизацию и т.п. менять не придется, только переопределить, где лежат в заголовке разные элементы. Но, откровенно говоря, я как-то немного с этим поэкспериментировал, и, помнится, то ли мерцание было, то ли еще что-то...
Оно и понятно — например, поток-владелец окна повис, а система ведь все равно рисует заголовок, видели, наверное? То есть есть еще кто-то помимо DefWindowProc, кто отрисовывает non-client area.
Кстати, коллеги, не просвятите, кто это и как с ним договориться, чтобы он поумерил активность?
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Интересно.
Захват мыши делают SetCapture. Опасно, хотя мелкие баги в поведении можно и стерпеть... если лень писать хук
Новые "кнопки" невозможно будет найти функциями типа control-at-pos(hwnd,x,y). Но это уже вообще из области мечтаний, правда?
А вот мое замечание относительно того, что будет при провисании message pump, остается в силе. Новых кнопок в такой ситуации видно не будет
DrawTransparentBitmap подозрительно здоровый что-то, казалось бы, задача несложная... Впрочем, я не особо аккуратно читал
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Pavel Dvorkin, Вы писали: PD>Fenixs wrote: >> >> Как можно сделать свой титл окна (размер, положение, кнопки....)?
PD>1.
PD>WM_NCPAINT переписать. Но размер при этом не изменить.
Размер можно изменить, для этого есть WM_NCCALCSIZE.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>Здравствуйте, Aton, Вы писали:
A>>Про кнопки здесь http://www.sources.ru/cpp/cpp_ccaptionbutton.shtml
SM>Интересно. SM>Захват мыши делают SetCapture. Опасно, хотя мелкие баги в поведении можно и стерпеть... если лень писать хук
Можно поподробней чем так опасен SetCaprure? Что за мелкие баги?
Здравствуйте, kliff, Вы писали:
K>Можно поподробней чем так опасен SetCaprure? Что за мелкие баги?
Смотри: юзер нажал на левую кнопку, мы захватили мышь. И тут какому-то другому приложению приспичило тоже захватить мышь (согласен, маловероятно, но ведь возможно). Тогда у нас мышь просто отберут. Последствия: кнопка осталась в "утопленном" состоянии (т.е. на самом деле класс кнопки продолжает находиться в соответствующем состоянии) — т.к. мышь с нее, скорее всего, к моменту отпускания клавиши мыши уже утащили, и сообщение об этом отпускании мы не получим.
Значит, 1) если это состояние отражается визуально, то мы увидим залипшую кнопку, 2) в каких-то случаях (возможно, не в данном, но в принципе это возможно) может нарушиться логика работы класса кнопки, а следовательно, возможно, и всего приложения.
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Hello, Slicer!
You wrote on Fri, 28 Nov 2003 14:24:01 GMT:
K>> Можно поподробней чем так опасен SetCaprure? Что за мелкие баги?
SM> Смотри: юзер нажал на левую кнопку, мы захватили мышь. И тут какому-то SM> другому приложению приспичило тоже захватить мышь (согласен, SM> маловероятно, но ведь возможно). Тогда у нас мышь просто отберут. SM> Последствия: кнопка осталась в "утопленном" состоянии (т.е. на самом SM> деле класс кнопки продолжает находиться в соответствующем состоянии) — SM> т.к. мышь с нее, скорее всего, к моменту отпускания клавиши мыши уже SM> утащили, и сообщение об этом отпускании мы не получим.
SM> Значит, 1) если это состояние отражается визуально, то мы увидим SM> залипшую кнопку, 2) в каких-то случаях (возможно, не в данном, но в SM> принципе это возможно) может нарушиться логика работы класса кнопки, а SM> следовательно, возможно, и всего приложения.
Ну, если кто-то использует SetCapture и при этом не реагирует на WM_CAPTURECHANGED, то он сам виноват
Best regards,
Sergey.
Posted via RSDN NNTP Server 1.8 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Sergey, Вы писали:
S>Ну, если кто-то использует SetCapture и при этом не реагирует на WM_CAPTURECHANGED, то он сам виноват
Во-первых, они в этом примере как раз и не реагируют
Во-вторых, в каких-то случаях уведомления о том, что мышь отобрали, достаточно: можно отменить операцию или остановиться там, где в последний момент была мышь. В данном случае, похоже, это так, то есть достаточно добавить анализ WM_CAPTURECHANGED.
Но нередко хотелось бы все же довести операцию до конца. А иногда требуется долговременное отслеживание мышки. Или мы не знаем, насколько оно будет долговременным. В этих случаях imho лучше использовать хуки.
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Hello, Slicer!
You wrote on Fri, 28 Nov 2003 14:48:44 GMT:
S>> Ну, если кто-то использует SetCapture и при этом не реагирует на S>> WM_CAPTURECHANGED, то он сам виноват SM> Во-первых, они в этом примере как раз и не реагируют
Очень может быть, пример я как раз и не смотрел.
SM> Во-вторых, в каких-то случаях уведомления о том, что мышь отобрали, SM> достаточно: можно отменить операцию или остановиться там, где в SM> последний момент была мышь. В данном случае, похоже, это так, то SM> есть достаточно добавить анализ WM_CAPTURECHANGED.
SM> Но нередко хотелось бы все же довести операцию до конца.
Реакция на WM_CAPTURECHANGED — это и есть доведение операции до конца, с возможностью учесть пожелания пользователя — откатить операцию или продолжить.
SM> А иногда требуется долговременное отслеживание мышки.
Напиример?
SM> Или мы не знаем, SM> насколько оно будет долговременным. В этих случаях imho лучше SM> использовать хуки.
Угу, только глючить будет примерно как mouseimp.
Best regards,
Sergey.
Posted via RSDN NNTP Server 1.8 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Hello, Slicer!
You wrote on Fri, 28 Nov 2003 15:08:46 GMT:
SM>>> А иногда требуется долговременное отслеживание мышки. S>> Напиример?
SM> Например, чтобы отследить клик по области, которая перехватом SM> WM_NCHITTEST сделана нечувствительной к мыши.
Не понял. Для отслеживания собственно клика ни хуков, ни даже SetMouseCapture не требуется. SetMouseCapture нужна только для отслеживания перемещений мыши при нажатой кнопке. И хуки в этом случае, насколько я понимаю, нечем не лучше (даже хуже) чем SetMouseCapture.
Best regards,
Sergey.
Posted via RSDN NNTP Server 1.8 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
SM>> Например, чтобы отследить клик по области, которая перехватом SM>> WM_NCHITTEST сделана нечувствительной к мыши.
Звиняйте, тормознул. Тут SetCapture просто не справится (т.к. при движении по этой области, да еще и без нажатой кнопки, сообщения не придут нашему окну — ведь мы сами отмазались от WM_NCHITTEST), так что без хуков не обойтись. Ладно, нужен какой-то пример с движением мыши при нажатой кнопке...
Во, Desktop Toys!
>Не понял. Для отслеживания собственно клика ни хуков, ни даже SetMouseCapture не требуется. >SetMouseCapture нужна только для отслеживания перемещений мыши при нажатой кнопке. И хуки в этом случае, >насколько я понимаю, нечем не лучше (даже хуже) чем SetMouseCapture.
Вот как раз таки и требуется, и даже не хватает Мы же говорим, что клик был не по нам (в WM_NCHITTEST) — как же он к нам тогда придет?
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Hello, Slicer!
You wrote on Fri, 28 Nov 2003 15:39:45 GMT:
SM>>> Например, чтобы отследить клик по области, которая перехватом SM>>> WM_NCHITTEST сделана нечувствительной к мыши. SM> Звиняйте, тормознул. Тут SetCapture просто не справится (т.к. при SM> движении по этой области, да еще и без нажатой кнопки, сообщения не SM> придут нашему окну — ведь мы сами отмазались от WM_NCHITTEST), так что SM> без хуков не обойтись. Ладно, нужен какой-то пример с движением мыши SM> при нажатой кнопке... Во, Desktop Toys!
Что такое Desktop Toys? В принципе, понятно что это какой-то твикер десктопа, но что конкретно оно делает?
??>> Не понял. Для отслеживания собственно клика ни хуков, ни даже
??>> SetMouseCapture не требуется. >SetMouseCapture нужна только для
??>> отслеживания перемещений мыши при нажатой кнопке. И хуки в этом
??>> случае, >насколько я понимаю, нечем не лучше (даже хуже) чем
??>> SetMouseCapture. SM> Вот как раз таки и требуется, и даже не хватает Мы же говорим, что SM> клик был не по нам (в WM_NCHITTEST) — как же он к нам тогда придет?
Не, ты скажи что ты в результате хочешь получить.
Best regards,
Sergey.
Posted via RSDN NNTP Server 1.8 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S>Что такое Desktop Toys? В принципе, понятно что это какой-то твикер десктопа, но что конкретно оно делает?
Какая разница, скачать хочешь? Например, держишь левую кнопку и расстреливаешь десктоп из пулемета. Хотя, боюсь, опять не вполне корректный пример. Он, вроде, морозит десктоп на время выполнения.
Ну и ладно, может, и правда это я загнул. Снимаю с рассмотрения этот пункт, про длительное отслеживание.
S>Не, ты скажи что ты в результате хочешь получить.
Хочу получить: 1) окно является совершенно пустым местом для мыши, 2) его можно таскать мышью.
И не спрашивай, зачем мне это надо, такой вопрос не я первым задал
P.S. Е-мое, сколько уже постингов навалили... Может, хватит?
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Slicer [Mirkwood], Вы писали:
S>>Что такое Desktop Toys? В принципе, понятно что это какой-то твикер десктопа, но что конкретно оно делает? SM>Какая разница, скачать хочешь? Например, держишь левую кнопку и расстреливаешь десктоп из пулемета. Хотя, боюсь, опять не вполне корректный пример. Он, вроде, морозит десктоп на время выполнения. SM>Ну и ладно, может, и правда это я загнул. Снимаю с рассмотрения этот пункт, про длительное отслеживание.
S>>Не, ты скажи что ты в результате хочешь получить. SM>Хочу получить: 1) окно является совершенно пустым местом для мыши, 2) его можно таскать мышью. SM>И не спрашивай, зачем мне это надо, такой вопрос не я первым задал
Вообще-то, эти требования являются взаимоисключающими, поскольку если окно можно таскать мышью, то "пустым местом для мыши" оно уже не является
SM>P.S. Е-мое, сколько уже постингов навалили... Может, хватит?
Ну я тебя писать вроде не заставляю Лично я в 20:00 уйду домой и до понедельника сюда писать не буду
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Slicer [Mirkwood], Вы писали:
S>>Что такое Desktop Toys? В принципе, понятно что это какой-то твикер десктопа, но что конкретно оно делает? SM>Какая разница, скачать хочешь? Например, держишь левую кнопку и расстреливаешь десктоп из пулемета. Хотя, боюсь, опять не вполне корректный пример. Он, вроде, морозит десктоп на время выполнения. SM>Ну и ладно, может, и правда это я загнул. Снимаю с рассмотрения этот пункт, про длительное отслеживание.
Прммер отслеживания при котором не стоит применять SetCapture — тебе надо отследить выход мыши за область окна — типа самому написать TrackMouseEvents().
S>>Не, ты скажи что ты в результате хочешь получить. SM>Хочу получить: 1) окно является совершенно пустым местом для мыши, 2) его можно таскать мышью. SM>И не спрашивай, зачем мне это надо, такой вопрос не я первым задал
Короче подытожив — SetCapture() не опасен, надо просто знать как его готовить.
SM>Slicer