Hintergrundbild im Dialog zentrieren



  • Hallo

    Kann ich in einem Dialogfeld das Hintergrundbild (bmp), welches ich eingesetzt habe, zentrieren? Bisher wird es einfach wiederholt, so dass es die ganze Fläche ausfüllt.

    //IDB_BKGND backround.bmp
            m_wndMdiClient.SubclassWindow(m_hWndMDIClient);
            m_wndMdiClient.SetBitmap(IDB_BKGND);
    

    Danke!



  • Versuch mal:
    m_wndMdiClient.SetWindowStyle(m_wndMdiClient.GetWindowStyle()|SS_CENTERIMAGE);



  • Danke!

    Aber mit .GetWindowStyle komme ich nicht durch den compiler.

    Der meint nämlich
    (Build 030214)\MainFrm.cpp(186): error C2039: 'GetWindowStyle' : is not a member of 'CMdiClient'
    c:\emifield\EmiField 2.2 de (Build 030214)\MainFrm.cpp(186): error C2039: 'SetWindowStyle' : is not a member of 'CMdiClient'

    //header
    CMdiClient m_wndMdiClient;
    
    [...] 
            //m_wndMdiClient.SubclassWindow(m_hWndMDIClient);
            m_wndMdiClient.SetWindowStyle(m_wndMdiClient.GetWindowStyle()|SS_CENTERIMAGE);
            m_wndMdiClient.SetBitmap(IDB_BKGND | BS_CENTER);
    


  • CMdiClient ... Kenne die Klasse nicht, wovon ist die denn abgeleitet?



  • #if !defined(AFX_VNMDICLIENT_H__FC9EC8F2_8175_11D1_A16B_000000000000__INCLUDED_)
    #define AFX_VNMDICLIENT_H__FC9EC8F2_8175_11D1_A16B_000000000000__INCLUDED_
    
    #if _MSC_VER >= 1000
    #pragma once
    #endif // _MSC_VER >= 1000
    
    class CMdiClient : public CWnd
    {
        DECLARE_DYNCREATE(CMdiClient)
    
    // Construction
    public:
        CMdiClient();
    
    // Attributes
    public:
    
    // Operations
    public:
    
    // Overrides
        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CMdiClient)
        //}}AFX_VIRTUAL
    
    // Implementation
    public:
        BOOL SetBitmap(UINT nID);
        COLORREF SetBackColor(COLORREF nBackColor);
        virtual ~CMdiClient();
    
        // Generated message map functions
    protected:
        //{{AFX_MSG(CMdiClient)
        afx_msg BOOL OnEraseBkgnd(CDC* pDC);
        afx_msg void OnSize(UINT nType, int cx, int cy);
        afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
    
    private:
        CBitmap*    m_pBmp;
        COLORREF    m_nBackColor;
    };
    
    /////////////////////////////////////////////////////////////////////////////
    
    //{{AFX_INSERT_LOCATION}}
    


  • 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. 😮 😮 😕


Anmelden zum Antworten