017
05.01.2005, 08:12 Uhr
~Sandra
Gast
|
Guten morgen. @Th:Kein Problem.Anscheinend ist das eh nicht der entscheidende Fehler. Das nimmt er zwar aber jetzt schmiert das Programm ab. Ich poste mal den ganzen Code. Wenn das so nicht klappt kann ich dir das Programm auch mal zuschicken. Kann doch nicht sein das ich an sonem Bitmap scheitere. Die Quelle ist: http://support.microsoft.com/kb/q149407/
Folgende Dateien habe ich einer nackten SDI-Anwendung mit FromView als Basisklasse hinzugefügt:
C++: |
// 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
|
C++: |
// 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:
C++: |
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;
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Statusleiste konnte nicht erstellt werden\n"); return -1; // Fehler bei Erstellung }
// Add the following code #if _MFC_VER >= 0x400 UINT nID, nStyle; int cxWidth;
m_wndStatusBar.GetPaneInfo(0, nID, nStyle, cxWidth); m_wndStatusBar.SetPaneInfo(0, nID, nStyle | SBT_OWNERDRAW, cxWidth); #endif
return 0; }
|
Das wars schon. Vielleicht könnt ihr mir ja helfen wo der Fehler liegt. Wie gesagt zuschicken wär auch kein Thema. Danke schonmal für eure Mühe.
Gruß Sandra |