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.
beimCMainFrame::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
-
-