Arka planı karartmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Arka planı karartmak

Mesaj gönderen White Rose »

s.a.
Delphi de En üstte kalan formun altındaki arka planı karartmak mümkün müdür. Aşağıda olduğu gibi
Arka planda birkaç pencere üst üste olabilir, sadece en üstteki pencere hariç diğerlerini karartmak istiyorum.

Resim
En son White Rose tarafından 29 May 2014 04:05 tarihinde düzenlendi, toplamda 3 kere düzenlendi.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Arka planı karartmak

Mesaj gönderen SimaWB »

Projenize bir form ekleyin. Mesela adı FormArkaPlan. Bu form, en üsteki formun arkasında kullanılacak olan form. Ona göre Color ve AlphaBlendValue'sunu ayarlayın. AlphaBlend özelliğini True yapmayı unutmayın. Ayrıca bu formun tüm erkanı kaplamasını istediğimiz için WindowState'ini wsMaximized yapmalısınız. Son olarak BorderStyle'ını bsNone yaptığınız da arka plan için kullanacağınız form hazır.

Ana form'da, en üstte duracak formu çağırdığınız yerde

Kod: Tümünü seç

FormArkaPlan.Show;
FormEnUstteki.ShowModal;
FormArkaPlan.Hide;
yaparsanız istediğiniz olur.
Umarım soruyu yanlış anlamamışımdır...
There's no place like 127.0.0.1
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Arka planı karartmak

Mesaj gönderen mrmarman »

Ben olsam deyip, yine ilüzyon diycem... :lol:

(1) Önce: arkada kalacak formun ekranını veya dilersen bütün bir masaüstü ekranın kendisini de olur; bir Bitmap'e kopyalayın. ( hani klasik FormDC olayı yani, arayın bir sürü örnek sadece bu forumda yazdım )

(2) Yine bu formda OCR için verdiğim örneklerde olsun, başka başlıklarda olsun siyah beyaz yapan fonksiyon yardımıyla bu bitmap içeriğini siyahbeyaz yapın.

(3) Projenizde boş bir yedek bir formunuz olsun. Bu form FormStyle fsNone olan, yani kenarı, başlığı olmayan bir panel tarzı form olsun.
(4) Bir procedure hazırlayın, şunu yapsın. Siz login ekranı getireceğinizde; daha önce aldığınız ekranın kopyasını aldığınız birmap'i, bu formun üzerine tam boy olarak yapıştırın.
(5) Sadece form grileşecek ise, yeni formun eni/boyu, left/top değerlerini orjinali ile eşitleyin ve Show edin ki tam üzerine örtüşsün. (ShowModal değil) Tam ekran aldıysanız WindowState maximized olacağından sorun yoktur.
(6) Login ekranınızı showmodal olarak açın.
(7) Login kapanınca bu yedek formu da kapatın ki delilleri yok edin.

işte size istediğiniz işlem... :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Arka planı karartmak

Mesaj gönderen sadettinpolat »

Bu olay Dimmer form adiyla geciyor.

ApplicationEvents1ModalBegin ve ApplicationEvents1ModalEnd medotlarini kullanarak showmodal olarak actiginiz formlarda otomatik devreye giriyor kapatinca da kayboluyor.

http://delphi.about.com/od/delphitips20 ... dimmer.htm
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Arka planı karartmak

Mesaj gönderen mrmarman »

sadettinpolat yazdı:Bu olay Dimmer form adiyla geciyor.

ApplicationEvents1ModalBegin ve ApplicationEvents1ModalEnd medotlarini kullanarak showmodal olarak actiginiz formlarda otomatik devreye giriyor kapatinca da kayboluyor.

http://delphi.about.com/od/delphitips20 ... dimmer.htm
- Önerdiğim metoda benzer bir şekilde yedek bir form varmış. Yedek formun alpha blend özelliği %50 şeffaflaştırılıp orjinal formun üzerine koyulmuş. Evet basit ama etkili bir yöntem.

- Aşağıda de kendi önerdiğim tekniği (kod kalabalığı demezseniz) temrin çalışması olarak kabul edin.

Şimdi koda dökelim... :idea:

Kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
//'1. Opsiyon Sadece Form';
  FormuGrilestir( Self );
  Form2.ShowModal;
  GriForm.Hide;
//'2. opsiyon Tüm Ekran';
  FormuGrilestir( Nil );
  Form2.ShowModal;
  GriForm.Hide;
end;
// Uygulama Kodu

Kod: Tümünü seç

Var
  GriForm : TForm;

Procedure FormuGrilestir( Form:TForm );
  Procedure FormDC(hWin:THandle; Bitmap:TBitmap);
  var
    DC, DCWind        : HWND;
    rc                : TRect;
  begin
    DCWind := hWin;
    GetWindowRect(DCWind, rc);
    with Bitmap do
    try
      Width  := abs(rc.Right - rc.Left);
      Height := abs(rc.Bottom - rc.Top);
      DC := GetDC(GetDesktopWindow);
      try
        BitBlt( Canvas.Handle, 0, 0, Width, Height, DC, rc.Left, rc.Top, SRCCOPY);
      finally
        ReleaseDC(GetDesktopWindow, DC);
      end;
    finally
      ReleaseDC(hWin, DCWind);
    end;
  end;

  procedure Grayscale(Bitmap: TBitmap);
  type
    pRGBLine     = ^TRGBLine;
    TRGBLine     = Array[word] of TRGBTriple;
    pRGBQuadLine = ^TRGBQuadLine;
    TRGBQuadLine = Array[word] of TRGBQuad;
  var
    Line    : Pointer;
    i, j    : Integer;
    palCount: Word;
    MaxPal  : TMaxLogPalette;
    pf24    : boolean;
  begin
    case Bitmap.PixelFormat of
      pf1bit, pf4bit, pf8bit:  // Palette
      begin
        // Retrieve the number of palette entries
        GetObject(Bitmap.Palette, sizeof(word), @palCount);
        MaxPal.palVersion := $0300;
        MaxPal.palNumEntries := PalCount;
        GetPaletteEntries(Bitmap.Palette, 0, PalCount,
          MaxPal.palpalentry);
        FOR j := 0 to PalCount - 1 DO
          with MaxPal.palPalEntry[j] do
          begin
            peRed := (peRed + peGreen + peBlue) div 3;
            peGreen := peRed;
            peBlue := peRed;
          end;
        Bitmap.Palette := CreatePalette(PLogPalette(@MaxPal)^);
      end;
      pf15bit, pf16bit:
         raise Exception.Create('15bit and 16bit bitmap grayscale conversion not supported');
      pf24bit, pf32bit:  // 24 bit
      begin
        pf24 := (Bitmap.PixelFormat = pf24bit);

        FOR j := 0 TO Bitmap.Height - 1 DO
        begin
          Line := Bitmap.Scanline[j];
          FOR i := 0 TO Bitmap.Width - 1 DO
          if pf24 then
            with pRGBLine(Line)[i] do
            begin
              rgbtRed := (rgbtRed + rgbtGreen + rgbtBlue) div 3;
              rgbtgreen := rgbtred;
              rgbtblue := rgbtred;
            end
          else
            with pRGBQuadLine(Line)[i] do
            begin
              rgbRed := (rgbRed + rgbGreen + rgbBlue) div 3;
              rgbgreen := rgbred;
              rgbblue := rgbred;
            end
        end;
      end;
    end;
  end;
var
  Hand : HWND;
  Bitmap1,
  Bitmap2 : TBitmap;
begin
  // GriForm hiç yoksa oluşturucaz...
  if NOT Assigned( GriForm ) then
    Application.CreateForm( TForm, GriForm );
  GriForm.BorderStyle := bsNone;

  // GriForm üzerinde Resim isimli Image yoksa oluşturucaz...
  if TImage( GriForm.FindComponent( 'Resim' ) ) = Nil
  then begin
    With TImage.Create( GriForm ) do
    begin
      Name     := 'Resim';
      Parent   := GriForm;
      Left     := 0;
      Top      := 0;
      Align    := alClient;
      Visible  := True;
    end;
  end;

  // Form ekran kopyası alıyoruz. Nil ise tüm ekranın kopyasını alıcaz...
  If Form = Nil
    then Hand := GetDesktopWindow
    else Hand := Form.Handle;

  // Kaynak Bitmap
  Bitmap1 := TBitmap.Create;
  FormDC( Hand, Bitmap1 );
  Bitmap1.PixelFormat := pf24Bit;

  // Hedef Bitmap
  Bitmap2 := TBitmap.Create;
  Bitmap2.Assign( Bitmap1 );
  Bitmap2.PixelFormat := pf24Bit;

  // GrayScale ( gri tonlamalı ) dönüştürme
  Grayscale(Bitmap2);

  GriForm.Show;
  if Form = Nil
  then GriForm.WindowState := wsMaximized
  else begin
    GriForm.Left   := Form.Left;
    GriForm.Top    := Form.Top;
    GriForm.Width  := Form.Width;
    GriForm.Height := Form.Height;
  end;
  TImage( GriForm.FindComponent( 'Resim' ) ).Picture.Graphic := Nil;
  TImage( GriForm.FindComponent( 'Resim' ) ).Picture.Bitmap.Assign( Bitmap2 );
end;
Resim
Resim ....Resim
nguzeller
Üye
Mesajlar: 109
Kayıt: 19 Oca 2004 03:29

Re: Arka planı karartmak

Mesaj gönderen nguzeller »

yararlı bir konu olmuş, yakın zamanda denemek istiyorum.
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Arka planı karartmak

Mesaj gönderen White Rose »

cevaplar için teşekkür ederim, eğer arka planda tek bir form olsa iş kolay formun alphablend ayarları ile işi halledersiniz, dimmer olayı da aynı işi yapıyor ama arka planda birden çok form farsa iş zor, mrmarman üstadımızın verdiği örnek güzel ama bir hayli kod kalabalığı oluyor, acaba diyorum daha pratik bir yöntem var mıdır ;)
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Arka planı karartmak

Mesaj gönderen SimaWB »

White Rose yazdı:cevaplar için teşekkür ederim, eğer arka planda tek bir form olsa iş kolay formun alphablend ayarları ile işi halledersiniz, dimmer olayı da aynı işi yapıyor ama arka planda birden çok form farsa iş zor, mrmarman üstadımızın verdiği örnek güzel ama bir hayli kod kalabalığı oluyor, acaba diyorum daha pratik bir yöntem var mıdır ;)
Siz zaten en üstteki formun arkasını karartmak istemiyor musunuz? Arkada kaç form olduğu ne farkeder?
There's no place like 127.0.0.1
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Arka planı karartmak

Mesaj gönderen White Rose »

ben bunu proje içindeki tüm formlar için düşünüyorum, o zaman şöyle bir durum ortaya çıkıyor herhangi bir formun üzerine açılan her form için arkaplanı karartmak gerekiyor bu da bir sürü kod demektir. Daha pratik bir çözüm var mıdır

Resim
En son White Rose tarafından 30 May 2014 10:00 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Arka planı karartmak

Mesaj gönderen mrmarman »

SimaWB yazdı:
White Rose yazdı:cevaplar için teşekkür ederim, eğer arka planda tek bir form olsa iş kolay formun alphablend ayarları ile işi halledersiniz, dimmer olayı da aynı işi yapıyor ama arka planda birden çok form farsa iş zor, mrmarman üstadımızın verdiği örnek güzel ama bir hayli kod kalabalığı oluyor, acaba diyorum daha pratik bir yöntem var mıdır ;)
Siz zaten en üstteki formun arkasını karartmak istemiyor musunuz? Arkada kaç form olduğu ne farkeder?
Sanırım aynı projeye ait tüm formları kastediyor.

Sadece kod kalabalığı konusuna açıklık getireyim, bu kalabalık dediğin kodu bir unit altına bir defa koyup sadece iki satır kod yazarak işi kotarıyorsunuz işte neresi kalabalık anlamadım.

Ayrıca iki opsiyonla sundum, tüm ekran veya sadece istenen form şeklinde. Kendim için temrin olsun diye yapıyorum, dileyen böyle kullanır dileuen öyle...
Resim
Resim ....Resim
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Arka planı karartmak

Mesaj gönderen White Rose »

cevap için teşekkürler arkadaşlar
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Arka planı karartmak

Mesaj gönderen SimaWB »

Saadettin Beyin yazdığı gibi; sadece ApplicationEvents1ModalBegin olayında "arka plan formunu göster", ApplicationEvents1ModalEnd olayına da "arka plan formunu gizle" yazdığın zaman işini görmesi gerekir diye düşünüyorum.
Zaten her ShowModal komutundan önce ve sonra bu olaylar otomatik tetikleneceği için tekrar tekrar bu kodları yazmaya gerek yok. (Düşünüyorum dedim, çünkü denemedim)
There's no place like 127.0.0.1
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Re: Arka planı karartmak

Mesaj gönderen White Rose »

Applicationevents componentinin onmodalbegin ve onmodalend eventleri yok
Application.onModalBegin olayı da sadece anaform için çalışıyor diğer formlar için çalışmıyor
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Arka planı karartmak

Mesaj gönderen SimaWB »

Delphi XE kullanıyorum ve onda TApplicationEvents'in OnModalBegin ve OnModalEnd olayları var.
Sanırım siz Delphi 7 kullanıyorsunuz. Delphi 7'de TApplication'ı kullanarak zaten bu event'leri yakalamayı çözmüşsünüz. Sizin de dediğiniz gibi bu olaylar sadece anaform için tetikleniyor. TApplicaiton buna ModalLevel özelliği sayesinde karar veriyor. Bunu Forms.pas dosyasında TApplication.ModalStarted ve TApplication.ModalFinished prosedürlerine baktığınızda görebilirsiniz.

Ekte XE ile yaptığım örneği gönderiyorum. Delphi 7'de de aynen çalışması gerektiğini düşünüyorum.
Dosya ekleri
ShowModalTest.zip
(154.35 KiB) 148 kere indirildi
There's no place like 127.0.0.1
Cevapla