Linie über das Bild

Anin

Grünschnabel
Hallo, Leute. Ich brauche dringend Ihre Hilfe.
Eine MDI-Anwendung.In neuem Fenster wird ein Bild
geladen und über dieses Bild soll eine Kurve
gezeichnet werden. Bild ist ziemlich groß.
Deshalb ich habe den VScrollView benutze.
Eigentlich alles funktioniert, aber überhaupt nicht so,
wie ich es wollte. Kurve, die gezeichnet wird
über Bild, ist auch sehr Gross. Um Sie zusehen
muss auch geschrollt werden. Und hier kommt das Problem.
Sobald ich Fenstergröße geändere, pasiert alles,
wie ich es wollte. Aber wenn ich klicke auf
den Pfeil des Schrollleiste,Bild schrollt aber Linie sofort verschwindet.
Wenn ich schreibe:


pDoc->UpdateAllViews(NULL);


Linie bleibt, aber das Fenster fackelt
wie verrückt. Hier ist meine Code.
Bestimmt gibt's andere Lösung für dieses Problem.
Ich kenn ihn aber nicht. Und wäre dankbar für jeder Hilfe.

P.S. Um Bilde zu anzeigen, ich benutze CImage.



--------------------------------------------------------------------------------
Code:
oid CKurierView::OnDraw(CDC* pDC)
{
CKurierDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CPoint pos(GetScrollPosition());
CRect rect;
GetClientRect(&rect);
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;

if (pDoc->GetImage())
{
int x = -pos.x;
int y = -pos.y;
if (width >= pDoc->GetImage()->GetWidth())
x = (width - pDoc->GetImage()->GetWidth())/2;
if (height >= pDoc->GetImage()->GetHeight())
y = (height - pDoc->GetImage()->GetHeight())/2;

CDC *dc = GetDC();
CPalette *hOldPal = 0;
if (pDoc->GetImage()->GetPalette())
{
hOldPal = dc->SelectPalette(pDoc->GetImage()->GetPalette(), TRUE);
dc->RealizePalette();
}

if (pDoc->GetStretchMode())
{
SetScrollSizes(MM_TEXT,
CSize(0,0));
pDoc->GetImage()->Stretch(dc, 0, 0, width, height);
}
else
{
SetScrollSizes(MM_TEXT,
CSize(pDoc->GetImage()->GetWidth(), pDoc->GetImage()->GetHeight()));
pDoc->GetImage()->Draw(dc, x, y);

//Linie zeichnen
CPoint Erste, Zweite;
Erste.x = 70; Erste.y = 360;
Zweite.x = 300; Zweite.y = 460;
DrawLine(pDC,Erste ,Zweite);
pDoc->UpdateAllViews(NULL);
} 

dc->SelectPalette(hOldPal, TRUE);

ReleaseDC(dc);
}
// TODO: Code zum Zeichnen der systemeigenen Daten hinzufügen 

}

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void CKurierView::DrawLine(CDC * pDC, CPoint pStart, CPoint pEnd)
{
CRect lRect;
GetClientRect(lRect);
lRect.NormalizeRect();
CPen lSolidPen (PS_SOLID, 3, RGB(0,0,0));
CPen *pOldPen;
pOldPen = pDC->SelectObject(&lSolidPen); 

pDC->MoveTo(pStart );
pDC->LineTo(pEnd);

pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
 
Kannst du mal dein Projekt posten? In kompilierbarer Form? Vielleicht komme ich dann dahinter, woran genau es liegt.
 
Also, ich habe die exe-Dateien gezipt.
Ganzes Project in minimale Form hat 20 MB.
Nur bitte unter "C:\" die eine .jpg anlegen mit
Name "Kl_1.jpg".
 

Anhänge

  • project1.zip
    143,2 KB · Aufrufe: 19
Da hast du mich falsch verstanden. Ich meinte "kompilierbar", nicht "kompiliert". Ohne Sourcen kann ich auch nur raten.
 
Hab's nicht runtergeladen, aber etwas gesehen:

Nimm um Himmels Willen das pDoc->UpdateAllViews(NULL); aus dem OnDraw-Handler raus! Deine Anwendung zeichnet ohne Ende so schnell wie möglich immer wieder den View neu.

Das Flackern kommt, weil du direkt auf die Fläche zeichnest, hier empfehle ich Double Buffering (einfach danach suchen). Den zweiten Puffer aber nur so gross wie den View machen.
 
Code:
Kurve, die gezeichnet wird 
über Bild, ist auch sehr Gross. Um Sie zusehen
muss auch geschrollt werden. Und hier kommt das Problem.
Sobald ich Fenstergröße geändere, pasiert alles,
wie ich es wollte. Aber wenn ich klicke auf 
den Pfeil des Schrollleiste,Bild schrollt aber Linie sofort verschwindet
MitUpdateAllView wollte ich nur anzeigen, wie soll es bei mir funktioniert.
Nicht, das ich will es auf dauer einsetzen.
 
Zurück