Russian Qt Forum
Августа 28, 2025, 01:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: OS Windows. Изменение фона заголовка окна при активации и деактивации.  (Прочитано 8814 раз)
vertus
Гость
« : Июня 28, 2012, 14:56 »

При переключении между окнами в ОС Windows меняется фон заголовка окна - у активного окна он становиться светлее чем у не активного.

Можно ли сделать чтобы фон заголовка не менялся?

WA_ShowWithoutActivating - не то, т.к. надо чтобы окно активировалось, но фон заголовка не менялся.

Спасибо за внимание!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июня 28, 2012, 15:01 »

Заголовки отрисовывает ОС, так что Кьют тут не при чем.
Скорее всего никак. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vertus
Гость
« Ответ #2 : Июня 28, 2012, 15:06 »

Тогда другой вопрос. Если делать окно с флагом FramelessWindowHint, возможно ли нарисовать самому бордер и загаловок окна такой же, как и у окна Windows?
Записан
Bepec
Гость
« Ответ #3 : Июня 28, 2012, 15:11 »

М... Помоему можно с winApi.

Ставишь хук на WM_NCACTIVATE и меняешь его, насколько я помню.

Так же где то всплывал вариант какого то флага в windows, но этого я никогда не делал.

PS самый простой способ посылать сообщение активности на то окно, но там какой то недостаток был, аля сбитие фокуса чтоли.

update: Если отрисовываешь сам - то рисуй что душе угодно. Да, можно.
Записан
vertus
Гость
« Ответ #4 : Июня 28, 2012, 15:14 »

М... Помоему можно с winApi.

Ставишь хук на WM_NCACTIVATE и меняешь его, насколько я помню.


QCoreApplication::winEventFilter использовать т.е.?


update: Если отрисовываешь сам - то рисуй что душе угодно. Да, можно.


Проблема в том, что пользователь может менять стили окон, поэтому нужно не просто рисовать самому, а именно так, как установлено в системе.
Записан
Bepec
Гость
« Ответ #5 : Июня 28, 2012, 15:17 »

Хм. Хм хм хм. Даже незнаю. winEventFilter позволяет реагировать на сообщения винды. А тут нужно изменение сообщения.

Ну попробуй - узнаешь. Я делал хуком.

Получить текущий стиль виндовс - опять таки winApi. Правда счас сложнее - тут уже градиент используется, но вроде бы можно.
Записан
vertus
Гость
« Ответ #6 : Июня 28, 2012, 15:32 »

Да, в winEventFilter ничего не меняется.

Код:
bool CDXApplication::winEventFilter( MSG *message, long *result )
{
  if (message->message == WM_NCACTIVATE)
  {
    message->wParam = FALSE;
  }

  return false;
}
А как поставить хук? Это имеется ввиду хуки через dll?
Записан
Bepec
Гость
« Ответ #7 : Июня 28, 2012, 15:36 »

Для хука на свою программу нужды в dll нету. (dll это для глобального хука)

А для обычного хватит и простой функции. Примеров завались. (типа на, почитай http://www.rsdn.ru/article/baseserv/winhooks.xml#EYAAC)



Записан
vertus
Гость
« Ответ #8 : Июня 28, 2012, 15:38 »

Ага, понял, спасибо!
Буду пробывать этот вариант.
Записан
Bepec
Гость
« Ответ #9 : Июня 28, 2012, 15:42 »

Поищите в гугле на тему "цвет неактивного заголовка хук".
Там из примеров и можете дёрнуть.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Июня 28, 2012, 16:31 »

Тогда другой вопрос. Если делать окно с флагом FramelessWindowHint, возможно ли нарисовать самому бордер и загаловок окна такой же, как и у окна Windows?

См. DrawCaption
Записан
vertus
Гость
« Ответ #11 : Июля 02, 2012, 12:09 »

Проблему частично решил.

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

Код:
HHOOK Hook;

LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
  PCWPRETSTRUCT pStruct = (PCWPRETSTRUCT)lParam;
  if (code == HC_ACTION)
  {
    if (pStruct->message == WM_NCACTIVATE)
    {
      pStruct->wParam = TRUE;
      DefWindowProc(pStruct->hwnd, pStruct->message, pStruct->wParam, pStruct->lParam);
    }
  }
  return CallNextHookEx(Hook, code, wParam, lParam);
}

int main(int argc, char *argv[])
{
  Hook = SetWindowsHookEx(WH_CALLWNDPROCRET, GetMsgProc, 0, GetCurrentThreadId() );
  //здесь код main
  UnhookWindowsHookEx(Hook);
}


Однако, проблема заключается в том, что когда активируется окно другого процесса, нужно возвращать неактивное состояние заголовка окна текущего процесса.
Записан
Bepec
Гость
« Ответ #12 : Июля 02, 2012, 12:17 »

Не совсем ясно сформулировано.

У тебя была задача - чтоб он не становился неактивным. Ты это сделал - молодца.

Теперь у тебя появилась другая проблема - эм...

Судя по всему, если переключение окон внутри твоей программы - надо постоянно активно отрисовывать, а если активен другой процесс(не твой), тогда надо неактивным делать?
Записан
vertus
Гость
« Ответ #13 : Июля 02, 2012, 12:31 »

Судя по всему, если переключение окон внутри твоей программы - надо постоянно активно отрисовывать, а если активен другой процесс(не твой), тогда надо неактивным делать?

Да, так и есть, проблема в этом.
Записан
Bepec
Гость
« Ответ #14 : Июля 02, 2012, 12:36 »

Есть вроде 2 способа на мой взгляд:
1) можно по таймеру смотреть, какое окно активно и по его hwnd получать id процесса, который его запустил. Сравнивать со своим процессом и там уже решать - светить или не светить заголовок.
2) (глуповатый метод => ) вынести обработку(хук) в невидимое окно winApi'шное и ему слать команды когда фокус уходит с твоих окон.


Ну в принципе пока всё у меня.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.029 секунд. Запросов: 20.