Transparan Form

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
emozguner
Üye
Mesajlar: 11
Kayıt: 05 Oca 2008 12:30
Konum: Kocaeli

Transparan Form

Mesaj gönderen emozguner »

Merhaba arkadaslar yaklasık 1yıldır sitenizi ziyaret etmekdeyim cok konuda yardımınız dokundu öncelikle hakınızı helal ediniz. Kısmet simdi uye olmayaymıs.
Benim sorunum su bir png veya bmp dosyayı forma yukletip formu yukledigim resmin sekline getirmek. Kısmende olsa bu dedigimi yine sizin sitenizde buldugum bir kodla cozdum ama bu kodda da transparent olmayan yerlere bir speed buton veya image koyup icine resm koydgumda click eventları calısmıyor anlamıs değilim olayı.
Kod Su Sekilde

Kod: Tümünü seç

procedure TfrmMain.FormCreate(Sender: TObject);

  procedure GetNextSpan(const row: PByteArray; const SpanLeft: Integer; var SpanRight: Integer; var SpanColor:TColor);
  var
    column    : Integer;
    TempColor : TColor;
  begin
    column := SpanLeft;
    TempColor := MaskColor(row, SpanLeft);
    repeat
      column := column + 1;
    until (TempColor <> MaskColor(row, column)) or (column >= ImageMap.Width);
    SpanRight := column - 1;
    SpanColor := TempColor;
  end;

var
  y         : Integer;
  row       : PByteArray;
  YRgn      : HRGN;
  SpanRgn   : HRGN;
  SpanLeft  : Integer;
  SpanRight : Integer;
  SpanColor : TColor;
begin
  frmMain.Canvas.Brush.Style := bsClear;
  ImageMap := imgPicture.Picture.Bitmap;
  WindowRgn := CreateRectRgn(0, 0, 0, 0);
  for y := 0 to ImageMap.Height - 1 do
  begin
    YRgn := CreateRectRgn(0, y, 0, y);
    row := ImageMap.scanline[y];
    SpanLeft := 0;
    SpanRight := 0;
    repeat
      GetNextSpan(row, SpanLeft, SpanRight, SpanColor);
      if SpanColor <> clFuchsia then
      begin
        SpanRgn := CreateRectRgn(SpanLeft, y, SpanRight + 1, y + 1);
        CombineRgn(YRgn, YRgn, SpanRgn, RGN_OR);
        DeleteObject(SpanRgn);
      end;
      SpanLeft := SpanRight + 1;
    until (SpanRight >= ImageMap.Width);
    CombineRgn(WindowRgn, WindowRgn, YRgn, RGN_OR);
    DeleteObject(YRgn);
  end;
  SetWindowRgn(Handle,WindowRgn,true);
end;

function TfrmMain.MaskColor(row: PByteArray; x: word):TColor;
  var
    r, g, b: byte;
  begin
  if ImageMap = nil then exit;
  if x > ImageMap.Width then exit;

  b := row[x * 3];
  g := row[x * 3 + 1];
  r := row[x * 3 + 2];

  if (r = 255) and (g = 0) and (b = 255) then result := clFuchsia
end;

procedure TfrmMain.WMNCHitTest (var M: TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then
  M.Result := htCaption;
end;

procedure TfrmMain.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = CHR(27) then Application.Terminate
end;

procedure TfrmMain.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0, 0, ImageMap);
end;
Benim aslında istedgim boyle yapana kadar belki görmüşsünüzdür havaciva diye bir programda delphi de widget cizimi yapılmıs acaba nasıl boyle birsey yapabilirim. Simdiden tesekkur ederim eğer bir kusur işlemisem af ola selametle
Akin_Delphi
Üye
Mesajlar: 163
Kayıt: 06 Nis 2006 12:22

Re: Transparan Form

Mesaj gönderen Akin_Delphi »

Hocam SkinForm olarak google aratırsanız çeşitli bileşenler bulabilirsiniz.

Hatta etrafta bazı tutoriallar (öğreticiler) de dolaşıyordu. Ancak kaynakların çoğu İngilizce.

Saygılar ve başarılar.
Cevapla