Bitmap und Text gleichzeitig im Hauptrahmenfenster darstellen
-
Hallo!
Ich hab ein Problem eine Bitmap und einen Text gleichzeitig im Hauptrahmenfenster darzustellen. Die Bitmap hab ich in der OnDraw Methode geladen und den Text in der OnPaint Methode. Die Bitmap ist aber nur sichtbar wenn die OnPaint nicht existiert.
Hier der Code der beiden Methoden:
void CSpulenberechnungView::OnBmpLoad() { bitmap=TRUE; Invalidate(); } void CSpulenberechnungView::OnUpdateBmpLoad(CCmdUI* pCmdUI) { pCmdUI->SetCheck(!bitmap); } void CSpulenberechnungView::OnBmpClose() { bitmap=FALSE; Invalidate(); } void CSpulenberechnungView::OnUpdateBmpClose(CCmdUI* pCmdUI) { pCmdUI->SetCheck(bitmap); } void CSpulenberechnungView::OnDraw(CDC* pDC) { CSpulenberechnungDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen CDC memo; RECT rect; BITMAP BP; CBitmap m_bitmap; GetClientRect(&rect); if(bitmap) { m_bitmap.LoadBitmap(IDB_WALD); m_bitmap.GetObject(sizeof(BP),&BP); int orgweite=BP.bmWidth; int orghoehe=BP.bmHeight; memo.CreateCompatibleDC(NULL); memo.SelectObject(&m_bitmap); pDC->BitBlt( 100, 100, 200, 200, &memo, 0, 0, SRCCOPY ); DeleteObject(&BP); } } void CSpulenberechnungView::OnPaint() { CPaintDC dc(this); CRect rcClient; GetClientRect(rcClient); COLORREF clrOldTextColor; int nOldBkMode = dc.SetBkColor(RGB(255,255,255)); if(bitmap==FALSE) { clrOldTextColor = dc.SetTextColor(RGB(0,0,0)); dc.DrawText(erg,rcClient,DT_SINGLELINE|DT_CENTER|DT_VCENTER); dc.SetTextColor(clrOldTextColor); dc.SetBkMode(nOldBkMode); } }Ich hab den Code für die Bitmap von einer Tutorial Seite. Dort stand, dass die Bitmap nur sichtbar ist, wenn kein anderes Bild auf dem Hauptrahmenfenster ist.
Gibt es eine Möglichkeit den Text und die Bitmap gleichzeitig abzubilden?
-
Na ja, das hängt wohl von deiner Variable "bitmap" ab. In OnDraw zeigst du dein Bitmap ja nur an, wenn bitmap TRUE ist. Im Gegenzug zeichnest du den Text in OnPaint nur, wenn bitmap FALSE ist. Das schließt sich also aus. Ändere die Bedingung und es sollte klappen.
Wieso verwendest du eigentlich OnDraw und OnPaint? Ich kenne mich mit der Doc/View-Architektur nicht so gut aus, deshalb weiß ich nicht, ob das vielleicht einen bestimmten Grund hat. Spontan würde ich aber eher sagen, dass du dir eine der beiden Methoden sparen kannst. Wenn also nichts dagegen spricht, dann zeichne sowohl Bitmap als auch Text in einer Methode.
Übrigens musst du nicht jedesmal LoadBitmap in OnDraw aufrufen (was ja dann sehr häufig passiert). Besser ist es, LoadBitmap einmal am Anfang aufzurufen (z.b. OnInitDialog). Du hast ja schon richtigerweise zu diesem Zweck eine Member-Variable angelegt, so dass die Bitmap-Daten erhalten bleiben und in OnPaint immer zur Verfügung stehen.
-
Moment!
Ich sehe gerade, dass du mit m_bitmap eben keine Member-Variable erzeugst (was der Präfix 'm_' ja eigentlich andeutet). Stattdessen erzeugst du die Variable lokal in OnDraw.
Deklariere m_bitmap besser innerhalb deiner Klasse (im Header), lade das Bitmap einmal (z.B. OnInitDialog) und nutze es dann wie gewohnt in OnDraw/OnPaint.
m_ = Member-Variable (Element deiner Klasse)
g_ = globale Variable
l_ = lokale VariableDu solltest dir angewöhnen, "sprechende" Variablennamen zu vergeben. Dann kannst du (und vor allem auch andere) auch in 10 Jahren noch auf Anhieb erkennen, womit du es zu tun hast. Also z.B.:
g_iZahl (globale Integer-Variable)
l_sText (lokale String-Variable)
m_bWahr (boolesche Member-Variable)Ich persönlich lasse das 'l_' weg (ist sie kein Member und keine globale Variable, dann muss sie lokal sein). Das ist aber Geschmackssache.
Gruß Matze
-
Danke für deine Antwort.
Ich hab jetzt probiert die Bitmap in der OnPaint() zu laden, aber ich bekomme jetzt einen Fehlerbericht wenn das Fenster neu gezeichnet werden soll. Ich musste CDC *pDC in OnPaint verwenden. Hat es damit zu tun?
Die if Anweisung hab ich auch beseitigt.Gruß
Reptile100