Arka planı karartmak
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- White Rose
- Üye
- Mesajlar: 726
- Kayıt: 06 Tem 2005 09:41
- Konum: Güneyden
- İletişim:
Arka planı karartmak
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.
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.
En son White Rose tarafından 29 May 2014 04:05 tarihinde düzenlendi, toplamda 3 kere düzenlendi.
Re: Arka planı karartmak
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
yaparsanız istediğiniz olur.
Umarım soruyu yanlış anlamamışımdır...
Ana form'da, en üstte duracak formu çağırdığınız yerde
Kod: Tümünü seç
FormArkaPlan.Show;
FormEnUstteki.ShowModal;
FormArkaPlan.Hide;
Umarım soruyu yanlış anlamamışımdır...
There's no place like 127.0.0.1
Re: Arka planı karartmak
Ben olsam deyip, yine ilüzyon diycem...
(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...
(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...
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: Arka planı karartmak
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
ApplicationEvents1ModalBegin ve ApplicationEvents1ModalEnd medotlarini kullanarak showmodal olarak actiginiz formlarda otomatik devreye giriyor kapatinca da kayboluyor.
http://delphi.about.com/od/delphitips20 ... dimmer.htm
Re: Arka planı karartmak
- Ö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
- Aşağıda de kendi önerdiğim tekniği (kod kalabalığı demezseniz) temrin çalışması olarak kabul edin.
Şimdi koda dökelim...
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;
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;
Re: Arka planı karartmak
yararlı bir konu olmuş, yakın zamanda denemek istiyorum.
- White Rose
- Üye
- Mesajlar: 726
- Kayıt: 06 Tem 2005 09:41
- Konum: Güneyden
- İletişim:
Re: Arka planı karartmak
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
Re: Arka planı karartmak
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
There's no place like 127.0.0.1
- White Rose
- Üye
- Mesajlar: 726
- Kayıt: 06 Tem 2005 09:41
- Konum: Güneyden
- İletişim:
Re: Arka planı karartmak
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
En son White Rose tarafından 30 May 2014 10:00 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Re: Arka planı karartmak
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
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...
- White Rose
- Üye
- Mesajlar: 726
- Kayıt: 06 Tem 2005 09:41
- Konum: Güneyden
- İletişim:
Re: Arka planı karartmak
cevap için teşekkürler arkadaşlar
Re: Arka planı karartmak
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)
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
- White Rose
- Üye
- Mesajlar: 726
- Kayıt: 06 Tem 2005 09:41
- Konum: Güneyden
- İletişim:
Re: Arka planı karartmak
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
Application.onModalBegin olayı da sadece anaform için çalışıyor diğer formlar için çalışmıyor
Re: Arka planı karartmak
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.
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