Büyüteç (Zoom tool) yapımı?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Sedat Atif
Üye
Mesajlar: 80
Kayıt: 18 Şub 2004 08:12
Konum: Fâni bir yerden
İletişim:

Büyüteç (Zoom tool) yapımı?

Mesaj gönderen Sedat Atif »

Merhaba,

Sistemi fazla yormayan bir büyüteç nasıl yapabilirim? Hani açılınca ekrandaki herhangi bir alanın büyütülmüş görüntüsünü gösteren programcıklardan... Bir takım kodlar buldum ama performansı düşük bilgisayarlarda bir süre açık kalınca sorun çıkardı...

Teşekkürler.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Merhaba

Bunun için formuna 1 adet mouse, 1 adet panel ve 1 adet timer bileşeni yerleştir. Timer bileşeninin intevral özelliğiniz 25 yap.


Örnek

Kod: Tümünü seç

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Srect,Drect,PosForme:TRect;
  iWidth,iHeight,DmX,DmY:Integer;
  iTmpX,iTmpY:Real;
  C:TCanvas;
  Kursor:TPoint;
  ZoomFactor: Integer;
begin
   GetCursorPos(Kursor);
   PosForme:=Rect(Form1.Left,Form1.Top,Form1.Left+Form1.Width,Form1.Top+Form1.Height);
   If not PtInRect(PosForme,Kursor) then
   begin
     If Panel1.Visible=True then Panel1.Visible:=False;
     If Image1.Visible=False then Image1.Visible:=True;
     iWidth:=Image1.Width;
     iHeight:=Image1.Height;
     Drect:=Rect(0,0,iWidth,iHeight);

     { 2x kadar büyütür. 4x icin 2, ...}
     ZoomFactor := 1;
     iTmpX:=iWidth / (ZoomFactor * 4);
     iTmpY:=iHeight / (ZoomFactor * 4);

     Srect:=Rect(Kursor.x,Kursor.y,Kursor.x,Kursor.y);
     InflateRect(Srect,Round(iTmpX),Round(iTmpY));
    // move Srect if outside visible area of the screen
     If Srect.Left<0 then OffsetRect(Srect,-Srect.Left,0);
     If Srect.Top<0 then OffsetRect(Srect,0,-Srect.Top);
     If Srect.Right>Screen.Width then OffsetRect(Srect,-(Srect.Right-Screen.Width),0);
     If Srect.Bottom>Screen.Height then OffsetRect(Srect,0,-(Srect.Bottom-Screen.Height));
     C:=TCanvas.Create;
     try
       C.Handle:=GetDC(GetDesktopWindow);
       Image1.Canvas.CopyRect(Drect,C,Srect);
     finally
       C.Free;
     end;
     Application.ProcessMessages;
  end // Cursor Form'un icinde degil
  else
  begin  // cursor Form'un icinde
    If Panel1.Visible=False then Panel1.Visible:=True;
    If Image1.Visible=True then Image1.Visible:=False;
  end;
end;
Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Sedat Atif
Üye
Mesajlar: 80
Kayıt: 18 Şub 2004 08:12
Konum: Fâni bir yerden
İletişim:

Mesaj gönderen Sedat Atif »

İşte bahsettiğim kod bu kod, bunu kullanınca bir süre sonra bilgisayar iyice yavaşlıyor, en sonunda da "canvas does not allow drawing" vs gibi hatalar çıkıyor ard arda.

Ne yapabilirim?
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Nekadar zaman geçtikten sonra yavaşlamaya başlıyor.

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

20 dakikadır çalıştırıyorum hiç bir problem yok ne bir yavaşlama nede başka birşey Makinam P 4.1,5 işletim sistemim XP Delphi 6 kullanıyorum.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

Win9x serisi (95/98/ME) işletim sistemi kullanıyorsanız, bunların GDI kaynakları son derece sınırlı olduğu için bu tip problemler çok çıkıyor. Kesin çözüm NT tabanlı bir sisteme geçmek.

Kolay gelsin.
Sedat Atif
Üye
Mesajlar: 80
Kayıt: 18 Şub 2004 08:12
Konum: Fâni bir yerden
İletişim:

Mesaj gönderen Sedat Atif »

Merhaba.

Önceden dediğim gibi sadece eski sistemlerde (P3 800) olmuyormuş, yeni sayılabileceklerde de oluyormuş.

Test sistemi:
WinXP Pro
Celeron 1700
512 MB RAM

Program Delphi 6 ile yapıldı, test sırasında Delphi açık değildi.

Yeni bir program oluşturulup hiçbir ayar değiştirilmeden bir TImage, bir TPanel, bir TTimer yerleştirildi ve gerekli kodlar kopyalanıp yapıştırıldı. Ha, TTimer'ın intevral özelliği 25 yapıldı tabi.

Delphi kapatılıp Project1.exe çalıştırıldı. Birkaç dakika sonra sistemde yavaşlama başladı. Yaklaşık 10 dakika geçtiğinde ard arda "Canvas does not allow drawing" hataları alınmaya başlandı. Öyle ki task manager'ı açıp project1'i terminate etmekte oldukça zorlanıldı. Ne yazık ki... :(

Not: Daha önceki denememden hatırladığım kadarıyla TTimer'ın intevral özelliğine daha büyük değerler girildiğinde hata mesajları daha geç çıkıyor.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Arkadaşlar işyerindeki makinada Test ettim aynı problemi 25 dakika sonra bendede veriyor.

İlginç :roll:

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Merhaba
Arkadaşlar Kodun orjinali buldum ve biraz düzenleme yaptım kodda şimdilik bir problem yok gibi yinede test edip sonuçları yazarsanız memnun olurum.

Kod: Tümünü seç

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Srect,Drect,PosForme:TRect;
  iWidth,iHeight,DmX,DmY:Integer;
  iTmpX,iTmpY:Real;
  C:TCanvas;
  hDesktop: Hwnd;
  Kursor:TPoint;
  ZoomFactor: Integer;
begin
 If not IsIconic(Application.Handle) then
 begin
    hDesktop:= GetDesktopWindow;
    GetCursorPos(Kursor);
    PosForme:=Rect(Form1.Left,Form1.Top,Form1.Left+Form1.Width,Form1.Top+Form1.Height);
    If not PtInRect(PosForme,Kursor) then
    begin
      If Panel1.Visible=True then Panel1.Visible:=False;
        If Image1.Visible=False then Image1.Visible:=True;
            iWidth:=Image1.Width;
            iHeight:=Image1.Height;
            Drect:=Rect(0,0,iWidth,iHeight);
            { 2x kadar büyütür. 4x icin 2, ...}
            ZoomFactor := 1;
            iTmpX:=iWidth / (ZoomFactor * 4);
            iTmpY:=iHeight / (ZoomFactor * 4);
            Srect:=Rect(Kursor.x,Kursor.y,Kursor.x,Kursor.y);
            InflateRect(Srect,Round(iTmpX),Round(iTmpY));
            // move Srect if outside visible area of the screen
            If Srect.Left<0 then
                OffsetRect(Srect,-Srect.Left,0);
            If Srect.Top<0 then
                OffsetRect(Srect,0,-Srect.Top);
            If Srect.Right>Screen.Width then
                OffsetRect(Srect,-(Srect.Right-Screen.Width),0);
            If Srect.Bottom>Screen.Height then
                OffsetRect(Srect,0,-(Srect.Bottom-Screen.Height));
            C:=TCanvas.Create;
            try
                C.Handle:=GetDC(GetDesktopWindow);
                Image1.Canvas.CopyRect(Drect,C,Srect);
            finally
                ReleaseDC(hDesktop, C.Handle);
                C.Free;
            end;
            with Image1.Canvas do
            begin
                DmX:=ZoomFactor * 4 * (Kursor.X-Srect.Left);
                DmY:=ZoomFactor * 4 * (Kursor.Y-Srect.Top);
                MoveTo(DmX - (iWidth div 4),DmY); // -
                LineTo(DmX + (iWidth div 4),DmY); // -
                MoveTo(DmX,DmY - (iHeight div 4)); // |
                LineTo(DmX,DmY + (iHeight div 4)); // |
            end; // with image1.Canvas
            Application.ProcessMessages;
    end // Cursor Form'un icinde degil
    else
    begin  // cursor Form'un icinde
    If Panel1.Visible=False then
        Panel1.Visible:=True;
    If Image1.Visible=True then
        Image1.Visible:=False;
    end;
 end;
End;

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

Kod: Tümünü seç

finally
  ReleaseDC(hDesktop, C.Handle);
  C.Free;
end; 
hocam koddaki şu fark memoryi şişiriyor olabilir.
Microzoft MSDN sitesi aşağıdaki linkte yazdı:The ReleaseDC function releases a device context (DC), freeing it for use by other applications....
The application must call the ReleaseDC function for each call to the GetWindowDC function and for each call to the GetDC function that retrieves a common DC....

Kaynak : http://msdn.microsoft.com/library/defau ... s_66hv.asp
Cevapla