mouse a çizgi
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
mouse a çizgi
Hayırlı Çalışmalar;
Bir takım resim editorlerinde olduğu gibi bir image in üzerinde mouse dolaştırıken mouse un olduğu noktaya yukardan ve soldan eşlik edecek çizgi nasıl çizdirilebilir arkadaşlar mouse oynadıkça bu çizgi mouse ucuna eşlik edecek
Bir takım resim editorlerinde olduğu gibi bir image in üzerinde mouse dolaştırıken mouse un olduğu noktaya yukardan ve soldan eşlik edecek çizgi nasıl çizdirilebilir arkadaşlar mouse oynadıkça bu çizgi mouse ucuna eşlik edecek
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
ben mose şeklini değiştirmek istemiyorum aşağıda bir örnek verdim herhalde anlatır ne demek istediğimi o harfi mouse olsun çizgilerde image in üstünden ve solundan mouse olduğu x,y koordinatlarına çizilmiş çizgiler olsun
|
|
|
|
|
|
----------------------------o
|
|
|
|
|
|
----------------------------o
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
tam anlamadım ne yapmak istediğini fakat bu bilgiler işini görür sanırım;
Canvas.MoveTo(x,y) // aktif pixeli X,Y noktasına taşır
Canvas.LineTo(x,y) //x ve ye kordinatlarında düz çizgi çizer
ister imagenin x,y lerinden aktar buna istersen sabit ise pixel moveto ile aktar ve çiz
Kolay Gelsin
Canvas.MoveTo(x,y) // aktif pixeli X,Y noktasına taşır
Canvas.LineTo(x,y) //x ve ye kordinatlarında düz çizgi çizer
ister imagenin x,y lerinden aktar buna istersen sabit ise pixel moveto ile aktar ve çiz
Kolay Gelsin
Başkasına Olan Saygımız.. Kendimize Olan saygıdır..
Arkadaş mouse koordinatlarını eksen çizgileri üstünde çizgi şeklinde göstermek istiyor.
Şöyle birşey yapabilirsin. Eksen çizgilerini çizdikten sonra OnMouseMove gibi bir event'e dersin ki mouse'un koordinatına göre bu eksen çizgilerini yeniden boya. Mesela mouse 10. satır , 27.sütun noktasında olsun. O halde X eksenindeki eksen çizgisinin 27. pikseline denk gelecek yere bir X koyarsın.
Y eksenindeki eksen çizgisinin 10. satıra denk yerine de bir X koydun mu fareyi hareket ettirdiğinde istediğin efekti elde edebilirsin.
Sanki Delphi'nin DEMO'larında böyle birşey vardı diye de hatırlıyorum.
Şöyle birşey yapabilirsin. Eksen çizgilerini çizdikten sonra OnMouseMove gibi bir event'e dersin ki mouse'un koordinatına göre bu eksen çizgilerini yeniden boya. Mesela mouse 10. satır , 27.sütun noktasında olsun. O halde X eksenindeki eksen çizgisinin 27. pikseline denk gelecek yere bir X koyarsın.
Y eksenindeki eksen çizgisinin 10. satıra denk yerine de bir X koydun mu fareyi hareket ettirdiğinde istediğin efekti elde edebilirsin.
Sanki Delphi'nin DEMO'larında böyle birşey vardı diye de hatırlıyorum.
Teşekkür ederim, Bir soru daha sorsam ;
bir image nesnesi üzerindeki son işlemi nasıl geri alabiliriz. çizgi çizdik diyelim çizmeden önceki haline geri alma
şeklinde denedim bir işe yaramadı
bir image nesnesi üzerindeki son işlemi nasıl geri alabiliriz. çizgi çizdik diyelim çizmeden önceki haline geri alma
Kod: Tümünü seç
with Image do
if HandleAllocated then SendMessage(Handle, EM_UNDO, 0, 0);
veya
SendMessage(Handle, EM_UNDO, 0, 0);
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Aklıma ilk gelen her çizim işleminden önce Image bileşeni Canvas'ının bir kopyasını buffer'a alman. Undo yapmak istediğinde de bu buffer'dan geri yüklemen. Çok etkin bir çözüm değil. Sürekli ram'den yersin. Daha zor ama ram kullanımı açısından etkin olan, çizme işleminin koordinatlarını bir buffer'da saklaman. Yani 13'e 10'dan 40'a 40 koordinatına bir çizgi çektiysen bu koordinatları saklaman. Geri almak istediğinde de bu koordinatlardaki çizgiyi silmen. Ancak çakışan çizgilerde ne yaparsın bilemem.
Çizgi, daire kare vs.. türü çizimleri bir obje şeklinde tasarlaman faydalı olur kanaatindeyim. Buna göre bellekte sadece bunların object pointer ve object değerlerini saklarsın. Mesela çizgi için:
TLine = class
private
FX, FY, FX1, FY1: Integer;
public
constructor Create(const X, Y, X1, Y1: Integer); // verilen koordinata çizgi çizer
procedure Repaint; // Koordinatlardaki çizgiyi yeniden çizer.
end;
gibi bir obje tanımladın.
Create ettiğinde verdiğin koordinatlara çizgiyi çekiyor.
Bunu create ettiğin zaman bir TList içinde depola.
FList.Add(TLine.Create(1, 1, 10, 10)) ; // ilk çizgi
gibi... Bir line daha çiz...
FList.Add(TLine.Create(20, 20, 40, 80)) ; // 2. çizgi
Geri almak istediğinde son çizdiğin line'ı Free et.
TLine(FList[1]).Free;
Flist[1].Delete; gibi,
sonra FList içindeki bütün objeleri bir döngü içinde yeniden çizdir.
Image1.Clear;
for I:= 0 to Flist.count do
Flist.Repaint;
gibi..Bu şekilde çizdirdiğin şeyleri diske kaydedip yeniden yükleme imkanın da olmuş olur. AutoCAD gibin..
Çizgi, daire kare vs.. türü çizimleri bir obje şeklinde tasarlaman faydalı olur kanaatindeyim. Buna göre bellekte sadece bunların object pointer ve object değerlerini saklarsın. Mesela çizgi için:
TLine = class
private
FX, FY, FX1, FY1: Integer;
public
constructor Create(const X, Y, X1, Y1: Integer); // verilen koordinata çizgi çizer
procedure Repaint; // Koordinatlardaki çizgiyi yeniden çizer.
end;
gibi bir obje tanımladın.
Create ettiğinde verdiğin koordinatlara çizgiyi çekiyor.
Bunu create ettiğin zaman bir TList içinde depola.
FList.Add(TLine.Create(1, 1, 10, 10)) ; // ilk çizgi
gibi... Bir line daha çiz...
FList.Add(TLine.Create(20, 20, 40, 80)) ; // 2. çizgi
Geri almak istediğinde son çizdiğin line'ı Free et.
TLine(FList[1]).Free;
Flist[1].Delete; gibi,
sonra FList içindeki bütün objeleri bir döngü içinde yeniden çizdir.
Image1.Clear;
for I:= 0 to Flist.count do
Flist.Repaint;
gibi..Bu şekilde çizdirdiğin şeyleri diske kaydedip yeniden yükleme imkanın da olmuş olur. AutoCAD gibin..

Canvas->Pen->Mode=pmXor;
veya
Canvas->Pen->Mode=pmNotXor;
yaptıktan sonra çizdirdiğiniz çizgi ikinci defa çizdiğinizde çizgi kalkar
bir önceki koordinatı saklayıp önce bir önceki koordinatta bunu çizip
yani eski çigileri silip sonra yeni koordinatta yeni çizgileri çiz ve bu koordinatı eski koordinat olarak sakla
veya
Canvas->Pen->Mode=pmNotXor;
yaptıktan sonra çizdirdiğiniz çizgi ikinci defa çizdiğinizde çizgi kalkar
Kod: Tümünü seç
Form1->Canvas->Pen->Style=psDot;
Form1->Canvas->Pen->Mode=pmXor;
Form1->Canvas->MoveTo(0,y0);
Form1->Canvas->LineTo(Form1->Width,y0);
Form1->Canvas->MoveTo(x0,0);
Form1->Canvas->LineTo(x0,Form1->Height);
yani eski çigileri silip sonra yeni koordinatta yeni çizgileri çiz ve bu koordinatı eski koordinat olarak sakla
TLine = class
private
FX, FY, FX1, FY1: Integer;
public
constructor Create(const X, Y, X1, Y1: Integer); // verilen koordinata çizgi çizer
procedure Repaint; // Koordinatlardaki çizgiyi yeniden çizer.
end;
bu kodla bir sınıf oluşturmaya çalışıyorum, constructor ile başlayan satır için bu hatayı alıyorum.
[Error] Unit3.pas(30): Unsatisfied forward or external declaration: 'TLine.Create'
private
FX, FY, FX1, FY1: Integer;
public
constructor Create(const X, Y, X1, Y1: Integer); // verilen koordinata çizgi çizer
procedure Repaint; // Koordinatlardaki çizgiyi yeniden çizer.
end;
bu kodla bir sınıf oluşturmaya çalışıyorum, constructor ile başlayan satır için bu hatayı alıyorum.
[Error] Unit3.pas(30): Unsatisfied forward or external declaration: 'TLine.Create'