Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить изображение экрана позади формы 
:(
    Опции темы
HappyLife
Дата 19.1.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Как получить изображение (картинку, графику, набор пикселей), которое расположено позади моей формы. Дело в том, что мне нужна прозрачная форма, но по рядку причин, я должен отрисовывать эту форму самостоятельно.

Это сообщение отредактировал(а) HappyLife - 19.1.2009, 11:41
PM MAIL   Вверх
mrbrooks
Дата 19.1.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(HappyLife @  19.1.2009,  11:40 Найти цитируемый пост)
Дело в том, что мне нужна прозрачная форма, но по рядку причин, я должен отрисовывать эту форму самостоятельно.

камрад просвети хоть - отчего стандартными средствами не можешь воспользоваться?
PM MAIL   Вверх
artsb
Дата 19.1.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Насколько я знаю, есть только один вариант:
Скрыть ненадолго форму с экрана, сделать Print Screen, и выдрать из картинки нужный кусок.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
mrbrooks
Дата 19.1.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(artsb @  19.1.2009,  12:00 Найти цитируемый пост)
Скрыть ненадолго форму с экрана, сделать Print Screen, и выдрать из картинки нужный кусок. 

 smile 
ну в принципе неоднозначный выход - для неоднозначного вопроса
PM MAIL   Вверх
HappyLife
Дата 19.1.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



mrbrooks, почему не могу пользоваться стандарными средствами? Я создаю прелодер, (должен быть тот, что на приклепленной картинке, созданной в фотошопе). Для этого, я создаю форму, рисую на ней экран под формой (этот самый экран я захватываю как раз таки до появления), а уж сверху начинаю рисовать изображение прелодера (синию спиральку). Если форму просто сделать прозрачной, то моя спиралька так же станет прозрачной. Если воспользоваться TransperancyColor, то все получается зазубренно.
И этот способ работает, до тех пор, пока за мои прелодером не происходит какиз-либо изменений. В этом случае просто не перерисовывается бэкграунд. Это плохо!



Присоединённый файл ( Кол-во скачиваний: 27 )
Присоединённый файл  1.jpg 201,65 Kb
PM MAIL   Вверх
sergey_85
Дата 19.1.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: 1
Всего: 1



так здесь нужно юзать gdi+ пойщи в инете transparent png form
у меня есть пример кое-какой скну позже
суть примера - рисуется форма по png   c альфа как-её там точно не знаю прозрачностью

и никаких замут с preentscreen и скрытием формы

пример поищу у себя

Добавлено @ 12:41
ага вот и пример с кодом http://www.leunen.com/cbuilder/gdiplus.html

эээ готовый пример посмотрю дома и докину сюда (если остался)

Это сообщение отредактировал(а) sergey_85 - 19.1.2009, 12:48


--------------------
A good design always pays off.
PM MAIL   Вверх
HappyLife
Дата 19.1.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Вот что получается если изменяется задний план.


Присоединённый файл ( Кол-во скачиваний: 27 )
Присоединённый файл  2.jpg 207,66 Kb
PM MAIL   Вверх
HappyLife
Дата 19.1.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



sergey_85, попробую.

Это сообщение отредактировал(а) HappyLife - 19.1.2009, 12:46
PM MAIL   Вверх
HappyLife
Дата 19.1.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Я нашел кое какие примеры, но они либо на C# либо на басике. И ни первое ни второе я не понимаю.

http://episteme.arstechnica.com/eve/forums.../m/432006814631
http://www.xtremevbtalk.com/archive/index.php/t-266655.html

Может быть кто-нибудь может помочь с переводом на С++.
PM MAIL   Вверх
Dem_max
Дата 19.1.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



"GDI+" + "картинка с прозрачшым фоном" - однозначный вариант, вспомни SplashScreen у Acrobat Reader и Photoshop
 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
HappyLife
Дата 20.1.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Я сделал, то что я хотел.
Код

    SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    gdiplusStartupInput.GdiplusVersion = 1;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    HDC screenDC( GetDC(0) );
    POINT sourcePos = {0};
    HDC sourceDC( CreateCompatibleDC(screenDC) );

    HBITMAP bufferBitmap = {0};
    Gdiplus::Bitmap TheBitmap(L"C:\\Windows\\Lsr_14_Swirl.png");
    TheBitmap.GetHBITMAP(0, &bufferBitmap);



    HBITMAP oldBmpSelInDC;

    oldBmpSelInDC = (HBITMAP)SelectObject(sourceDC, bufferBitmap);

    POINT pos;

    pos.x = (Screen->Width / 2) - (TheBitmap.GetWidth() / 2);
    pos.y = (Screen->Height / 2) - (TheBitmap.GetHeight() / 2);


    SIZE size = {TheBitmap.GetWidth(), TheBitmap.GetHeight()};

    BLENDFUNCTION blendFunction = {0};
    blendFunction.BlendOp = AC_SRC_OVER;
    blendFunction.SourceConstantAlpha = 255;
    blendFunction.AlphaFormat = AC_SRC_ALPHA;

    COLORREF colorKey( RGB(255,0,255) );
    DWORD flags( ULW_ALPHA);

    UpdateLayeredWindow(Handle, screenDC, &pos, & size, sourceDC, &sourcePos,
    colorKey, &blendFunction, flags);

    SelectObject(sourceDC, oldBmpSelInDC);
    DeleteObject(bufferBitmap);
    DeleteDC(sourceDC);

    ReleaseDC(0, screenDC);



Но как теперь показать некоторые компоненты на форме. Конкретно снизу мне нужен ProgressBar.

Это сообщение отредактировал(а) HappyLife - 20.1.2009, 13:01
PM MAIL   Вверх
sergey_85
Дата 21.1.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: 1
Всего: 1



Привет! Как и обещал пример формы-заставки на основе png-картинки с альфа каналами
(см. прикрепление)

//инцализация gdi plus
Код

#pragma  w-hid

#define STRICT

//need for GDI+
#include <windows.h>
#include <algorithm>

using std::min;
using std::max;

#include <gdiplus.h>

Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR  gdiplusToken;

Gdiplus::Graphics *graphics;
Gdiplus::Image *image;


... а вот здесь всё и происходит
Код

 SetLastError(0);

  Gdiplus::Bitmap *bitmap = new Gdiplus::Bitmap(L"2.png");

  if (bitmap->GetPixelFormat() != PixelFormat32bppARGB)
  {
    ShowMessage("Pixel format is incorrect!");
    Application->Terminate();
    return;
  }

  int opacity  = 255;
  
  HDC screenDc = ::GetDC(0);
  HDC memDc    = ::CreateCompatibleDC(screenDc);


  Gdiplus::Color color;
    color.SetValue(0);


  HBITMAP hBmp    = 0;
  HBITMAP hOldBmp = 0;

  int status = bitmap->GetHBITMAP(color,&hBmp);

  hOldBmp = (HBITMAP)::SelectObject(memDc, hBmp);

  //change wnd position and size
  this->Left = 50;
  this->Top  = 50;

  this->Height = bitmap->GetHeight();
  this->Width  = bitmap->GetWidth();
  //

  POINT topPos;
    topPos.x = this->Left;
    topPos.y = this->Top;

  POINT pointSource;
    pointSource.x = 0;
    pointSource.y = 0;

  SIZE size;
    size.cx = this->Width;
    size.cy = this->Height;

  BLENDFUNCTION blend;
      blend.BlendOp             = AC_SRC_OVER;
      blend.BlendFlags          = 0;
      blend.SourceConstantAlpha = opacity;
      blend.AlphaFormat         = AC_SRC_ALPHA;

  SetLastError(0);
  
  SetWindowLong(this->Handle, GWL_EXSTYLE,WS_EX_LAYERED);

  int result = ::UpdateLayeredWindow((HWND)this->Handle, screenDc, &topPos, &size, memDc, &pointSource,0, &blend, ULW_ALPHA);

  if(result==0)
    ShowMessage(::GetLastError());

  ::ReleaseDC(0, screenDc);

  if(hBmp != 0)
  {
    ::SelectObject(memDc, hOldBmp);
    ::DeleteObject(hBmp);
  }

  ::DeleteDC(memDc);


Удачи!

Добавлено через 3 минуты и 36 секунд
Никак придется выкручиваться самому т.к. в этом случае форма теряет все стандартные события перерисовки
Можно обновлять саму картину через определенный интервал времени

Это сообщение отредактировал(а) sergey_85 - 21.1.2009, 08:53

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  gdiplus_3_alphablendingform.rar 973,56 Kb


--------------------
A good design always pays off.
PM MAIL   Вверх
Dem_max
Дата 21.1.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Цитата

Но как теперь показать некоторые компоненты на форме. Конкретно снизу мне нужен ProgressBar.

сам рисуй


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
HappyLife
Дата 21.1.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Цитата(Dem_max @ 21.1.2009,  09:08)
Цитата

Но как теперь показать некоторые компоненты на форме. Конкретно снизу мне нужен ProgressBar.

сам рисуй

По таймеру?
PM MAIL   Вверх
artsb
Дата 21.1.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Dem_max @  21.1.2009,  09:08 Найти цитируемый пост)
сам рисуй 

HappyLife, Можешь даже нарисовать что-нибудь покрасивее стандартного smile

Добавлено через 9 минут и 15 секунд
Цитата(HappyLife @  21.1.2009,  10:35 Найти цитируемый пост)
По таймеру? 

Мне кажется так:
1. Отрисовываешь форму
2. Рисуешь компоненты

Добавлено через 10 минут и 4 секунды
Без таймера. Просто следом.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.