Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Resmin istenilen kısmının seçilmesi
#1
Merhaba,

Ekran görüntüsü üzerinde belli bir alan'ın seçilip, seçilen kısmın clipboard'a kopyalanacağı ve diske kaydedileceği bir program geliştiriyorum. 

Şu anda uygulama arka plan'da çalışıyor ve ekran görüntüsünü bir timage üzerine alıyorum. Fakat istediğim alanın seçilmesi için ne kullanacağıma karar veremedim, bunu nasıl yapabilirim (tek seferde seçmiyecek bir kare çizip o kareyi kenarlardan daraltıp genişleticek ve ok'lediğinde görüntü kaydedilecek. Bu seçim işlemini nasıl yapabilirim sizce? Üzerine bir timage koyup onun üzerine Canvas ile çizim mi yapayım başka bir yöntem mi önerirsiniz?
Cevapla
#2
Selam,

Bir form oluşturun, Color unu clFuchsia yapın, TransparentColor u true yapın,  TransparentColorValue yide clFuchsia yapın, daha sonra aşağıdaki şekilde resim olarak kaydedebilirsiniz.

var
DCDesk: HDC;
bmptum,bmp: TBitmap;
begin

bmptum := TBitmap.Create;
bmptum.Width := Form1.Width-10;
bmptum.Height := Form1.Height-30;
DCDesk:=GetWindowDC(GetDesktopWindow);
BitBlt(bmptum.Canvas.Handle,
0, 0,
Form1.Width-10, Form1.Height,
DCDesk,
Form1.Left+10, Form1.Top+30,
SRCCOPY);
bmptum.PixelFormat := pf1bit; // 1 bit siyah beyaz alır
bmptum.SaveToFile('c:\eticari\dark\test.bmp');
 ReleaseDC(GetDesktopWindow, DCDesk);

Yalnız bende 1 bit olarak kaydetmişim, ona dikkat edersiniz.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#3
Sizin verdiğiniz fikir ile Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol adresindeki gibi 

Kod:
procedure Tfrm_Screen_Shot_Select.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_THICKFRAME;
end;

şeklindeki kodları harmanlayarak bir form oluşturdum fakat resimde göreceğiniz gibi formun üst kısmında seçim sırasında anlamsız bir boşluk oluşuyor.

   
Cevapla
#4
(16-09-2016, Saat: 23:06)edo Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlSizin verdiğiniz fikir ile Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol adresindeki gibi 

Kod:
procedure Tfrm_Screen_Shot_Select.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_THICKFRAME;
end;

şeklindeki kodları harmanlayarak bir form oluşturdum fakat resimde göreceğiniz gibi formun üst kısmında seçim sırasında anlamsız bir boşluk oluşuyor.

Verdiğiniz linkte en altta aşağıdaki gibi bir kod var onu denedinizmi ? sınırı tam belirlemek için gibi bişi yazmışlar.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
 inherited;
 Params.Style := Params.Style or WS_BORDER or WS_THICKFRAME;
end;

ben kendi kodumda width ve height ile oynayıp istediğim sonucu almıştım.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#5
esistem Adlı Kullanıcıdan Alıntı:
edo Adlı Kullanıcıdan Alıntı:Sizin verdiğiniz fikir ile Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol adresindeki gibi 

Kod:
procedure Tfrm_Screen_Shot_Select.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_THICKFRAME;
end;

şeklindeki kodları harmanlayarak bir form oluşturdum fakat resimde göreceğiniz gibi formun üst kısmında seçim sırasında anlamsız bir boşluk oluşuyor.

Verdiğiniz linkte en altta aşağıdaki gibi bir kod var onu denedinizmi ? sınırı tam belirlemek için gibi bişi yazmışlar.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
 inherited;
 Params.Style := Params.Style or WS_BORDER or WS_THICKFRAME;
end;

ben kendi kodumda width ve height ile oynayıp istediğim sonucu almıştım.

Belirttiğiniz kod herhangi bir değişikliğe yol açmadı (açıkçası o kodu görmemiştim de) ayrıca Width ve Height ile nasıl sonuç aldınız bilmiyorum ama ben görüntü olarak bundan rahatsız oldum, yani sıkıntı istediğim alanı seçmekle ilgili değil. Yukardaki kodu koymadan sadece borderstyle = bsNone yapıp transparent yapınca hiç bir şey gözükmüyor bu komutu o yüzden ekledim. 

Fakat daha büyük bir sıkıntım daha var formun içinde kalan alana ya da dışında kalan alana dokunulduğunda mouse focusu kaybediyor (ekranın tamamında seçim yapabilmek için ShowModal yerine StayOnTop yapıp formu Show ettim sorun bundan kaynaklanıyor) ama ShowModal yapınca da alttaki taskbar'dan aşağısını seçemiyorum Sad
Cevapla
#6
Doğrudur, değişiklik olmıcaktır zira zaten border bsnone yapmıştınız baştan. border neden bsnone yapıyorsunuz ? resim boyutunu formun içine gelecek şekilde ayarlayın.
Verdiğim kodda zaten ayarlanmıştı, form border görünüyorsa sizde değerleri değiştin olsun bitsin.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#7
Yapmak istediğim şeyi belki de en başından beri düzgün anlatamamış olabilirim. Aslında windows'un snipping tool'u nu hayal edebilirsiniz. Yeni bir görüntü yakalarken ekranın tamamı üzerinde istenen kısmı seçmek istiyorum. Projenin kodlarını zaten bitbucket ya da github üzerinden paylaşmayı düşünyorum, tam anlamatamadımsa kodları yükledikten sonra projeyi söylerim oradan belki daha iyi canlanabilir yapmak istediğim şey. Kullanıcı isterse ekranın tamamımını ya da tamamına yakınını ya da çok daha küçük bir alanı seçebilecek. O yüzden border gözükmemeli. Ama şu anda sorun showmodal denildiğinde ekranının tamamının seçilmeyior oluşu (modal form taskbar üzerine çıkmıyor)
Cevapla
#8
En basit yolu Form un BorderStyle özelliğini bsSizeable yapıp, bordericons da minimize ve maximize yi False yapıp, formun ebatlarını kullanıcıya bırakmak olacaktır, bu şekilde taskbar ıda kaplayacak şekilde kendisi ayarlayabilir. Ben o şekilde yapmıştım. 
Kodlar Tam olarak aşağıdaki şekilde olunca formun kapladığı tüm alanı resim olarak kaydedebiliyorsunuz.

var
DCDesk: HDC;
bmptum: TBitmap;
begin
bmptum := TBitmap.Create;
bmptum.Width := Form1.Width; 
bmptum.Height := Form1.Height;
DCDesk:=GetWindowDC(GetDesktopWindow);
BitBlt(bmptum.Canvas.Handle,
0, 0,
Form1.Width, Form1.Height,
DCDesk,
Form1.Left, Form1.Top,
SRCCOPY);
bmptum.PixelFormat := pf24bit;
bmptum.SaveToFile('c:\eticari\darko_form\test.bmp');
 ReleaseDC(GetDesktopWindow, DCDesk);
 bmptum.Free;
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#9
esistem Adlı Kullanıcıdan Alıntı:En basit yolu Form un BorderStyle özelliğini bsSizeable yapıp, bordericons da minimize ve maximize yi False yapıp, formun ebatlarını kullanıcıya bırakmak olacaktır, bu şekilde taskbar ıda kaplayacak şekilde kendisi ayarlayabilir. Ben o şekilde yapmıştım. 
Kodlar Tam olarak aşağıdaki şekilde olunca formun kapladığı tüm alanı resim olarak kaydedebiliyorsunuz.

var
DCDesk: HDC;
bmptum: TBitmap;
begin
bmptum := TBitmap.Create;
bmptum.Width := Form1.Width; 
bmptum.Height := Form1.Height;
DCDesk:=GetWindowDC(GetDesktopWindow);
BitBlt(bmptum.Canvas.Handle,
0, 0,
Form1.Width, Form1.Height,
DCDesk,
Form1.Left, Form1.Top,
SRCCOPY);
bmptum.PixelFormat := pf24bit;
bmptum.SaveToFile('c:\eticari\darko_form\test.bmp');
 ReleaseDC(GetDesktopWindow, DCDesk);
 bmptum.Free;

Formun caption'ın yer aldığı kısımdan da kurtulmak istiyorum ama Smile
Cevapla
#10
Caption size engel teşkil etmiyecektir, eğer yukarıda yazdığım şekilde yaparsanız formun dış çeperleri kadar bir alanı resim olarak alırsınız, form üzerindeki buton yada herhangi bir nesne yada caption u resimde zaten görünmeyecektir. Yok eğer ben formu bsnone olarak yapıcam derseniz, o zamanda form üzerine panel çizip panelden tutup sürükleme yapacak ve panelden boyutlarını değiştirme yapacaksınız . bu seferde bolca kod yazmanız gerekecektir.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  İstenilen Aralıkta Yazı Girdisi hyperxman 2 116 01-12-2017, Saat: 08:02
Son Yorum: hyperxman



Konuyu Okuyanlar: 1 Ziyaretçi