Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2015, 14:23   #1
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию как позволить отображать компоненты? .. использую GDI+ окно

добрый день, подскажите, как позволить отображать компоненты? .. использую GDI+ окно по картинке PNG, .. что надо, чтоб показывало компоненты?

нашел пример окно с альфа-каналами

Код:
unit Unit1; 
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls; 
 
type
  TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure FormDblClick(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
  end; 
 
var
  Form1: TForm1; 
  last_pos: TPoint; 
  hbmp: HBITMAP; // Прозрачная картинка 
  backdc: HDC; // Контекст для прозрачной картинки 
 
implementation
 
{$R *.dfm}
 
uses GDIPAPI, GDIPOBJ; // Юзаем GDI+ !!! 
 
procedure TForm1.FormCreate(Sender: TObject); 
var
  img: TGPBitmap; 
  screendc: HDC; 
  pt1, pt2 : TPoint; 
  sz : TSize; 
  bf : TBlendFunction; 
begin
  // Убираем рамку окна. Иначе ничего не выйдет. 
  Self.BorderStyle := bsNone; 
  // Делаем окно многослойным 
  if SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
  WS_EX_LAYERED) = 0 then ShowMessage(SysErrorMessage(GetLastError)); 
  // Загружаем 32-битный PNG с альфа каналом и получаем его HBITMAP 
  img := TGPBitmap.Create('bluesquare.png',True); 
  with img do begin
    GetHBITMAP(0,hbmp); 
    Width := GetWidth; 
    Height := GetHeight; 
    Free; 
  end; 
  // Получаем контекст экрана  
  screendc := GetDC(0); 
  // Создаем контекст, совместимый с экраном 
  backdc := CreateCompatibleDC(screendc); 
  // Загружаем в него картинку 
  SelectObject(backdc, hbmp); 
  // Вызываем UpdateLayeredWindow 
  pt1 := Point(Left, Top); 
  pt2 := Point(0,0); 
  sz.cx := Width; 
  sz.cy := Height; 
  with bf do begin
    BlendOp := AC_SRC_OVER; 
    BlendFlags := 0; 
    SourceConstantAlpha := $FF; // Можно ставить общую прозрачность 
    AlphaFormat := AC_SRC_ALPHA; 
  end; 
  UpdateLayeredWindow(Handle, screendc, @pt1, @sz, backdc, @pt2,0, @bf,ULW_ALPHA); 
  // Освобождаем контекст экрана 
  ReleaseDC(0,screendc); 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin
  // Освобождаем ресурсы 
  DeleteObject(hbmp); 
  DeleteDC(backdc); 
end; 
 
// Дальше 2 обработчика нужны, чтобы двигать мышкой форму без заголовка 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
var
  cur_pos: TPoint; 
begin
  if ssLeft in Shift then
  begin
    GetCursorPos(cur_pos); 
    Left := cur_pos.X - last_pos.X; 
    Top := cur_pos.Y - last_pos.Y; 
  end; 
end; 
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin
  last_pos.X := X; 
  last_pos.Y := Y; 
end; 
 
// Закрываем прогу по двойному клику в окошке 
procedure TForm1.FormDblClick(Sender: TObject); 
begin
  Close; 
end; 
 
end.
beegl вне форума Ответить с цитированием
Старый 09.01.2015, 15:09   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Если рисуешь форму в GDI, то и компоненты тоже.
Проще говоря пишешь наследника TCustomButton, ловишь все WM_ его сообщения и рисуешь компонент в GDI, как хочешь. Сродни написанию скин-движка.

Последний раз редактировалось Человек_Борща; 09.01.2015 в 17:11.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использую компоненты IdUDPClient, IdUDPServer, при компляции проекта ошибка [dcc32 Error] E2003 Undeclared identifier: 'TIdBytes' Eugene_Stoun Общие вопросы Delphi 1 28.04.2014 10:26
Можно ли отображать одни и те же компоненты на разных вкладках PageControl? FleXik Общие вопросы Delphi 24 28.01.2014 00:35
GDI\GDI+\Photoshop - как добиться прозрачности пикселей определенного цвета? STRELOK-2007 Мультимедиа в Delphi 12 11.01.2014 13:37
Заставить стандартные компоненты отображать расширеный набор символов HellMercenariess Компоненты Delphi 3 01.09.2012 16:11
как позволить пользователю отмечать нужные ему записи? Botvyak Microsoft Office Excel 2 06.05.2010 18:32