Рисование рамки окна: как?
От: PanychY  
Дата: 14.01.17 19:51
Оценка:
Приветствую коллеги

Стоит задача такая: сделать окно(диалог) с пользовательским фоном.
Фон рисуется без проблем.
Вот теперь начинаются приключения, связанные с особыми требваниями:
1. Не должно быть стандартной рамки
2. Окно должно быть resizable пользователем
Для этого делаю следующее:
1. Ресурсу диалога выставленно: Caption=False, Frame=Resizing
Нужное поведение измеения размера обеспечено
2. В связи с тем что Frame=Resizing всё-таки рисует рамку, то я обрабатываю WM_NCPAINT и зарисовываю её нужным рисунком
Всё хорошо, но эта гребаная рамка всё-равно рисуется когда надо и не надо, а именно: собсвтенно при изменения размера(после отпускания), а также при активации и делактивации окна.
Пытаюсь это лечить обработкой сообщений
WM_ACTIVATEAPP, WM_WINDOWPOSCHANGED, WM_WINDOWPOSCHANGING, WM_NCACTIVATE, WM_ACTIVATE, WM_MOUSEACTIVATE, WM_SIZE, WM_MOVE,
вызовом RedrawWindow(hDlg, NULL, NULL, RDW_UPDATENOW);
Это лечит почти всё кроме момента активации и декативации.
Может я что-то пропустил?
Re: Рисование рамки окна: как?
От: MTimur  
Дата: 14.01.17 21:04
Оценка:
Здравствуйте, PanychY, Вы писали:

  Скрытый текст
PY>Приветствую коллеги

PY>Стоит задача такая: сделать окно(диалог) с пользовательским фоном.

PY>Фон рисуется без проблем.
PY>Вот теперь начинаются приключения, связанные с особыми требваниями:
PY>1. Не должно быть стандартной рамки
PY>2. Окно должно быть resizable пользователем
PY>Для этого делаю следующее:
PY>1. Ресурсу диалога выставленно: Caption=False, Frame=Resizing
PY> Нужное поведение измеения размера обеспечено
PY>2. В связи с тем что Frame=Resizing всё-таки рисует рамку, то я обрабатываю WM_NCPAINT и зарисовываю её нужным рисунком
PY>Всё хорошо, но эта гребаная рамка всё-равно рисуется когда надо и не надо, а именно: собсвтенно при изменения размера(после отпускания), а также при активации и делактивации окна.
PY> Пытаюсь это лечить обработкой сообщений
PY> WM_ACTIVATEAPP, WM_WINDOWPOSCHANGED, WM_WINDOWPOSCHANGING, WM_NCACTIVATE, WM_ACTIVATE, WM_MOUSEACTIVATE, WM_SIZE, WM_MOVE,
PY>вызовом RedrawWindow(hDlg, NULL, NULL, RDW_UPDATENOW);
PY>Это лечит почти всё кроме момента активации и декативации.
PY>Может я что-то пропустил?

Как вариант отключить вообще NC-область окна, обрабатывать изменение размера и перетаскивание ручками.
Re: Рисование рамки окна: как?
От: c-smile Канада http://terrainformatica.com
Дата: 15.01.17 01:26
Оценка: 6 (3) +2
Здравствуйте, PanychY, Вы писали:

PY>Приветствую коллеги


PY>Стоит задача такая: сделать окно(диалог) с пользовательским фоном.

PY>Фон рисуется без проблем.
PY>Вот теперь начинаются приключения, связанные с особыми требваниями:

Как это сделано в Sciter:



Окну выставляется WS_POPUP — все остальные флаги убираем.
В данном случае (полупрозрачное окно) выставляется WS_EX_LAYERED

Custom обработчик WM_NCHITTEST на краях окна возвращает HTBOTTOMLEFT, HTBOTTOMRIGHT, и пр. HTCAPTION в нужных местах (чтобы окно можно было таскать).
Re[2]: Рисование рамки окна: как?
От: PanychY  
Дата: 15.01.17 21:57
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Окну выставляется WS_POPUP — все остальные флаги убираем.

CS>В данном случае (полупрозрачное окно) выставляется WS_EX_LAYERED

Спасибо добрый человек, ты меня прямо спас. Я неделю безуспешного играюсь с этой задачей...
Re[3]: Рисование рамки окна: как?
От: c-smile Канада http://terrainformatica.com
Дата: 16.01.17 05:51
Оценка:
Здравствуйте, PanychY, Вы писали:

PY>Я неделю безуспешного играюсь с этой задачей...


Спросил бы на профильном UI форуме , сразу бы ответ получил.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.