Bitmap in Stausbar einfügen



  • Hi
    Ich habe Probleme ein Bitmap in eine Statusbar einzufügen. Als Vorlage habe ich folgenden Link benutzt.:
    http://support.microsoft.com/kb/q149407/
    Folgende Dateien habe ich einer nackten SDI-Anwendung mit FromView als Basisklasse hinzugefügt:

    // MyStatusBar.cpp: Implementierung der Klasse CMyStatusBar.
    //
    //////////////////////////////////////////////////////////////////////
    
    #include "stdafx.h"
    #include "stdafx.h"
    #include "MyStatusBar.h"
    #include "Resource.h"
    
    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif
    
    //////////////////////////////////////////////////////////////////////
    // Konstruktion/Destruktion
    //////////////////////////////////////////////////////////////////////
    
    CMyStatusBar::CMyStatusBar()
    {
    
    }
    
    CMyStatusBar::~CMyStatusBar()
    {
    
    }
    
      #if _MFC_VER < 0x400
    /*  void CMyStatusBar::DoPaint(CDC* pDC)
       {
           CRect rect;
           GetItemRect(1, &rect);  // get pane rect
           pDC->ExcludeClipRect(&rect);  // exclude pane rect from paint
           CStatusBar::DoPaint(pDC);  // paint remainder of status bar
    
           CRgn paneRgn;
           paneRgn.CreateRectRgnIndirect(rect);
           pDC->SelectClipRgn(&paneRgn); // set clip region to pane rect
    
           CBitmap* pBitmap = // pointer to current CBitmap ;
           CDC srcDC; // select current bitmap into a compatible CDC
           srcDC.CreateCompatibleDC(NULL);
           CBitmap* pOldBitmap = srcDC.SelectObject(pBitmap);
           pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
                     &srcDC, 0, 0, SRCCOPY); // BitBlt to pane rect
           srcDC.SelectObject(pOldBitmap);
       }*/
       #endif
    
       #if _MFC_VER >= 0x400
       void CMyStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
       {
           switch(lpDrawItemStruct->itemID)
           {
           case 1:
               // Attach to a CDC object
               CDC dc;
               dc.Attach(lpDrawItemStruct->hDC);
    
               // Get the pane rectangle and calculate text coordinates
               CRect rect(&lpDrawItemStruct->rcItem);
    
               hBmp = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
    
               CBitmap* pBitmap = CBitmap::FromHandle(hBmp);/* pointer to current CBitmap */
               CDC srcDC; // select current bitmap into a compatible CDC
               srcDC.CreateCompatibleDC(NULL);
               CBitmap* pOldBitmap = srcDC.SelectObject(pBitmap);
               dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
                         &srcDC, 0, 0, SRCCOPY); // BitBlt to pane rect
               srcDC.SelectObject(pOldBitmap);
    
               // Detach from the CDC object, otherwise the hDC will be
               // destroyed when the CDC object goes out of scope
               dc.Detach();
    
               return;
           }
    
           CStatusBar::DrawItem(lpDrawItemStruct);
       }
       #endif
    
    // MyStatusBar.h: Schnittstelle für die Klasse CMyStatusBar.
    //
    //////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_MYSTATUSBAR_H__9B1944A2_0EC7_4E0A_ACF4_500F69443152__INCLUDED_)
    #define AFX_MYSTATUSBAR_H__9B1944A2_0EC7_4E0A_ACF4_500F69443152__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    class CMyStatusBar : public CStatusBar  
    {
    public:
        CMyStatusBar();
        virtual ~CMyStatusBar();
    
        HBITMAP hBmp;
          #if _MFC_VER < 0x400
          //virtual void DoPaint(CDC* pDC);
       #endif
    
       #if _MFC_VER >= 0x400
           virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
       #endif
    
    };
    
    #endif // !defined(AFX_MYSTATUSBAR_H__9B1944A2_0EC7_4E0A_ACF4_500F69443152__INCLUDED_)
    

    Ich habe dann der Resource ein Bitmap zugefügt und der Statusbar einen Pane.

    Die OnCreate Funktion im Main sieht so aus:

    static UINT indicators[] =
    {
        ID_SEPARATOR,           // Statusleistenanzeige
        ID_INDICATOR_BITMAP,
        ID_INDICATOR_CAPS,
        ID_INDICATOR_NUM,
        ID_INDICATOR_SCRL,
    };
    
    /////////////////////////////////////////////////////////////////////////////
    // CMainFrame Konstruktion/Zerstörung
    
    CMainFrame::CMainFrame()
    {
        // ZU ERLEDIGEN: Hier Code zur Member-Initialisierung einfügen
    
    }
    
    CMainFrame::~CMainFrame()
    {
    }
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
    

    Wenn ich das Programm ausführe bekomme ich einen Application Error. Beim Debuggen springt er in die Disassemblierung und ich komm nicht weiter. Kannn mir jemand helfen? Bei wunsch kann ich das Progamm auch gern zuschicken ich weiß nämlich so nicht mehr weiter.

    Gruß
    Thorsten



  • hi,

    hmm.... geht ganz einfach (Beispiel IMAGELISTE):

    füge deiner CMainFrame-Classe ein Variable

    CImageList m_imgList
    

    ein.
    beim

    CMainFrame::OnCreate(...)
    {
      m_imgList.Create(IDB_BITMAP1,16,16,RGB(255,255,255)); 
    
      if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
      //.... und am ende der methode
      m_wndStatusBar.GetStatusBarCtrl().SetIcon(m_wndStatusBar.CommandToIndex(ID_INDICATOR_BITMAP),imgList.ExtractIcon(0));
    
    }
    

    ach ja ... und vergiß nicht ID_INDICATOR_BITMAP in deiner String-Tabelle(Resource) anzulegen ...

    Vui Spaß

    LukeX



  • Allplaus für diesen Mann. Ich hab ja schon fast verzweifelt das das so umständlich sein soll nen blödes bitmap einzufügen. Danke dir. Funzt prima..

    Gruß
    Thorsten



  • es gibt sachen, die sind auf microsoft.com komplizierter als irgendwo anders... 😉

    bitte

    grüße,

    lukas



  • es gibt sachen, die sind auf microsoft.com komplizierter als irgendwo anders... 😉

    bitte

    grüße,

    lukas


Anmelden zum Antworten