Re: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: Sergei I. Gorelkin Россия  
Дата: 22.03.10 21:01
Оценка: 4 (2) :)
Здравствуйте, lucifer_vrn, Вы писали:

_>Здравствуйте!

_>Подскажите пожалуйста, как поместить кнопку или хотя бы просто нарисовать нечто в заголовке окна рядом с кнопками "закрыть", "свернуть", "развернуть"?
_>Тут множество топиков про это, равно как и в гугле, но тут есть одна проблема — они не работают по Windows Vista/ Windows Seven, т.е. под Aero(если его отключить то все работает). А меня интересует именно под висту, если под более раними осями работать не будет — не страшно.

Aero не позволяет рисовать в неклиенской области окна (при попытке это сделать Aero отключается), зато рамку можно расширить в клиентскую область.
Поэтому:
1) путем обработки WM_NCCALCSIZE системе внушается, что клиентская область окна занимает все окно.
2) с помощью DwmExtendFrameIntoClientArea() восстанавливаем визуально исходный размер рамки.
3) теперь остается сущая мелочь — самостоятельно реализовать всю функциональность неклиенской области, которая ушла лесом из-за п.1.
4) и сущая мелочь номер два — доработать напильником рисование клиентской области, чтобы на месте рамки рисовалось только то, что нужно.
Re[3]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: Sergei I. Gorelkin Россия  
Дата: 23.03.10 14:01
Оценка: 3 (1)
Здравствуйте, lucifer_vrn, Вы писали:

_>Подскажите пожалуйста как правильно реализовать WM_NCCALCSIZE?


Вот статейка по теме:
http://msdn.microsoft.com/en-us/library/bb688195(VS.85).aspx

ps: кстати, статейка существенно обновилась за последние несколько месяцев...
Кнопки в заголовок окна для Windows Vista/7(Aero)
От: lucifer_vrn  
Дата: 22.03.10 13:40
Оценка:
Здравствуйте!
Подскажите пожалуйста, как поместить кнопку или хотя бы просто нарисовать нечто в заголовке окна рядом с кнопками "закрыть", "свернуть", "развернуть"?
Тут множество топиков про это, равно как и в гугле, но тут есть одна проблема — они не работают по Windows Vista/ Windows Seven, т.е. под Aero(если его отключить то все работает). А меня интересует именно под висту, если под более раними осями работать не будет — не страшно.
кнопки заголовок vista aero
Re[2]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: lucifer_vrn  
Дата: 23.03.10 09:04
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

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


_>>Здравствуйте!

_>>Подскажите пожалуйста, как поместить кнопку или хотя бы просто нарисовать нечто в заголовке окна рядом с кнопками "закрыть", "свернуть", "развернуть"?
_>>Тут множество топиков про это, равно как и в гугле, но тут есть одна проблема — они не работают по Windows Vista/ Windows Seven, т.е. под Aero(если его отключить то все работает). А меня интересует именно под висту, если под более раними осями работать не будет — не страшно.

SIG>Aero не позволяет рисовать в неклиенской области окна (при попытке это сделать Aero отключается), зато рамку можно расширить в клиентскую область.

SIG>Поэтому:
SIG>1) путем обработки WM_NCCALCSIZE системе внушается, что клиентская область окна занимает все окно.
SIG>2) с помощью DwmExtendFrameIntoClientArea() восстанавливаем визуально исходный размер рамки.
SIG>3) теперь остается сущая мелочь — самостоятельно реализовать всю функциональность неклиенской области, которая ушла лесом из-за п.1.
SIG>4) и сущая мелочь номер два — доработать напильником рисование клиентской области, чтобы на месте рамки рисовалось только то, что нужно.


2 и 3 с теми или иными нюансами у меня было сделанно.
4 немогу начать пока остальное не сделаю.
вот за пункт 1 большое спасибо! Попытался реализовать сие дело:

case WM_NCCALCSIZE:
if (wParam)
{
NCCALCSIZE_PARAMS *a1 =( NCCALCSIZE_PARAMS *) message->lParam;
if(message->wParam)
{
const int border = 7;
a1->rgrc[0].left += border; a1->rgrc[0].right -= border; a1->rgrc[0].bottom -= border; //a1->rgrc[0].top += border;
a1->rgrc[1].left = a1->rgrc[0].left; a1->rgrc[1].right = a1->rgrc[0].right; a1->rgrc[1].bottom = a1->rgrc[0].bottom; //a1->rgrc[1].top = a1->rgrc[0].top;
a1->rgrc[2].left = a1->rgrc[0].left; a1->rgrc[2].right = a1->rgrc[0].right; a1->rgrc[2].bottom = a1->rgrc[0].bottom; //a1->rgrc[2].top = a1->rgrc[0].top;
}

return SWP_DRAWFRAME;
}

вообще плохо понял как правильно реализовывать WM_NCCALCSIZE... в моей реализации главный косяк, что я еще случай с wParam == FALSE не обрабатываю, но он вроде и не приходит.
Так вот при этой реализции:
1. кнопки системного меню свернуть закрыть итд остались — что есть великолепно!
2. окно нормально ресайзиться
3. Но когда пытаюсь переместить окно(за клиентскую часть у меня реализация этого была) оно у меня начинает увеличивать размер. Видимо дело в том что я в WM_NCCALCSIZE чето не правильно считаю...
4. После перемещение/ресайза окна — кнопки закрыть/свернуть начинают работать только со второго клика, т.е. первый раз нажимаю чето происходит второй раз жму он выполянет.

Подскажите пожалуйста как правильно реализовать WM_NCCALCSIZE?
Re[2]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: 23W http://kyselgov.pp.ua/
Дата: 16.01.12 17:08
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Aero не позволяет рисовать в неклиенской области окна (при попытке это сделать Aero отключается), зато рамку можно расширить в клиентскую область.

Какого блин фига !?
Я уже 3 день мучаюсь, и чего-это у меня аэро само вырубается...

а где об этом на сайте микрософт?
Re[3]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: 23W http://kyselgov.pp.ua/
Дата: 16.01.12 22:28
Оценка:
Здравствуйте, 23W, Вы писали:

23W>Здравствуйте, Sergei I. Gorelkin, Вы писали:


SIG>>Aero не позволяет рисовать в неклиенской области окна (при попытке это сделать Aero отключается), зато рамку можно расширить в клиентскую область.

23W>Какого блин фига !?
23W>Я уже 3 день мучаюсь, и чего-это у меня аэро само вырубается...

23W>а где об этом на сайте микрософт?


Ага кое-где есть упоминание об этом "эффекте" — http://msdn.microsoft.com/en-us/magazine/cc163435.aspx

If an application draws in the non-client area (the glass frame), the DWM detects this and will switch over to the Aero Basic frame.

Re[4]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: о_О
Дата: 16.01.12 22:44
Оценка:
Здравствуйте, 23W, Вы писали:

2012й год. не можем справиться с аэро. так держать!
Re[5]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: 23W http://kyselgov.pp.ua/
Дата: 18.01.12 08:38
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>Здравствуйте, 23W, Вы писали:


о_О>2012й год. не можем справиться с аэро. так держать!


Если вы напишите как, буду очень признателен. По практике знаю что такое возможно, например тот же TeamView добавляет свою кнопку к любому окну в системе (не только к своим) и при этом еще обеспечивает для них гало-свечение за пределами рамки, как у системных кнопок. Но КАК ?
(п.с. рецепт через убивание неклиентской зоны и натягивания рамки на клиентскую зону через DwmExtendFrameIntoClientArea() — не предлагать, это не то что нужно).
Re[6]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: Visor2004  
Дата: 27.01.12 12:15
Оценка:
Здравствуйте, 23W, Вы писали:

23W>(п.с. рецепт через убивание неклиентской зоны и натягивания рамки на клиентскую зону через DwmExtendFrameIntoClientArea() — не предлагать, это не то что нужно).


а по другому никак, TeamViewer просто проверяет, что активно аэро и сабклассит окна в системе.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: CEMb  
Дата: 27.01.12 18:14
Оценка:
Здравствуйте, lucifer_vrn, Вы писали:

_>Здравствуйте!

_>Подскажите пожалуйста, как поместить кнопку или хотя бы просто нарисовать нечто в заголовке окна рядом с кнопками "закрыть", "свернуть", "развернуть"?
_>Тут множество топиков про это, равно как и в гугле, но тут есть одна проблема — они не работают по Windows Vista/ Windows Seven, т.е. под Aero(если его отключить то все работает). А меня интересует именно под висту, если под более раними осями работать не будет — не страшно.

Там надо использовать буферизованный вывод графики.
Не знаю, наскоко он хорошо будет работать с неклиенткой, но в таскбар я рисовал в Аеро.
Искать по BufferedPaintInit сотоварищи.

Чё-то типа такого:

    BP_PAINTPARAMS paintParams = {0};
    paintParams.cbSize = sizeof(paintParams);
    hBufferedPaint = BeginBufferedPaint(hdc, &rc, BPBF_TOPDOWNDIB, &paintParams, &hdcc);

//...
    if (hBufferedPaint)
        EndBufferedPaint(hBufferedPaint, TRUE);


Причём там хитро рисуется — чем темнее цвет, тем он прозрачнее. Исключение только для функций работы с текстом, точнее надо использвать именно специальные текстовые функции, обычные будут как раз с эффектом прозрачности. Ну, вобщем, у меня так получалось, можь чё не так делал
Re[7]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: 23W http://kyselgov.pp.ua/
Дата: 28.01.12 14:52
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, 23W, Вы писали:


23W>>(п.с. рецепт через убивание неклиентской зоны и натягивания рамки на клиентскую зону через DwmExtendFrameIntoClientArea() — не предлагать, это не то что нужно).


V>а по другому никак, TeamViewer просто проверяет, что активно аэро и сабклассит окна в системе.

Нет, TeamViewer так не делает... поверхностный анализ на основе PhotoShop CS 5.1 показал, что teamview просто укладывает поверх капшиона программы свое layerd окно и именно в нем рисует доп. кнопки. При этом эффект гало-свечения кнопки (как у кнопок закрытт/свернуть/максимизировать) просто эмулируется, причем не совсем точно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.