BitBlt/Transparent nur bei OnSize



  • Hi,

    hab einen Dialog mit Reiterfunktion (Unterdialoge je Reiter)
    In den Unterdialogen möchte ich teilweise auf das DC BMPs malen. Leider funktioniert das weder durch die Verwendung der Funktionen in OnitDialog noch in public Funktionen die durch das Select des Tabs von der Main Klasse aufgerufen werden.

    Ich habe den Code

    // Draw the rectangles
    		m_lClientDC->FillSolidRect(	ACQ_DLG_C0_S_BMP_POS_X, ACQ_DLG_C0_S_BMP_POS_Y, ACQ_DLG_S_BMP_SIZE, ACQ_DLG_S_BMP_SIZE,
    									::GetSysColor( COLOR_3DFACE ) );
    		m_lClientDC->BitBlt(	ACQ_DLG_C0_S_BMP_POS_X, ACQ_DLG_C0_S_BMP_POS_Y, ACQ_DLG_S_BMP_SIZE, ACQ_DLG_S_BMP_SIZE, 
    								&m_lBitmapDC[m_chs.nCameraStatus[CAM_LEFT]], 
    								0, 0, SRCCOPY );
    
    		m_lClientDC->FillSolidRect(	ACQ_DLG_C1_S_BMP_POS_X, ACQ_DLG_C1_S_BMP_POS_Y, ACQ_DLG_S_BMP_SIZE, ACQ_DLG_S_BMP_SIZE, 
    									::GetSysColor( COLOR_3DFACE ) );
    		m_lClientDC->TransparentBlt(	ACQ_DLG_C1_S_BMP_POS_X, ACQ_DLG_C1_S_BMP_POS_Y, ACQ_DLG_S_BMP_SIZE, ACQ_DLG_S_BMP_SIZE, 
    										&m_lBitmapDC[m_chs.nCameraStatus[CAM_RIGHT]], 
    										0, 0, ACQ_DLG_S_BMP_SIZE, ACQ_DLG_S_BMP_SIZE, 
    										RGB( 0xFF, 0xFF, 0xFF ) );
    

    dann einfach mal ins OnSize des Dialogs gehauen und ein wenig resized. Dann werden die 2 Rechtecke angezeigt.
    Ist der selbe Code im OnInitDialog sehe ich die Rechtecke nicht. Auch nicht, wie gesagt, wenn ich ihn in einer public habe, die durch die Mainklasse aufgerufen wird.

    Weiterhin im OnInitDialog fürs DC, etc.... :

    m_lClientDC = new CClientDC( this );
    
       ...
    	m_lBitmapDC[i].CreateCompatibleDC( m_lClientDC ); 
       ...
    
    	fori( ACQ_DLG_CAM_STATUS_COUNT )
    		VERIFY( m_bmpCameraStatus[i].LoadBitmapA( m_nCameraStatesBitmaps[i] ) );
    
       ...
    
    		m_lBitmapDC[i].SelectObject( m_bmpCameraStatus[i] );
       ...
    

    Ich nehme mal an das durch das Ausblenden des Unterdialogs, in dem die BMPs sind irgendwas mit dem DC passiert

    ShowWindow(SW_SHOW/SW_HIDE)
    

    .



  • Hallo Jöran,

    Du kannst nur in OnPaint malen. OnPaint ist der Message Hander für die Nachricht WM_PAINT.

    Alles was Du ausserhalb von OnPaint auf den DC malst wird vom nächsten UpdateWindow übermalt.

    Herzliche Grüsse
    Walter



  • und vor allem zeichnet man NIE mit dem ClientDC, dafür gibt es in der OnPaint den PaintDC der zum zeichnen genutzt wird.
    Zu beachten ist noch das du die OnPaint der Klasse des jeweiligen Unterdialoges zum Zeichnen benutzen musst, sonst geht das auch wieder schief.

    Wenn du den Rat meines Vorposters und meinen befolgst sollte auch dein Bild zu sehen sein



  • Ich danke Euch!

    Eine Frage noch: Ihr habt ja gesehen, dass so eine Art Status Bmps gemalt werden. Ich denke, ich werde diese mit einem Timer überprüfen oder eben beim Event aktualisieren. Sollte ich dann jedesmal OnPaint aufrufen?

    VG,
    Jöran



  • Hallo Jöran,

    Nein! Du darfst OnPaint nicht aufrufen! Nur Windows darf OnPaint aufrufen!

    Du musst OnPaint überschreiben und das malen in OnPaint machen. Schau Dir im MSDN die Dokumentation zu OnPaint an.

    Herzliche Grüsse
    Walter


  • Mod

    Um das Zeichnen zu erzwingen gibt es Invalidate/InvalidateRect


Anmelden zum Antworten