Memory Device Context

Danke Andrea, das mit dem Memory Device Context.

Aber in deinem Quellcode will ich an der Stelle mit deinem Kommentar „/////Zeichnen“ lediglich eine einzige Linie ziehen.
Es tut aber nicht.

Meine andere Frage ist:
Hat irgend jemand einen Algorithmus um Objekte in einem 24-Bit-RGB-Bitmap zu segmentieren? Bin für jede Hilfe dankbar.
*handschüttel&schulterklopf*

Hier ist mal mein Quellcode fuer das dämliche zeichnen in einen Memory Device Context:

void CPictureViewerDlg::open_mouth:nButtonSchaerfen()
{
// TODO: Add your control notification handler code here
if( m_bmpQuelle.m_hObject == NULL || m_bmpZiel.m_hObject == NULL )
return;
CDC *dc = GetDC();
BITMAP info;
m_bmpZiel.GetBitmap( &info );
CDC memDCZiel;
memDCZiel.CreateCompatibleDC( dc );
CBitmap *oldbmpziel = memDCZiel.SelectObject( &m_bmpZiel );
// paint in the memory device context
// this will not be done!!!
CPen newpen;
newpen.CreatePen( PS_SOLID, 5, RGB( 0, 255, 0 ) );
CPen *oldpen = memDCZiel.SelectObject( &newpen );
memDCZiel.MoveTo( 0, 100 );
memDCZiel.LineTo( 100, 100 );
dc->BitBlt( m_rectZiel.left, m_rectZiel.top, info.bmWidth, info.bmHeight, &memDCZiel, 0, 0, SRCCOPY );
memDCZiel.SelectObject( oldpen );
// draw direct on the screen
// this works
oldpen = dc->SelectObject( &newpen );
dc->MoveTo( 0, 100 );
dc->LineTo( 100, 100 );
dc->SelectObject( oldpen );
memDCZiel.SelectObject( oldbmpziel );
memDCZiel.DeleteDC();
return;
}

Ich bin mir nicht sicher, aber ich denke es könnte am folgenden Problem liegen:

Wenn du erst in den Speicherkontext zeichnest, und das in den Gerätekontext kopierst meint Windows es müßte gar nichts tun. Es heißt noch lange nicht, daß wenn Du was in dc schreibst das auch auf dem Bildschirm steht.
Wenn Du dagegen direkt in den dc schreibst, dann merkt Windows, daß sich auch was auf dem Bildschirm tun muß.
Das ist zwar nur eine Vermutung, aber ich habe festgestellt, daß das mit dem Speicherkontext und allgemein Grafik sehr suspekt ist. Ich habe mir angewöhnt alle Zeichenaktionen in der ::open_mouth:nDraw Methode durchzuführen. Wenn ich dann doch mal von außerhalb was malen muß, dann steuer ich das über ein paar Flags, und rufe dann mit Hilfe von Invalidate(TRUE/FALSE) und UpdateWindow() die OnDraw-Methode auf. Damit hatte ich zwar auch immer mal wieder Probleme, aber die sind eigentlich alle lösbar.
Mit dem Invalidate und dem UpdateWindow mußt Du einfach mal alle kombinationen ausprobieren. Es gibt dann immer eine Variante, bei der das Bild am wenigsten flackert.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]