CMemDC m_hDC ist NULL?



  • Hallo,

    ich hab hier ein Problem und hoffe ihr könnt mir helfen.

    Ich habe ein MDI Programm, und möchte im Menü einen Dialog öffnen, in dem in einem Rechteck dann Grafiken angezeigt werden.
    Nun hängt sich der Dialog in der OnPaint() Funktion auf.

    Hier mal der Code:

    ...
    	CPaintDC dc(this); // device context for painting
    
    	CMemDC dialogMemDC(signalDC, signalBoundary);
    
    	dialogMemDC.SelectObject ( &paintBrush );
    	dialogMemDC.Rectangle(signalBoundary);
    ...
    

    signalBoundary ist das Rechteck in dem gezeichnet werden soll (CRect)
    signalDC ist der Device Context (CDC)

    in der Zeile CMemDC ... hängt er sich dann auf, und durch debuggen bin ich nicht auf nützliche Informationen gestoßen.
    An folgender Stelle kommt es dann immer zum Problem:

    _AFXWIN_INLINE CBitmap* CDC::SelectObject(CBitmap* pBitmap)
    	{ ASSERT(m_hDC != NULL); return (CBitmap*) SelectGdiObject(m_hDC, pBitmap->GetSafeHandle()); }
    

    m_hDC ist immer unused.

    Ich muss dazu sagen, ich habe den Code aus einem Dialogbasiertem Programm kopiert, da hat es funktioniert, aber ich möchte das gerne in einem MDI Programm einbinden.

    Ich hoffe jemand kann mir helfen oder Anregungen geben.

    Danke

    Billy



  • Wo kommt den signalDC her? Müsstest Du dialogMemDC nicht stattdessen mit dc initialisieren?



  • Danke ür die Antwort

    also das dc kan ich nicht nehmen weil die Funktion von CMemDC dialogMemDC()
    kein CPaintDC sondern CDC* haben möchte.
    Und das signalDC ist eine Membervariable von der Dialogklasse und wird beim initialisieren des Dialogs festgelegt:

    m_SignatureFrame.GetClientRect(signalBoundary);
    signalDC = m_SignatureFrame.GetDC();
    

    m_SignatureFrame ist ein CStatic
    und signalBoundary das CRect
    beides Member des Dialogs

    Danke für eure Hilfe

    Billy


  • Mod

    Flicker schrieb:

    also das dc kan ich nicht nehmen weil die Funktion von CMemDC dialogMemDC()
    kein CPaintDC sondern CDC* haben möchte.

    Dann übergib eben den Zeiger!
    Mach Dich doch ertsmal bitt e etwas mit C++ bekannt!

    Das besorgen dieser DCs in Deinem OnPaint Handler ist Blödfug.

    CPaintDC dc(this); // device context for painting
        CMemDC dialogMemDC(&dc);
    
        dialogMemDC.SelectObject ( &paintBrush );
        dialogMemDC.Rectangle(signalBoundary);
    


  • Das hab ich ja auch schon versucht.

    Da kommt eine Fehlermeldung:

    error C2664: 'CMemDC::CMemDC(const CMemDC &)' : cannot convert parameter 1 from 'CPaintDC *__w64 ' to 'const CMemDC &'
    1> Reason: cannot convert from 'CPaintDC *__w64 ' to 'const CMemDC'

    Billy


Anmelden zum Antworten