Re[14]: Как сделать кнопки в титле окна?
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 01.12.03 16:45
Оценка:
Здравствуйте, kliff, Вы писали:

K>Короче подытожив — SetCapture() не опасен, надо просто знать как его готовить.

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

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[15]: Как сделать кнопки в титле окна?
От: Sergey Россия  
Дата: 01.12.03 16:58
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:

SM>Здравствуйте, kliff, Вы писали:


K>>Короче подытожив — SetCapture() не опасен, надо просто знать как его готовить.

SM>Ну, скажем, у меня не придумалось контрпримеров Факт тот, что SetCapture имеет смысл юзать только тогда, когда мы можем как-то корректно обработать потерю захвата.

Во всех случаях, когда вообще удастся юзать SetCapture, потерю захвата можно отработать корректно. А использовать хуки имеет смысл только тогда, когда других средств нет (ну, не совсем — таймеры иногда еще хуже).
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[14]: Как сделать кнопки в титле окна?
От: Sergey Россия  
Дата: 01.12.03 16:59
Оценка:
Здравствуйте, kliff, Вы писали:

K>Здравствуйте, Slicer [Mirkwood], Вы писали:


S>>>Что такое Desktop Toys? В принципе, понятно что это какой-то твикер десктопа, но что конкретно оно делает?

SM>>Какая разница, скачать хочешь? Например, держишь левую кнопку и расстреливаешь десктоп из пулемета. Хотя, боюсь, опять не вполне корректный пример. Он, вроде, морозит десктоп на время выполнения.
SM>>Ну и ладно, может, и правда это я загнул. Снимаю с рассмотрения этот пункт, про длительное отслеживание.

K>Прммер отслеживания при котором не стоит применять SetCapture — тебе надо отследить выход мыши за область окна — типа самому написать TrackMouseEvents().


Слово "не стоит" здесь неуместно — SetCapture там просто не применишь
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[16]: Как сделать кнопки в титле окна?
От: AndrewJD США  
Дата: 01.12.03 17:39
Оценка:
Здравствуйте, Sergey, Вы писали:


S>Во всех случаях, когда вообще удастся юзать SetCapture, потерю захвата можно отработать корректно. А использовать хуки имеет смысл только тогда, когда других средств нет (ну, не совсем — таймеры иногда еще хуже).


А чем таймеры хуже ?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[17]: Как сделать кнопки в титле окна?
От: Sergey Россия  
Дата: 02.12.03 07:46
Оценка:
Hello, AndrewJD!
You wrote on Mon, 01 Dec 2003 17:39:55 GMT:

S>> Во всех случаях, когда вообще удастся юзать SetCapture, потерю захвата

S>> можно отработать корректно. А использовать хуки имеет смысл только
S>> тогда, когда других средств нет (ну, не совсем — таймеры иногда еще
S>> хуже).

A> А чем таймеры хуже ?


Отлажавать сильно мешают Ну и просто неэстетичны — как, впрочем, и хуки.

Best regards,
Sergey.
Posted via RSDN NNTP Server 1.8 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Как сделать кнопки в титле окна?
От: Crush Россия http://www.ael.ru/_crush/
Дата: 23.12.03 03:53
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:

SM>Ну так хватай WM_NCPAINT... и заодно WM_NCHITTEST.

SM>Никакую максимизацию и т.п. менять не придется, только переопределить, где лежат в заголовке разные элементы. Но, откровенно говоря, я как-то немного с этим поэкспериментировал, и, помнится, то ли мерцание было, то ли еще что-то...
SM>Оно и понятно — например, поток-владелец окна повис, а система ведь все равно рисует заголовок, видели, наверное? То есть есть еще кто-то помимо DefWindowProc, кто отрисовывает non-client area.
SM>Кстати, коллеги, не просвятите, кто это и как с ним договориться, чтобы он поумерил активность?

SM>Slicer


Именно DefWindowProc и перерисовывает caption и всю non-client area. Я справился с этой проблемой просто: по событиям WM_NCPAINT и WM_NCACTIVATE рисую всю non-client area, включая титл и кнопки с иконкой на нем, возвращаю true, не вызывая DefWindowProc.

Тут прорисовка non-client без титла:

DrawEdge(hdc, &rc2, EDGE_RAISED, BF_RECT);

HPEN pen_old;
HPEN hpen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNFACE));
pen_old = (HPEN)SelectObject(hdc, hpen);
MoveToEx(hdc, rc2.left+2, rc2.top+2, NULL);
LineTo(hdc, rc2.left+2, rc2.bottom-3);
LineTo(hdc, rc2.right-3, rc2.bottom-3);
LineTo(hdc, rc2.right-3, rc2.top+2);
LineTo(hdc, rc2.left+2, rc2.top+2);
MoveToEx(hdc, rc2.left+2, rc2.top+3+GetSystemMetrics(SM_CYSIZE), NULL);
LineTo(hdc, rc2.right-3, rc2.top+3+GetSystemMetrics(SM_CYSIZE));
SelectObject(hdc, pen_old);
DeleteObject(hpen);


rc2 — это RECT который хранит размеры окна. (Хех, ща подумал, что rc2.left и rc2.top всегда равны нулю... нахрена я их вписывал...)

Это далеко не образец для подражания. Я с удовольствием выслушаю гораздо более лудшие предложения. Ведь бордер окна юзверь может изменить и тогда получаем глюк с отрисовкой...

Но проблема полностью таким способом не решается, т.к.
1. при клике на титле отрисовываются старые кнопки с голубой рамочкой.
2. нарисоваными кнопками еще рулить надо.

Ето значит, что в бой вступают WM_NCLBUTTONDOWN, WM_NCRBUTTONDOWN и WM_NCMOUSEMOVE и свой обработчик для перемещения окна...
Вот с последним я пока не справился. Не хочу делать SetCapture для окна и двигать его по WM_MOUSEMOVE. Хочу поручить перемещение окна винде.

Может кто знает как это сделать?
Не ошибается то, что не работает. (с) Windows
Re[5]: Как сделать кнопки в титле окна?
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 23.12.03 04:18
Оценка:
1) А разве не достаточно будет перехватить WM_NCHITTEST и никогда не возвращать нахождение мыши над одной из стд. кнопок? А своими рулить вроде как не очень проблемно

2) Насчет перерисовки — оплошал Мне потом свои люди объяснили, что в MFC за non-client сообщения, если не определить свой обработчик, отвечает каркас (в отдельном потоке — потому и не висит). А если написать тестовое приложение на API, лекго убедиться, что налицо полное равноправие

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[6]: Как сделать кнопки в титле окна?
От: kliff Россия http://www.esignal.ru
Дата: 23.12.03 08:35
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:

SM>1) А разве не достаточно будет перехватить WM_NCHITTEST и никогда не возвращать нахождение мыши над одной из стд. кнопок? А своими рулить вроде как не очень проблемно


SM>2) Насчет перерисовки — оплошал Мне потом свои люди объяснили, что в MFC за non-client сообщения, если не определить свой обработчик, отвечает каркас (в отдельном потоке — потому и не висит). А если написать тестовое приложение на API, лекго убедиться, что налицо полное равноправие


SM>Slicer


http://www.catch22.org.uk/tuts/titlebar.asp
Там далеко не все идеально, но на этой основе можно уже что-то сделать.
Re[6]: Как сделать кнопки в титле окна?
От: Crush Россия http://www.ael.ru/_crush/
Дата: 24.12.03 02:30
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:

SM>2) Насчет перерисовки — оплошал Мне потом свои люди объяснили, что в MFC за non-client сообщения, если не определить свой обработчик, отвечает каркас (в отдельном потоке — потому и не висит). А если написать тестовое приложение на API, лекго убедиться, что налицо полное равноправие


Я не использую MFC.
Интересно, так можно всетаки сделать так, чтобы не перерисоваывая non-client, перерисовать caption и кнопки на нем? Я так и не нашел как это сделать. Один хрен caption стандартный рисуется, а поверх него уже свой... и получаем мигание... Что не есть хорошо...
Не ошибается то, что не работает. (с) Windows
Re: Mouseimp
От: ironwit Украина  
Дата: 15.01.04 09:43
Оценка:
Здравствуйте, Sergey, Вы писали:
S>Угу, только глючить будет примерно как mouseimp.

offtop — знает ли кто клоны mouseimp? А то ...
... << RSDN@Home 1.1.2 beta 2 >>
Я не умею быть злым, и не хочу быть добрым.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.