Sadece ImgView32'deki bir katmana dikey noktalı kalın çizgi çizmek istiyorum. Ayrıca, satırımın kalın olmasını istiyorum, böylece Canvas.Pen.Width'in LineTo yöntemleri üzerinde bir etkisi olmadığından, birbirine yakın çok çizgi çiziyorum. ImgView32 katmanında kalın noktalı çizgi çizimi
procedure TMainForm.PaintDottedHandler(Sender: TObject;Buffer: TBitmap32);
var
Cx, Cy,raza: Single;
W2, H2: Single;
I,J: Integer;
points:TArrayOfFloatPoint;
Center, Radius:TFloatPoint;
const
CScale = 1/200;
begin
if Sender is TPositionedLayer then
with TPositionedLayer(Sender).GetAdjustedLocation do
begin
W2 := (Right - Left) * 0.5;
H2 := (Bottom - Top) * 0.5;
Cx := Left + W2;
Cy := Top + H2;
W2 := W2 * CScale;
H2 := H2 * CScale;
Buffer.PenColor := clRed32;
Buffer.MoveToF(Cx-2,Top);
Buffer.LineToFSP(Cx-2 , Bottom);
Buffer.MoveToF(Cx-1,Top);
Buffer.LineToFSP(Cx-1 , Bottom);
Buffer.MoveToF(Cx,Top);
Buffer.LineToFSP(Cx , Bottom);
Buffer.MoveToF(Cx+1,Top);
Buffer.LineToFSP(Cx+1 , Bottom);
Buffer.MoveToF(Cx+2,Top);
Buffer.LineToFSP(Cx+2 , Bottom);
end;
end;
Yani çizgi amaçlanmaktadır
yeni tabakasının ortasında yerleştirilmek üzere şu şekildedir: Yani benim kodudur. Sadece Katmanlar Örneğin benim kodu ekleyin kod kalanı içinprocedure TMainForm.DottedLine1Click(Sender: TObject);
var
L: TPositionedLayer;
begin
L := CreatePositionedLayer;
L.OnPaint := PaintDottedHandler;
L.Tag := 2;
Selection := L;
end;
ve sen benim sorunu yeniden mümkün olacak: Bu kullanarak katman ekleyin.
Okuduğum kadarıyla noktalı bir çizgi çizmek için, LineToFSP ile Stipple (kodumda kullanılır) veya BuildDashedLine noktaları olan PolyPolygonFS gibi birden çok yazıcı vardır. Fakat hiçbirinin dürüstçe çalışmasını sağlayamıyorum. Aslında ikinci yaklaşım bir şey yapmıyor ... bu yüzden ilk yaklaşımımı sürdürüyorum. Bu yüzden bir çizgi çizmeye başladığı her sefer, noktalı çizginin başladığı şekilde rastgele görünüyor. Yani ya bir piksel ya da boş bir. Ben katmanı yeniden boyutlandırmak zaman Yani çizgi izleyen görüntülerde gibi dönüştürür:
:
Ve aslında ben başarmak isteyen tüm şudur
Ve tabiki çarpmadan katmanı yeniden boyutlandırırken çizginin tekrar çizilmesini istiyorum (bu yüzden onPain'i kullanıyorum) t işleyici yaklaşımı. Bir katmana (Bitmap.Canvas kullanarak) basit bir çizgi çizip katmanı yeniden boyutlandırırsam, çizgi bir jpeg'i germek gibi çarpıtılır, bundan kaçınmak isterim.
Peki nasıl çalışması yapılmış cevaplar kodu denedikten sonra ImgView32 (TGraphics32) bir katman üzerinde
DÜZENLEME
kalın noktalı çizgi çizmek için söyle lütfen. Bununla birlikte, bu tabakanın bir yan etki vardır: bir katman (fare kullanarak) yeniden boyutlandırma, bazı genişliklerinde noktalı çizgi rengi soluk ve körük gibi bulanık:
bazen (boyutlandırma sonra boyutlandırma önce).
Kendinizi aynı kodu kullanarak yeniden oluşturabilirsiniz.
DÜZENLEME
bu özel tabaka ile başka sorun var: o dosyaya kaydediliyor ... ben 2 yaklaşımlar kullanılarak şeffaf PNG olarak kaydedin çalıştım ama bozuk bir dosyayı almaya devam. Katmanı Bitmap olarak kaydetmeye çalışsa bile aynı bozulma oluşur.de bu soruyu göz atın:
Graphics32 - saving transparent drawing layer to png
Sadece vahşi bir tahmin, ancak MoveToF ve LineToFSP'nizde, Üst ve Alttan ziyade Cy koordinatlarını kullanırdım. –
Cy, çember çizdiğim başka bir işleyicideki değişkendir ve bunu, katmanın ortasındaki koordinatları almak için kullandım. Yani (Cx, Cy) ve katmanın merkez noktası. Cy kullanmak yukarıda açıklanan problemimle nasıl yardımcı olur? – user1137313
Tekerleği yeniden icat ediyorsun. Mükemmel GR32_Lines uzantısını kullanmalısınız. –