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.

Kod: Tümünü seç
FormArkaPlan.Show;
FormEnUstteki.ShowModal;
FormArkaPlan.Hide;
- Ö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.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
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;
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;
Siz zaten en üstteki formun arkasını karartmak istemiyor musunuz? Arkada kaç form olduğu ne farkeder?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
Sanırım aynı projeye ait tüm formları kastediyor.SimaWB yazdı:Siz zaten en üstteki formun arkasını karartmak istemiyor musunuz? Arkada kaç form olduğu ne farkeder?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