Создание окна нестандартной формы

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Создание окна нестандартной формы

Сообщение bloodlines » 16.11.2009 16:00:53

Собственно, как такое можно сделать в lazarus? В винде (must die) это можно сделать с помощью регионов (Region). А как это делать в linux? Есть ли кроссплатформенное решение?
Аватара пользователя
bloodlines
постоялец
 
Сообщения: 100
Зарегистрирован: 05.11.2008 11:26:19

Re: Создание окна нестандартной формы

Сообщение Павел Ишенин » 17.11.2009 06:41:56

TWinControl.SetShape()
Павел Ишенин
постоялец
 
Сообщения: 475
Зарегистрирован: 24.03.2007 10:16:52

Re: Создание окна нестандартной формы

Сообщение Slavikk » 13.12.2009 17:15:55

TWinControl.SetShape - пример применения можно? Так как у меня чего то с использованием TBitmap ничего не получается.
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...

Re: Создание окна нестандартной формы

Сообщение Павел Ишенин » 13.12.2009 19:17:16

lazarus\examples\shapedcontrols\
Павел Ишенин
постоялец
 
Сообщения: 475
Зарегистрирован: 24.03.2007 10:16:52

Re: Создание окна нестандартной формы

Сообщение Slavikk » 13.12.2009 19:36:13

Спасибо. Давно видать я в примеры не заглядывал.
Аватара пользователя
Slavikk
постоялец
 
Сообщения: 208
Зарегистрирован: 15.01.2007 22:34:52
Откуда: Из лесов...

Re: Создание окна нестандартной формы

Сообщение Andreich » 15.12.2009 10:29:41

А нет ли чего-нибудь подобного для для Linux?
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Создание окна нестандартной формы

Сообщение Mr.Smart » 15.12.2009 10:47:09

Andreich
Это кроссплатформенное решение.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Создание окна нестандартной формы

Сообщение coyot.rush » 12.12.2010 00:50:08

Попробовал я создать нестандартную форму в windows . Получилось, но захотелось сделать форму "анимированной" ; использовал ImageList.
И получил ошибку спустя некоторое время работы программы, ошибка классический AV, но где я что не так сделал не пойму :oops:
Код: Выделить всё
unit main;



{$mode delphi}{$H+}



interface



uses

  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,

  ExtCtrls, windows ;











type



{ TAnimTh }



TAnimTh=class(tthread)

procedure Draw();

protected



procedure execute;override;



end;





type



  { TForm1 }



  TForm1 = class(TForm)

    ImMask: TImage;

    ImageList1: TImageList;

    procedure FormCreate(Sender: TObject);

  private

    { private declarations }

  public



  end;









var

  Form1: TForm1;

  Count:integer=0;

  animth:TAnimTh;

  f_x:integer=0;

implementation



{ TForm1 }









procedure BitmapWindow(AHWND : HWND; ABitmap : Graphics.TBitmap);

var

   back_color : COLORREF;

   w,h,x,x0,y : integer;

   wnd_dc,hdc_bmp : HDC;

   tmp_rgn,wnd_rgn : HRGN;

begin

  w := ABitmap.Width;

  h := ABitmap.Height;

  wnd_dc := GetDC(aHwnd);

  hdc_bmp := CreateCompatibleDC(wnd_dc);

  SelectObject(hdc_bmp,ABitmap.Handle);

  back_color := GetPixel(hdc_bmp,0,0);

  tmp_rgn := CreateRectRgn(0,0,0,0);

  wnd_rgn := CreateRectRgn(0,0,0,0);

  x := 0;

  for y := 0 to h-1 do

  begin

    while (x < w-1) do

    begin

      while ((GetPixel(hdc_bmp,x,y) = back_color) and (x < w)) do inc(x);

      if(x <> w) then

        begin

          x0 := x;

          while ((GetPixel(hdc_bmp, x, y) <> back_color) and (x < w)) do inc(x);

          tmp_rgn := CreateRectRgn(x0,y,x,y+1);

          CombineRgn(wnd_rgn,wnd_rgn,tmp_rgn,RGN_XOR);

        end;

    end;

    x := 0;

  end;

  DeleteObject(tmp_rgn);

  DeleteDC(hdc_bmp);

  SetWindowRgn(aHwnd, wnd_rgn, true);

  DeleteObject(wnd_rgn);

end;











procedure TForm1.FormCreate(Sender: TObject);

begin

animth:=TAnimTh.Create(False);

end;













{ TAnimTh }



procedure TAnimTh.Draw();

begin

Inc(Count);

Inc(f_x);



if f_x>640 then f_x:=0;

if Count>=form1.ImageList1.Count then Count:=0;

form1.ImageList1.GetBitmap(Count,Form1.ImMask.Picture.Bitmap);

BitmapWindow(Form1.Handle,Form1.ImMask.Picture.Bitmap);



Form1.Left:=f_x;





end;







procedure TAnimTh.execute;

begin

while not Terminated do

begin

Sleep(50);

Synchronize(Draw);

end;

end;



initialization

  {$I main.lrs}



end.



PS:
Вроде здесь чего то не хватает :(
...Free :?:
Код: Выделить всё
form1.ImageList1.GetBitmap(Count,Form1.ImMask.Picture.Bitmap);

BitmapWindow(Form1.Handle,Form1.ImMask.Picture.Bitmap)


starform.7z
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27

Рейтинг@Mail.ru