Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

DrawImage на region

1.8K
24 мая 2011 года
kvadro
35 / / 17.06.2005
Вопрос один почему не работает этот код,
т.е. почему создается окно нужной формы но картинки там нет,
нужно отрисовку в куда то в др место убирать?
Код:
type
  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;
19K
24 мая 2011 года
Alegun
269 / / 10.09.2010
Что-то очень мудрёно, подозреваю, что это из-за формата рисунка пнг. Прабла с SetWindowRgn. Вот примерчик попроще, только надо переделать под загрузку .пнг (просто здесь рисунок кинут прям на имидж, а так работает).
1.8K
24 мая 2011 года
kvadro
35 / / 17.06.2005
Цитата: Alegun
Что-то очень мудрёно, подозреваю, что это из-за формата рисунка пнг. Прабла с SetWindowRgn. Вот примерчик попроще, только надо переделать под загрузку .пнг (просто здесь рисунок кинут прям на имидж, а так работает).



Просто я не понимаю почему это не работает, идея была взять GDI+ сделать region на окне и выводить указанные картинки плавным переходом в этот регион, чем хорош GDI+ он ест и png и jpeg, + планировалось выводить поверх картинок текст а GDI выводит его лучше и красивее, вот потому всё так мудрёно, можно это сделать или проще куда то дальше копать?

19K
24 мая 2011 года
Alegun
269 / / 10.09.2010
Цитата: kvadro
Просто я не понимаю почему это не работает, идея была взять GDI+ сделать region на окне и выводить указанные картинки плавным переходом в этот регион, чем хорош GDI+ он ест и png и jpeg, + планировалось выводить поверх картинок текст а GDI выводит его лучше и красивее, вот потому всё так мудрёно, можно это сделать или проще куда то дальше копать?

Нет, с листа не читается (я с этим не сталкивался ни разу), не могу частично понять, где, что и куда кладётся, а точно ли рисунок грузится? Чтоб помочь разобраться, желательно проект выложить, глядишь и вытанцуется что либо.

1.8K
24 мая 2011 года
kvadro
35 / / 17.06.2005
У меня delphi 2005 могу прислать переделанный немножко под него GDI+
Долго боролся с загрузчиком, пытаясь затолкать в проект и png картинку 800X600 ни чего не получилось
+Я немножко изменил проект, если так то картинка отрисовывается, но с регионом явно что-то не так ну и плюс отрисовывается она так, как этого ни когда делать не надо)
19K
24 мая 2011 года
Alegun
269 / / 10.09.2010
К сожалению, я не могу запустить проджект под D7 :-(, но как я понял, с помощью компонентов из палитры GDI+ загружается рисунок, подгоняется форма, затем создаётся регион (hRegion) под размерчики картинки, ну и собственно, в завершении энто дело всё выводится на-гора. Рискну посоветовать разместить на форме имидж и вместо
SetWindowRgn(Handle, hRegion, true); попробовать вывести на него содержимое GDIImage. Будет или нет видно рисунок? Если нет, от этого и плясать.

З.Ы. Немного порылся в сырцах, откопал ещё один вариант.
14
24 мая 2011 года
Phodopus
3.3K / / 19.06.2008
Имидж не рисуется, потому что его рисовать надо каждый раз при перерисовке окна.
1.8K
25 мая 2011 года
kvadro
35 / / 17.06.2005
Цитата: Phodopus
Имидж не рисуется, потому что его рисовать надо каждый раз при перерисовке окна.


А какое это событие? Paint, Repaint? я так понимаю надо при каждой отрисовке создавать и освобождать GDIObject?

1.8K
25 мая 2011 года
kvadro
35 / / 17.06.2005
Цитата: Alegun
К сожалению, я не могу запустить проджект под D7 :-(, но как я понял, с помощью компонентов из палитры GDI+ загружается рисунок, подгоняется форма, затем создаётся регион (hRegion) под размерчики картинки, ну и собственно, в завершении энто дело всё выводится на-гора. Рискну посоветовать разместить на форме имидж и вместо
SetWindowRgn(Handle, hRegion, true); попробовать вывести на него содержимое GDIImage. Будет или нет видно рисунок? Если нет, от этого и плясать.


В общем, вот код с которым это работает

Код:
uses
  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;

, но есть сразу дофига вопросов первый из них так делать вобще можно? Если можно так, то получится ли у меня выводить плавный переход от картинки к картинке?
19K
25 мая 2011 года
Alegun
269 / / 10.09.2010
Цитата: kvadro
..., но есть сразу дофига вопросов первый из них так делать вобще можно? Если можно так, то получится ли у меня выводить плавный переход от картинки к картинке?

Да, вопросов появилось много, я даже скачал наборчик GDI+, попробую разобраться в работе, стало интересно, так что на первый ("так делать вобще можно?") возможно пока ответит кто нибудь другой:), но, что касается плавного перехода картинки в картинку, посмотрите как это сделали другие товарищи ранее, может поможет? В архивчике пример создания различных графических эффектов средствами Делфи.

З.Ы. Надеюсь, что этот проект пойдёт под D2005!

14
25 мая 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: kvadro
так делать вобще можно? Если можно так, то получится ли у меня выводить плавный переход от картинки к картинке?


1. Можно (ведь работает), но не нужно! Следует понимать что OnPaint вызывается много раз за время работы программы.
SetWindowRgn() следует вызывать один раз в OnCreate. Соответственно всю подготовку туда же. Грузить картинку из файла - достаточно ресурсоемко, лучше сделать это 1 раз и освободить в конце работы. В OnPaint останется что-то вроде

Цитата:
GDIObject:=TGPGraphics.Create(PaintBox.Canvas.Handle);
GDIObject.DrawImage(GDIImage,0,0);


Освобождать(!) созданный GDIObject!
2. Про плавный переход не понял. Что имелось в виду угадывать не буду.

PictureBox использовать необязательно

56K
26 мая 2011 года
CrazyPr0ger
10 / / 12.05.2011
самый простой способ
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;
19K
26 мая 2011 года
Alegun
269 / / 10.09.2010
Цитата: CrazyPr0ger
самый простой способ


Здесь тема не про заставку, не как её вывести на экран.
Используя GDI+, УК kvadro собирает красивый вьювер картинок, да ещё и с таким же выводом текста на них. Не по теме.

1.8K
26 мая 2011 года
kvadro
35 / / 17.06.2005
Цитата: Phodopus
1. Можно (ведь работает), но не нужно! Следует понимать что OnPaint вызывается много раз за время работы программы.
SetWindowRgn() следует вызывать один раз в OnCreate. Соответственно всю подготовку туда же. Грузить картинку из файла - достаточно ресурсоемко, лучше сделать это 1 раз и освободить в конце работы. В OnPaint останется что-то вроде

Освобождать(!) созданный GDIObject!
2. Про плавный переход не понял. Что имелось в виду угадывать не буду.

PictureBox использовать необязательно



А как сделать SetWindowRgn() по региону, если он создаётся на GDIObject который я создаю и освобождаю при отрисовке? Создание Image и региона я перенёс в CreateForm, а вот с этим пока не знаю что сделать.

в общем, я отказался от использования регионов из GDI+ сделал
SetWindowRgn(MainForm.Handle, CreatePolygonRgn(Points, 8, WINDING), True);

Что позволяет добиться того же, и в отрисовке, действительно, остаётся только создание GDI объекта, отрисовка image и освобождение GDI объекта, думаю это тоже не плохой вариант.

1.8K
26 мая 2011 года
kvadro
35 / / 17.06.2005
Цитата: Alegun
Да, вопросов появилось много, я даже скачал наборчик GDI+, попробую разобраться в работе, стало интересно, так что на первый ("так делать вобще можно?") возможно пока ответит кто нибудь другой:), но, что касается плавного перехода картинки в картинку, посмотрите как это сделали другие товарищи ранее, может поможет? В архивчике пример создания различных графических эффектов средствами Делфи.

З.Ы. Надеюсь, что этот проект пойдёт под D2005!



Спасибо, проект запустился и способ Fade именно тот эффект, которого я хочу добится, учёл Ваши советы и Phodopus-a. Сейчас пробую всё это соеденить.

1.8K
30 мая 2011 года
kvadro
35 / / 17.06.2005
Ну, в общем, всё разобрался я как решить задачу)
способ перехода в приложении Alegun был через функцию AlphaBland, а она использует Канву Bitmap-ов, так что для GDI+ не подходит, но гуглинг GDI+ AlphaBland привёл меня через MSDN на эту ветку

http://www.codeproject.com/KB/GDI-plus/gdiplusanphablend.aspx

И, вобще, полезная ветка по GDI+ много фичь)
Ну и ещё кому интересно читайте Кузан Д., Шапоров В. - Программирование Win32 API в Delphi там про GDI+ целая глава)

Всем спасибо за помощь!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог