C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Splash-форма как у Adobe Acrobat Reader 6, как прорисовать рабочий стол...
Rius
Отправлено: 12.08.2005, 20:36


Мастер участка

Группа: Участник
Сообщений: 321



написал пример проги, выводящей на форму рисунок с рабочего стола и прозрачное изображение (реально прозрачное, с альфа-каналом). В Reader 6 очевидно на окне рисуется не только рисунок обоев, но и имеющиеся окна. Как сие сделать?

про то как рисовать с альфа-каналами — в меру сил написал здесь

p.s. в ответ на один из вопросов Natash'и (кто знает — поймет :)

Отредактировано Rius — 12/08/2005, 23:48

User Attached Image Скачать файл
transsplash_2005.08.12___23.32.rar


xTrim
  Отправлено: 12.08.2005, 21:22


Машинист паровоза

Группа: Участник
Сообщений: 208



Вот как-то так..

User Attached Image Скачать файл
transsplash_xTrim__050813_002122_.zip


Rius
Отправлено: 13.08.2005, 05:33


Мастер участка

Группа: Участник
Сообщений: 321



Нет, это не то, регионы — фигня полнейшая...
Регионы вырезают жестко, тормозят, а альфа-наложение позволяет получить плавные переходы, вот кусочек заставки Reader 6:
user posted image

100% что это не с помощью регионов делается.
Rius
Отправлено: 13.08.2005, 08:45


Мастер участка

Группа: Участник
Сообщений: 321



предыдущее удалить не могу, добавить файл тоже..

Вот доделал (копирование изображения экрана), только приходится сохранять картинку в файл sad.gif
но главное работает
user posted image
глупый вопрос:
есть Graphics::TBitmap *bitmap;
как вывести его на TImage???

Отредактировано Rius — 13/08/2005, 11:50

User Attached Image Скачать файл
transsplash_2005.08.13___11.37.rar


Rius
Отправлено: 13.08.2005, 08:47


Мастер участка

Группа: Участник
Сообщений: 321



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


User Attached Image Скачать файл
transsplash_2005.08.13___11.37.rar


timson
Отправлено: 13.08.2005, 11:16


Станционный диспетчер

Группа: Участник
Сообщений: 82



рисование стандарнтыми средствами с альфа-каналом, тока GDI+ (ООП, вродь через ДиректХ работатет), но в младших версиях Win (с какой не знаю) нету. Придется таскать библу (вроде около 1-1.5 мега).
Rius
Отправлено: 13.08.2005, 11:33


Мастер участка

Группа: Участник
Сообщений: 321



?
библиотека msimg32.dll поставляется с виндой начиная с Windows 98, так что за это можно не беспокоиться.
на DirectX это не похоже:
CODE
Graphics::TBitmap *bitmaptrans = new Graphics::TBitmap;
bitmaptrans->LoadFromFile("Logo copy.bmp");
// HDC hDC = bitmap->Canvas->Handle;//GetDC(this->Handle);
BLENDFUNCTION blend;
blend.BlendOp = AC_SRC_OVER;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = AC_SRC_ALPHA;
bool res;
{
res = ::AlphaBlend(hdcCop,
0, 0, bitmap->Width, bitmap->Height,
bitmaptrans->Canvas->Handle,
0, 0, bitmaptrans->Width, bitmaptrans->Height,
blend);
}



//---------------------------
все, вот окончательный вариант кода (без сохранения в файл):
CODE
//---------------------------------------------------------------------------

void __fastcall TFormSplash::FormCreate(TObject *Sender)
{
HDC hdcScr;
HDC hdcCop;
HBITMAP hbmCop;

Left = (Screen->Width — Width) / 2;
Top = (Screen->Height — Height) / 2;

TRect rcSrc = TRect(Left,Top,10+Left+ClientWidth,10+Top+ClientHeight);

hdcScr = GetDC(0);
hdcCop = CreateCompatibleDC(hdcScr);

hbmCop = CreateCompatibleBitmap(hdcScr, rcSrc.Width(), rcSrc.Height());

SelectObject(hdcCop, hbmCop);

BitBlt(hdcCop, 0, 0, rcSrc.Width(), rcSrc.Height(), hdcScr, rcSrc.Left, rcSrc.Top, SRCCOPY);

bitmap = new Graphics::TBitmap;
bitmap->Width = rcSrc.Width();
bitmap->Height = rcSrc.Height();
bitmap->Handle = hbmCop;

Graphics::TBitmap *bitmaptrans = new Graphics::TBitmap;
bitmaptrans->LoadFromFile("Logo copy.bmp");

BLENDFUNCTION blend;
blend.BlendOp = AC_SRC_OVER;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = AC_SRC_ALPHA;
bool res = ::AlphaBlend(hdcCop,
               0, 0, bitmap->Width, bitmap->Height,
               bitmaptrans->Canvas->Handle,
               0, 0, bitmaptrans->Width, bitmaptrans->Height,
               blend);
delete bitmaptrans;

TMemoryStream *ms = new TMemoryStream();
bitmap->SaveToStream(ms);
ms->Seek(soFromBeginning, 0);
Image->Picture->Bitmap->LoadFromStream(ms);

delete ms;
delete bitmap;
DeleteObject(hbmCop);
DeleteObject(hdcCop);
ReleaseDC(0, hdcScr);
}
//---------------------------------------------------------------------------

что странно, нельзя снять скриншот splash'а biggrin.gif

Отредактировано Rius — 13/08/2005, 17:43
Sl@Sh
Отправлено: 14.08.2005, 13:37


Мастер участка

Группа: Участник
Сообщений: 383



Не очень понимаю суть. Могу только сказать, что без особого гемороя можно использовать пнг-формат. Он поддерживает альфа-каналы.
Rius
Отправлено: 14.08.2005, 14:58


Мастер участка

Группа: Участник
Сообщений: 321



и BMP его поддерживает
суть вопроса была в отображении рабочего стола на TImage
тему можно считать закрытой
Sl@Sh
Отправлено: 16.08.2005, 16:18


Мастер участка

Группа: Участник
Сообщений: 383



Может поздно, но заставку того-же фотошопа можно сделать так :
1) Фотошоп использует обычную форму. На ней рисуется кусок экрана и splash-картинка.

2) По splash-картинке формируется регион и рисуется со смещением за картинкой чёрным цветом. Далее этот регион можно размыть используя гауссово-размытие (как его реализовать можно в нете найти)

В итоге выйдет что-то вроде фотошоповской заставки.
Rius
Отправлено: 16.08.2005, 17:11


Мастер участка

Группа: Участник
Сообщений: 321



Под регионами понимаются эти дыры в окнах? smile.gif
Тогда нет, сам проверил побочные эффекты заставки Reader 6 (а не Photoshop) — работает она так: берется копия экрана, ложится на форму, поверх рисуется прозрачная картинка (что я и сделал), никаких регионов. Проверяется предварительным помещением под заставку меняющегося изображения.
Т.е. только первое, а не второе (более сложное).

Отредактировано Rius — 16/08/2005, 20:17
Sl@Sh
Отправлено: 16.08.2005, 17:31


Мастер участка

Группа: Участник
Сообщений: 383



Можно и с регионами. Всё зависит от вашей картинки. Если она по форме многоугольник (я имею ввиду выводимая часть картинки), то всё выглядит приемлимо, а если с закругляшками, то результат не блещет красатой.

Вернуться в Вопросы программирования в C++Builder