?
Die Zeilen in
void __fastcall TImagePaintScroller::MouseMove(Classes::TShiftState Shift, int X, int Y)
{
if (ControlAtPos(Point(X,Y),true)==FImage)
FImage->Canvas->MoveTo(PenPos.x,PenPos.y);
FPenPos=Point(float(X-FImage->Left) / Dimension->ImageZoom,float(Y-FImage->Top) / Dimension->ImageZoom);
( Bild-Viewer Probleme )
schienen ein wichtiger Hinweis zu sein. PenPos im OnMouseMove ständig in Abhängigkeit vom Zoomfaktor korrigieren. Hat in meinem Proggy leider genauso wenig geholfen wie ähnliche, aber nicht so klare Versuche.
// Image ist ein TImage
// SavePict ist Graphics::TBitmap
// int VergrFaktor ist der Vergrößerungsfaktor
void __fastcall TPixi::Zoom(TObject *Sender)
{
BRectCheck(Sender); // ggf. MarkRect entfernen
VergrFaktorChange(Sender); // Zoomfaktor-Steuerfunktion
Image->Width = SavePict->Width * VergrFaktor;
Image->Height = SavePict->Height * VergrFaktor;
//Image->Picture->Graphic->Width = Image->Width;
//Image->Picture->Graphic->Height = Image->Height;
Image->Canvas->StretchDraw(Image->ClientRect,SavePict);
FormResize(Sender); // TImagenach dem Zoomen in ScrollBox zentrieren
}
Die auskommentierten Zeilen sind trotz der im OnMouseMove eingefügten Ergänzung nötig, um wirklich an der Mausposition zu zeichnen und nicht in relativer Abweichung.
Hier noch der Weg im OnMouseMove des TImage:
if(Drawing)
{
Image->Canvas->Pen->Mode = pmNotXor; // XOR-Modus zum Zeichnen/Löschen verwenden.
// Diese Zeile
Image->Canvas->PenPos=Point(float(X-Image->Left) / VergrFaktor,
float(Y-Image->Top) / VergrFaktor);
// anstatt der auskommentierten
//Image->Canvas->MoveTo(Origin.x, Origin.y); // Stift auf Ausgangspunkt zurücksetzen.
...
}
Ein Weg, ggf. ohne Zuhilfenahme einer Speicherbitmap, aber auf jeden Fall sauber malen zu können, scheint also immer noch unentdeckbar. Zeigen sich ggf. schon Hinweise darauf, was ich noch oder anders zu tun hätte?