Hintergrundbild im Dialog zentrieren
-
die ganze code ist leider auch nicht von mir...
soll nur alles weiterführen...
-
ok, dann poste auch mal den Code aus der CPP-Datei, dann kann ich dir vielleicht weiterhelfen ...
-
du mußt da was in OnEraseBkgnd ändern. dort wird höchstwahrscheinlich das bitmap gezeichnet.
-
ok das vorhin war die MdiClient.h
wird nun hier incdluded, was wiederum ein header ist (MainFrm.h).
#if !defined(AFX_MAINFRM_H__D914BA84_C820_454E_B145_75844BF9304A__INCLUDED_) #define AFX_MAINFRM_H__D914BA84_C820_454E_B145_75844BF9304A__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "MdiClient.h" #include "ColorStatusBar.h" class CMainFrame : public CMDIFrameWnd { DECLARE_DYNAMIC(CMainFrame) public: CMainFrame(); // Attribute public: CToolBar * m_pwndFullScrnBar; // BOOL IsFullScreen(); WINDOWPLACEMENT m_wpPrev; CRect m_FullScreenWindowRect; // Operationen public: // Überladungen // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CMainFrame) public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext); //}}AFX_VIRTUAL // Implementierung public: bool IsFullScreen(); virtual ~CMainFrame(); CProgressCtrl m_Progress; CColorStatusBar m_wndStatusBar; BOOL m_bCreated; #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Eingebundene Elemente der Steuerleiste CToolBar m_wndToolBar; // Generierte Message-Map-Funktionen protected: bool m_bFullScreen; //{{AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnProjectOpen(); afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); afx_msg void OnDateiProjekteinstellungen(); afx_msg void OnDateiProjektspeichernunter(); afx_msg void OnButtonLock(); afx_msg void OnUpdateButtonKey(CCmdUI* pCmdUI); afx_msg void OnEinstellungenFarben(); afx_msg void OnUpdatePane (CCmdUI *pCmdUI); afx_msg void OnPrintLayout(); afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI); afx_msg void OnViewFullScreen(); afx_msg void OnUpdateViewFullScreen(CCmdUI* pCmdUI); afx_msg void OnAutosave(); afx_msg void OnUpdateAutosave(CCmdUI* pCmdUI); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: CMdiClient m_wndMdiClient; }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}}
dieser wird in dem cpp eingebunden. Ich hab jetzt nur den Auschnitt draus, weil es sonst zu lang wird.
#include "stdafx.h" #include "ProjectDialog.h" #include "ColorsDlg.h" #include "PrintLayoutDlg.h" #include "MainFrm.h" #include "ProjectData.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CProjectData m_ProjectData; ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_PROJECT_OPEN, OnProjectOpen) ON_WM_SHOWWINDOW() [...] BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (CMDIFrameWnd::OnCreateClient(lpcs, pContext)) { //m_wndMdiClient.SubclassWindow(m_hWndMDIClient); m_wndMdiClient.SetWindowStyle(m_wndMdiClient.GetWindowStyle()|SS_CENTERIMAGE); m_wndMdiClient.SetBitmap(IDB_BKGND | BS_CENTER); return TRUE; } else return FALSE; }
Ich weiss, kompliziert die ganze Sache, gibt es nichts was unabhängig in der mfc genutzt werden könnten?
-
Bringt alles nix, ich brauch die Funktionsdefinitionen der Klasse CMdiClient, also die Datei, in der der Code der Klasse steht!
-
@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);