Hintergrundbild im Dialog zentrieren
-
@link: ok das sieht nicht schlecht aus.
BOOL CMdiClient::OnEraseBkgnd(CDC* pDC) { CRect rect; GetClientRect(&rect); if (m_nBackColor != CLR_INVALID) pDC->FillSolidRect(&rect, m_nBackColor); else if (m_pBmp != NULL) { BITMAP bm; CDC dcMem; VERIFY(m_pBmp->GetObject(sizeof(BITMAP), (LPVOID)&bm)); dcMem.CreateCompatibleDC(NULL); CBitmap* pOldBitmap = dcMem.SelectObject(m_pBmp); for (register int nX = 0; nX < rect.Width(); nX += bm.bmWidth) for (register int nY = 0; nY < rect.Height(); nY += bm.bmHeight) pDC->BitBlt(nX, nY, bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBitmap); } else CWnd::OnEraseBkgnd(pDC); return TRUE; }
-
sorry..
#include "stdafx.h" #include "MdiClient.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CMdiClient::CMdiClient() { m_pBmp = NULL; m_nBackColor = CLR_INVALID; } CMdiClient::~CMdiClient() { if (m_pBmp) { m_pBmp->DeleteObject(); delete m_pBmp; m_pBmp = NULL; } } IMPLEMENT_DYNCREATE(CMdiClient, CWnd) BEGIN_MESSAGE_MAP(CMdiClient, CWnd) //{{AFX_MSG_MAP(CMdiClient) ON_WM_ERASEBKGND() ON_WM_SIZE() ON_WM_GETMINMAXINFO() //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CMdiClient::OnEraseBkgnd(CDC* pDC) { CRect rect; GetClientRect(&rect); if (m_nBackColor != CLR_INVALID) pDC->FillSolidRect(&rect, m_nBackColor); else if (m_pBmp != NULL) { BITMAP bm; CDC dcMem; VERIFY(m_pBmp->GetObject(sizeof(BITMAP), (LPVOID)&bm)); dcMem.CreateCompatibleDC(NULL); CBitmap* pOldBitmap = dcMem.SelectObject(m_pBmp); for (register int nX = 0; nX < rect.Width(); nX += bm.bmWidth) for (register int nY = 0; nY < rect.Height(); nY += bm.bmHeight) pDC->BitBlt(nX, nY, bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBitmap); } else CWnd::OnEraseBkgnd(pDC); return TRUE; } COLORREF CMdiClient::SetBackColor(COLORREF nBackColor) { LockWindowUpdate(); COLORREF cr = m_nBackColor; m_nBackColor = nBackColor; UnlockWindowUpdate(); return cr; } BOOL CMdiClient::SetBitmap(UINT nID) { BOOL bResult = true; LockWindowUpdate(); if (m_pBmp) { m_pBmp->DeleteObject(); delete m_pBmp; m_pBmp = NULL; } m_pBmp = new CBitmap(); bResult = m_pBmp->LoadBitmap(nID); UnlockWindowUpdate(); return bResult; } void CMdiClient::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); if (m_pBmp != NULL) Invalidate(); } void CMdiClient::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen CWnd::OnGetMinMaxInfo(lpMMI); }
-
MdiClient.h ist der 5. Beitrag.
-
for (register int nX = 0; nX < rect.Width(); nX += bm.bmWidth) for (register int nY = 0; nY < rect.Height(); nY += bm.bmHeight) pDC->BitBlt(nX, nY, bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY);
Das musst du ändern. Und zwar so, dass das Bild nur einmal (Schleifen weg) und zentriert (Parameter in der MSDN angucken) gezeichnet wird.
-
Jau, das war richtig. Du solltest dich aber erstmal selber daran versuchen um zu lernen
CBitmap* pOldBitmap = dcMem.SelectObject(m_pBmp); pDC->BitBlt(Formel1, Formel2, bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBitmap);
Bei Formel1 und Formel2 muß du eben die Mitten berechnen mit Hilfe des rect's
-
bingo!
Danke jetzt seh' ich's auch!!!! DANKE!!!!
Gibt es einen solchen Parameter zum zentrieren. Der ursprüngliche Entwickler meinte das sein nicht möglich. Gut möglich ist alles... aber wie... Auf alle Fälle Danke! Ich guck mal nach!
-
Natürlich geht das, sogar recht einfach! Ich will dir das hier aber nicht sagen, weil du auch selber denken sollst
-
Danke, für alles!!!
-
also ich hab das nun so reingetippt,a ber nun stürtz mir mein fenster ab, bzw zuvor bleibt es noch tranparent. Hab ich was falsch gemacht Breite und Länge holen, erechnen. Sollte doch gehen oder?
/*CBitmap* pOldBitmap = dcMem.SelectObject(m_pBmp); for (register int nX = 0; nX < rect.Width(); nX += bm.bmWidth) for (register int nY = 0; nY < rect.Height(); nY += bm.bmHeight) pDC->BitBlt(nX, nY, bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBitmap); */ CBitmap* pOldBitmap = dcMem.SelectObject(m_pBmp); pDC->BitBlt(0.5*rect.Width(),0.5*rect.Height(), bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBitmap);
-
Die Formel ist noch nicht vollständig, du muss noch die Höhe und Breite des Bildes beachten. Aber abstürtzen dürfte es trotzdem nicht.
-
Achso, es stürzt wahrscheinlich nicht ab, bestimmt ist nur alles verschommen oder? Wenn das so ist, dann setze mit SetBackColor eine Hintergrundfarbe.
-
es bleibt transparent, ausser der Toobar und dem Main Menug seh ich durch.
Aber selbst wenn es falsch positioniert ist, sollte ich doch was sehen, oder?!
-
SetBackColor
-
ja das ist mit SetBackColor funktioniert schon, aber warum seh ich nichteinmal ansatzweiese bitmap? Das verstehe ich nicht ganz.
-
Siehst du so was?
pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY);
-
Achso, hab schon gerafft. Es ist so programmiert das entweder die Hintergrundfarbe ODER das Bitmap gezeichnet wird.
Das
pDC->FillSolidRect(&rect, m_nBackColor);
muss noch vor das Bitmap BitBlt
-
Und diese Abfrage rausnehmen:
if (m_nBackColor != CLR_INVALID)
pDC->FillSolidRect(&rect, m_nBackColor);
else
-
Hab das ganze gelöst, der Fehler war ganz wo anders, nämlich dort am Anfang, die Routine ist ganz io! Vielen Dank an Euch alle.
Tja und der Urspürngliche entwickler meinte aufgrund von Windwos sei das zentrieren es Bildes unmgölich... hehehe dabei war es nur eine Formeln!
VIELEN DANK!!!!
Sieht nun wunderschön aus. Ist auch idiotisch das CI 8 Mal zu wiederholen! grins