Здравствуйте, 2Los, Вы писали:
L>Ну на самом деле иконка в Taskbare никуда не пропала, тока меню.
Нашёлся способ добавить меню в Taskbar'е для таких SkinBase диалогов.
Когда кликаешь правой кнопкой мыши на кнопке диалога в таскбаре, то окну приходит сообщение за номером 0x0313. Тока обработчик этой мессаги должен сразу вернуть результат(т.е. нельзя вызывать TrackPopupMenu в этом обработчике), а то винда использует её в своих системных целях, для определения "зависнутости" окна.
Но возникла проблема:
В диалоге создаю child-окно. Это окно наследую от CSkinBaseDialog.
Если не использовать функцию AddSkinDIB, то все работает нормально (отображаются контроллы и фон по умолчанию)
Когда же использую эту функцию для создания фона, то ничего не отображается
Child-окно самостоятельно не перерисовывается (или я не прав?)
Но посылая сообщение от ParentWindow на перерисовку (оно доходит), окно все равно не перерисовывается
С popup-окном все работает нормально.
Подскажите, как выйти из сложившейся ситуации?
Здравствуйте, 2Los, Вы писали:
L>У разработчика подобного окна выбор средств не богатый: это функция SetWindowRgn() — устанавливающая регион, занимаемый окном и обработчик события WM_ERASEBKGND, в котором следует поместить код, выводящий фоновую картинку в окно. И если окно не меняет свой размер, этого достаточно, иначе придется потрудиться, чтобы корректно отображать фон и пересчитывать регион окна. Если вам это занятие не по душе, то предлагаю воспользоваться моим новым MFC-классом диалога CSkinBaseDialog, который возьмет всю эту работу на себя.
Такое предложение.
Следующим шагом должно быть добавление сглаживания (anti-alias) по границам окна. Насколько я представляю, начиная с Win2K это возможно — то есть, там, где есть функция WinAPI AlphaBlend (находится в msimg32.lib). Идея в том, чтобы подготовить 32-битовый битмап с альфа-каналом формата BGRA и в обработчике WM_ERASEBKGND использовать AlphaBlend() вместо чего-либо другого. Рисовать в битмап с альфа-каналом можно, например с помошью той же GDI+. Или, например, AGG. Работа с регионами при этом остается в силе, но регион должен быть чуть шире визуальных границ и охватывать область, где значения alpha > 0.
Хотя я не уверен на 100%, что все будет работать как надо. Возможно, при перемещении окна и перерисовках, в полупрозрачных пикселах будут появляться дефекты.
И вообще — можно ли каким-либо способом (начиная с Win2K) сделать полупрозрачное окно произвольной формы? При этом, надо уметь задавать значения Alpha не для всего окна глобально, а для каждого отдельного пиксела этого окна. То есть, то, что называется Alpha-Mask.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
L>Авторы: L> 2Los
L>Аннотация: L>Как известно, окна в Windows квадратные. И в принципе этого достаточно для большинства приложений. Если это, например, файл-менеджер, то очень даже неплохо, что он квадратный. Однако иногда хочется, чтобы программа выглядела не как все. Классическим примером могут служить WinAmp или Window Media Player, а также многие autoran'ы для CD дисков. Отличительной особенностью этих программ является то, что все они обладают окнами произвольной формы, с опять же произвольным фоновым изображением, а плэйеры к тому же могут менять свой внешний вид.
L>У разработчика подобного окна выбор средств не богатый: это функция SetWindowRgn() — устанавливающая регион, занимаемый окном и обработчик события WM_ERASEBKGND, в котором следует поместить код, выводящий фоновую картинку в окно. И если окно не меняет свой размер, этого достаточно, иначе придется потрудиться, чтобы корректно отображать фон и пересчитывать регион окна. Если вам это занятие не по душе, то предлагаю воспользоваться моим новым MFC-классом диалога CSkinBaseDialog, который возьмет всю эту работу на себя.
Помогите, плиз.
Решил я зяюзать этот клас, но вот несколько ошибок появилось при написании проги.
Пишу на Визуал Студио 2005.
Короче добавил я класы SkinBaseDialog.h и CDIB.H себе в проэкт.
Все зделал по инструкции как в статье.
Пришлось только в AfxMessageBox везде макросы _T() поставить.
потом выскочила ошибка при компиляции что нет такого класса
#include "stdafx.h"
//#include "SkinDialog.h" ------вот это я закоментил. Или тут мне надо включить свой клас приложения?
#include "SkinBaseDialog.h"