dialog neu zeichnen mit hintergrundbild
-
Hy,
ich habe das Problem , dass das Neuzeichen des Hintergundbildes mir die Steuerelemente(gruppenfelder usw.) übermalt.
CRect cr; GetWindowRect(cr); CClientDC dc(this); CBitmap bitmap; CDC dcMemory; bitmap.LoadBitmap(IDB_BITMAP1); dcMemory.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = dcMemory.SelectObject(&bitmap); dc.PatBlt(cr.left , cr.top , cr.Width() ,cr.Height() , PATCOPY); dc.SetStretchBltMode(COLORONCOLOR); dc.StretchBlt(0,0,cr.right - cr.left ,cr.bottom - cr.top ,&dcMemory,0,0,256,256,SRCCOPY);//SRCAND SRCCOPY dc.SelectObject(pOldBitmap);Wie erreiche ich ,dass die Steuerelemente oben liegen , wenn OnPaint aufgerufen wird ?
-
Servus,
rufe einfach vor deinem Code die Methode CDialog::OnPaint() auf:
Bsp:
void CDeinDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext zum Zeichnen SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Symbol in Clientrechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); CRect cr; GetWindowRect(cr); CClientDC dc(this); CBitmap bitmap; CDC dcMemory; bitmap.LoadBitmap(IDB_BITMAP1); dcMemory.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = dcMemory.SelectObject(&bitmap); dc.PatBlt(cr.left , cr.top , cr.Width() ,cr.Height() , PATCOPY); dc.SetStretchBltMode(COLORONCOLOR); dc.StretchBlt(0,0,cr.right - cr.left ,cr.bottom - cr.top ,&dcMemory,0,0,256,256,SRCCOPY);//SRCAND SRCCOPY dc.SelectObject(pOldBitmap); } }Sollte (eigentlich
) funzen..*winke*
Hellsgore
-
Also bei mir war das Zauberwort der OnEraseBkgnd Event:
statt IDB_BITMAP4 setzt du einfach deine Resource ein ....
durch den Event kann man auch das Fenster mal überlappen lassen.BOOL CGameSelect::OnEraseBkgnd(CDC* pDC)
{
// TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein, und/oder benutzen Sie den Standard.CDC* pDC2 = GetDC();
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP4);
CDC dc2;
CRect rect;
GetClientRect(rect);
BITMAP bm;
bitmap.GetBitmap(&bm);
dc2.CreateCompatibleDC(pDC2);
dc2.SelectObject(bitmap);
pDC->StretchBlt(0,0,rect.Width(), rect.Height(),&dc2,0,0, bm.bmWidth, bm.bmHeight, SRCCOPY);
// und hier ein code um ein Bitmap auf einen Button zu bekommen ...
bitmap.DeleteObject();
bitmap.LoadBitmap(IDB_deineBitmapResource);
m_button.SetBitmap(bitmap);//return CDialog::OnEraseBkgnd(pDC);
return 1;
}
-
Erstmal danke für die Anworten ..
@Hellsgore : das habe ich ja auch probiert .. war eben ein Misserfolg(sollte eben nur rein theoretisch funzen..)@thenoname: Was mache ich wenn ich nicht WM_ERASEBKGND im klassenAssitent aufrufen kann und somit nicht OnEraseBkgnd() ?
Ich benutze eine Dialogbasierte Anwendung .
-
Ja, das ist Dialogbasierend.
Gehe mit Rechtsklick auf deinen kompletten Dialog und schau in den Eigenschaften
das Dingen neben dem Blitz an (Meldungen). Da muss es sein !!
-
Hy ,
welche Eigenschaften meinst du ? Die Dialogeigenschaften ? und wo soll denn da ein Blitz sein (auf welcher Tabkarte-- es gibt dort keine Meldungen)? Die Nachrichten stehen doch Im Klassenassitent unter Nachrichtzuordnungstabellen(da ist es wie gesagt nicht vorhanden)
Ich benutze den VC++6..
(Manche dinge sind doch echt zum verzweifeln ..)