Rius |
Отправлено: 12.08.2005, 20:36 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
написал пример проги, выводящей на форму рисунок с рабочего стола и прозрачное изображение (реально прозрачное, с альфа-каналом). В Reader 6 очевидно на окне рисуется не только рисунок обоев, но и имеющиеся окна. Как сие сделать?
про то как рисовать с альфа-каналами — в меру сил написал здесь
p.s. в ответ на один из вопросов Natash'и (кто знает — поймет :)
Отредактировано Rius — 12/08/2005, 23:48
|
|
xTrim |
Отправлено: 12.08.2005, 21:22 |
|
Машинист паровоза
Группа: Участник
Сообщений: 208
|
Вот как-то так..
|
|
Rius |
Отправлено: 13.08.2005, 05:33 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
Нет, это не то, регионы — фигня полнейшая...
Регионы вырезают жестко, тормозят, а альфа-наложение позволяет получить плавные переходы, вот кусочек заставки Reader 6:
100% что это не с помощью регионов делается.
|
|
Rius |
Отправлено: 13.08.2005, 08:45 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
предыдущее удалить не могу, добавить файл тоже..
Вот доделал (копирование изображения экрана), только приходится сохранять картинку в файл
но главное работает
глупый вопрос:
есть Graphics::TBitmap *bitmap;
как вывести его на TImage???
Отредактировано Rius — 13/08/2005, 11:50
|
|
Rius |
Отправлено: 13.08.2005, 08:47 |
|
Мастер участка
Группа: Участник
Сообщений: 321
|
сорри за мультипост, предыдущий файл не закачался
|
|
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'а
Отредактировано 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
|
Под регионами понимаются эти дыры в окнах?
Тогда нет, сам проверил побочные эффекты заставки Reader 6 (а не Photoshop) — работает она так: берется копия экрана, ложится на форму, поверх рисуется прозрачная картинка (что я и сделал), никаких регионов. Проверяется предварительным помещением под заставку меняющегося изображения.
Т.е. только первое, а не второе (более сложное).
Отредактировано Rius — 16/08/2005, 20:17
|
|
Sl@Sh |
Отправлено: 16.08.2005, 17:31 |
|
Мастер участка
Группа: Участник
Сообщений: 383
|
Можно и с регионами. Всё зависит от вашей картинки. Если она по форме многоугольник (я имею ввиду выводимая часть картинки), то всё выглядит приемлимо, а если с закругляшками, то результат не блещет красатой.
|
|