DrawImage на region
т.е. почему создается окно нужной формы но картинки там нет,
нужно отрисовку в куда то в др место убирать?
TMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
GDIRegion:TGPRegion;
GDIImage:TGPBitmap;
GDIObject:TGPGraphics;
GDPath:TGPGraphicsPath;
h,w:Integer;
FontFamily : TGPFontFamily;
Points:array [0..7] of TGPPoint;
{ Private declarations }
public
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
GDIRegion.Free;
GDIImage.Free;
GDPath.Free;
GDIObject.Free;
end;
procedure TMainForm.FormCreate(Sender: TObject);
const
C=40;
var
hRegion: HRGN;
begin
Self.BorderStyle := bsNone;
GDIObject:=TGPGraphics.Create(Canvas.Handle);
GDIImage:=TGPBitMap.Create('2.png',True);
MainForm.Width:=GDIImage.GetWidth;
MainForm.Height:=GDIImage.GetHeight;
h := MainForm.Height;
w := MainForm.Width;
Points[0].X := C; Points[0].Y := 0;
Points[1].X := 0; Points[1].Y := C;
Points[2].X := 0; Points[2].Y := h - c;
Points[3].X := C; Points[3].Y := h;
Points[4].X := w - c; Points[4].Y := h;
Points[5].X := w; Points[5].Y := h - c;
Points[6].X := w; Points[6].Y := C;
Points[7].X := w - C; Points[7].Y := 0;
GDPath:=TGPGraphicsPath.Create();
GDPath.AddPolygon(PGPPoint(@Points), 8);
GDIRegion:=TGPRegion.Create(GDPath);// определяем регион из созданного пути
GDIObject.SetClip(GDIRegion);
GDIObject.DrawImage(GDIImage,0,0);
hRegion:=GDIRegion.GetHRGN(GDIObject);
GDIObject.DrawImage(GDIImage,0,0);
SetWindowRgn(Handle, hRegion, true); // устанавливаем область отсечения
end;
Просто я не понимаю почему это не работает, идея была взять GDI+ сделать region на окне и выводить указанные картинки плавным переходом в этот регион, чем хорош GDI+ он ест и png и jpeg, + планировалось выводить поверх картинок текст а GDI выводит его лучше и красивее, вот потому всё так мудрёно, можно это сделать или проще куда то дальше копать?
Нет, с листа не читается (я с этим не сталкивался ни разу), не могу частично понять, где, что и куда кладётся, а точно ли рисунок грузится? Чтоб помочь разобраться, желательно проект выложить, глядишь и вытанцуется что либо.
Долго боролся с загрузчиком, пытаясь затолкать в проект и png картинку 800X600 ни чего не получилось
+Я немножко изменил проект, если так то картинка отрисовывается, но с регионом явно что-то не так ну и плюс отрисовывается она так, как этого ни когда делать не надо)
SetWindowRgn(Handle, hRegion, true); попробовать вывести на него содержимое GDIImage. Будет или нет видно рисунок? Если нет, от этого и плясать.
З.Ы. Немного порылся в сырцах, откопал ещё один вариант.
А какое это событие? Paint, Repaint? я так понимаю надо при каждой отрисовке создавать и освобождать GDIObject?
SetWindowRgn(Handle, hRegion, true); попробовать вывести на него содержимое GDIImage. Будет или нет видно рисунок? Если нет, от этого и плясать.
В общем, вот код с которым это работает
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,GDIPAPI,GDIPOBJ, ExtCtrls, pngextra;
type
TMainForm = class(TForm)
PaintBox: TPaintBox;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure PaintBoxPaint(Sender: TObject);
private
GDIRegion:TGPRegion;
GDIImage:TGPBitmap;
GDIObject:TGPGraphics;
GDPath:TGPGraphicsPath;
h,w:Integer;
FontFamily : TGPFontFamily;
Points:array [0..7] of TGPPoint;
{ Private declarations }
public
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
GDIRegion.Free;
GDIImage.Free;
GDPath.Free;
GDIObject.Free;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Self.BorderStyle := bsNone;
end;
procedure TMainForm.PaintBoxPaint(Sender: TObject);
const
C=40;
var
hRegion: HRGN;
begin
GDIObject:=TGPGraphics.Create(PaintBox.Canvas.Handle);
GDIImage:=TGPBitMap.Create('2.png',True);
w := GDIImage.GetWidth;
h := GDIImage.GetHeight;
MainForm.Width:=w;
MainForm.Height:=h;
PaintBox.Width:=w;
PaintBox.Height:=h;
Points[0].X := C; Points[0].Y := 0;
Points[1].X := 0; Points[1].Y := C;
Points[2].X := 0; Points[2].Y := h - c;
Points[3].X := C; Points[3].Y := h;
Points[4].X := w - c; Points[4].Y := h;
Points[5].X := w; Points[5].Y := h - c;
Points[6].X := w; Points[6].Y := C;
Points[7].X := w - C; Points[7].Y := 0;
GDPath:=TGPGraphicsPath.Create();
GDPath.AddPolygon(PGPPoint(@Points), 8);
GDIRegion:=TGPRegion.Create(GDPath);// определяем регион из созданного пути
GDIObject.SetClip(GDIRegion);
hRegion:=GDIRegion.GetHRGN(GDIObject);
SetWindowRgn(Handle, hRegion, true); // устанавливаем область отсечения
GDIObject.DrawImage(GDIImage,0,0);
end;
, но есть сразу дофига вопросов первый из них так делать вобще можно? Если можно так, то получится ли у меня выводить плавный переход от картинки к картинке?
Да, вопросов появилось много, я даже скачал наборчик GDI+, попробую разобраться в работе, стало интересно, так что на первый ("так делать вобще можно?") возможно пока ответит кто нибудь другой:), но, что касается плавного перехода картинки в картинку, посмотрите как это сделали другие товарищи ранее, может поможет? В архивчике пример создания различных графических эффектов средствами Делфи.
З.Ы. Надеюсь, что этот проект пойдёт под D2005!
1. Можно (ведь работает), но не нужно! Следует понимать что OnPaint вызывается много раз за время работы программы.
SetWindowRgn() следует вызывать один раз в OnCreate. Соответственно всю подготовку туда же. Грузить картинку из файла - достаточно ресурсоемко, лучше сделать это 1 раз и освободить в конце работы. В OnPaint останется что-то вроде
GDIObject.DrawImage(GDIImage,0,0);
Освобождать(!) созданный GDIObject!
2. Про плавный переход не понял. Что имелось в виду угадывать не буду.
PictureBox использовать необязательно
var
SplashForm: TSplashForm;
implementation
{$R *.dfm}
procedure TSplashForm.FormPaint(Sender: TObject);
begin
Image1.Visible:=False;
Canvas.Draw(0,0,image1.Picture.Bitmap);
end;
procedure TSplashForm.FormCreate(Sender: TObject);
var rgn: HRGN;
begin
rgn := CreateRoundRectRgn(0,// x-coordinate of the region's upper-left corner
0, // y-coordinate of the region's upper-left corner
ClientWidth, // x-coordinate of the region's lower-right corner
ClientHeight, // y-coordinate of the region's lower-right corner
40, // height of ellipse for rounded corners
40); // width of ellipse for rounded corners
SetWindowRgn(Handle, rgn, True);
end;
Затем используем это дело так:
splashForm:=TSplashForm.Create(nil);
SplashForm.Show;
SplashForm.Repaint;
for i:=0 to 255 do
begin
SplashForm.AlphaBlendValue:=i;
Sleep(5); //10
end;
Sleep(2000);
SplashForm.Hide;
SplashForm.Close;
SplashForm.Free;
Здесь тема не про заставку, не как её вывести на экран.
Используя GDI+, УК kvadro собирает красивый вьювер картинок, да ещё и с таким же выводом текста на них. Не по теме.
SetWindowRgn() следует вызывать один раз в OnCreate. Соответственно всю подготовку туда же. Грузить картинку из файла - достаточно ресурсоемко, лучше сделать это 1 раз и освободить в конце работы. В OnPaint останется что-то вроде
Освобождать(!) созданный GDIObject!
2. Про плавный переход не понял. Что имелось в виду угадывать не буду.
PictureBox использовать необязательно
А как сделать SetWindowRgn() по региону, если он создаётся на GDIObject который я создаю и освобождаю при отрисовке? Создание Image и региона я перенёс в CreateForm, а вот с этим пока не знаю что сделать.
в общем, я отказался от использования регионов из GDI+ сделал
SetWindowRgn(MainForm.Handle, CreatePolygonRgn(Points, 8, WINDING), True);
Что позволяет добиться того же, и в отрисовке, действительно, остаётся только создание GDI объекта, отрисовка image и освобождение GDI объекта, думаю это тоже не плохой вариант.
З.Ы. Надеюсь, что этот проект пойдёт под D2005!
Спасибо, проект запустился и способ Fade именно тот эффект, которого я хочу добится, учёл Ваши советы и Phodopus-a. Сейчас пробую всё это соеденить.
способ перехода в приложении Alegun был через функцию AlphaBland, а она использует Канву Bitmap-ов, так что для GDI+ не подходит, но гуглинг GDI+ AlphaBland привёл меня через MSDN на эту ветку
http://www.codeproject.com/KB/GDI-plus/gdiplusanphablend.aspx
И, вобще, полезная ветка по GDI+ много фичь)
Ну и ещё кому интересно читайте Кузан Д., Шапоров В. - Программирование Win32 API в Delphi там про GDI+ целая глава)
Всем спасибо за помощь!