Re[2]: Прикольно :) , но Обидно
От: Saruman Россия none
Дата: 12.09.03 10:20
Оценка:
Здравствуйте, 2Los, Вы писали:

L>Ну на самом деле иконка в Taskbare никуда не пропала, тока меню.


Нашёлся способ добавить меню в Taskbar'е для таких SkinBase диалогов.

Когда кликаешь правой кнопкой мыши на кнопке диалога в таскбаре, то окну приходит сообщение за номером 0x0313. Тока обработчик этой мессаги должен сразу вернуть результат(т.е. нельзя вызывать TrackPopupMenu в этом обработчике), а то винда использует её в своих системных целях, для определения "зависнутости" окна.
Типа того что как бы...
Re: проблема с Child-окнами
От: BaToH Беларусь  
Дата: 19.08.05 10:30
Оценка:
Здраствуйте!

Класс очень хороший, спасибо =)

Но возникла проблема:
В диалоге создаю child-окно. Это окно наследую от CSkinBaseDialog.
Если не использовать функцию AddSkinDIB, то все работает нормально (отображаются контроллы и фон по умолчанию)

Когда же использую эту функцию для создания фона, то ничего не отображается

Child-окно самостоятельно не перерисовывается (или я не прав?)
Но посылая сообщение от ParentWindow на перерисовку (оно доходит), окно все равно не перерисовывается

С popup-окном все работает нормально.
Подскажите, как выйти из сложившейся ситуации?
Всё возможно.
Re: Класс CSkinBaseDialog
От: McSeem2 США http://www.antigrain.com
Дата: 20.08.05 15:08
Оценка:
Здравствуйте, 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
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Класс CSkinBaseDialog
От: Аноним  
Дата: 21.05.07 12:16
Оценка:
Здравствуйте, 2Los, Вы писали:

L>Статья:

L>Класс CSkinBaseDialog
Автор(ы): 2Los
Дата: 01.03.2002


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"

короче ошибка вот такая

d:\projects\tets\tets\skinbasedialog.cpp(524) : error C2065: 'i' : undeclared identifier

вот этом куске кода

int CSkinBaseDialog::HitTestBkPart(CPoint point)
{
for(int i=0; i<GetCount(); i++)
if(GetAt(i)->HitTest(point))
break;
return i<GetCount() ? i : -1;<<<<<<<<<<<<<<<<<<<<<<<<<<<<!!!!!!!!!!!!!!!!!!!!!!!!!>>>>>>>>>>>>>>>>>>>

}

В чем ошибка?
Re[2]: Класс CSkinBaseDialog
От: BaToH Беларусь  
Дата: 21.05.07 12:46
Оценка:
SKIP

А>вот этом куске кода


А>int CSkinBaseDialog::HitTestBkPart(CPoint point)

А>{
А> for(int i=0; i<GetCount(); i++)
А> if(GetAt(i)->HitTest(point))
А> break;
А> return i<GetCount() ? i : -1;<<<<<<<<<<<<<<<<<<<<<<<<<<<<!!!!!!!!!!!!!!!!!!!!!!!!!>>>>>>>>>>>>>>>>>>>

А>}


А>В чем ошибка?


А ошибка у тебя в том, что i определён внутри массива и соответственно в операторе return его не видно.

Объяви i как внутреннюю переменную перед циклом for
Всё возможно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.