Fehler: "CObject::CObject": Kein Zugriff auf private Member, dessen Deklaration in der CObject-Klasse erfolgte
-
Der Fehler tritt in der afxwin.h auf.
Danke wegen dem Release, hatte ich vergessen.
-
Achso doch jetzt seh ichs, das Problem ist der CPen den solltest Du per Referenz oder gar nicht übergeben (also nur in Deiner Methode instanzieren).
-
Okay, jetzt ist der Fehler weg. Hab jetzt nur moveto und lineto in der Klassenfunktion.
Jedoch stürzt mir jetzt das Programm immer ab mit einer Zugriffsverletzung:
Unbehandelte Ausnahme bei 0x78a4335c (mfc90ud.dll) in prak6_bmt09027.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcc0f0f08.
An folgender Stelle in der wincore.cpp
bResult = m_pCtrlSite->DestroyControl();
-
Hast du denn auch den alten Pen wieder im DC selected, bevor du deinen Pen löschst?
-
Was sagt der Call Stack?
Hast Du evtl. das Control schon zerstört?
-
Also hier jetzt der angepasste Code
void CChildView::OnDateiZeichnen() { CDC *dc; // Gerätekontext zum Zeichnen auswählen dc = GetDC(); CFarbLinie lin; // Instanz der Klasse CFarbLinie anlegen CPen cpen; // Instanz der Klasse CPen anlegen FILE *fp; // Binärdatei zum Lesen auswählen fp = fopen("linien.pra","rb"); // Instanz der Klasse CFarbLinie anlegen while(fread(&lin,sizeof(CFarbLinie),1,fp)) // Lese solange aus Datei, bis Ende der datei erreicht { cpen.CreatePen(PS_SOLID,1,lin.rgb_color()); // neues Object Pen anlegen CPen *pOldPen = dc->SelectObject(&cpen); // Object Pen mit Gerätekontext verbinden lin.datei_zeichnen(dc); // Zeichnen-Funktion aufrufen dc->SelectObject(pOldPen); cpen.DeleteObject(); // Object Pen löschen } ReleaseDC(dc);
class CFarbLinie : public CLinie // Klasse CFarbLinie mit Basisklasse CLinie { private: unsigned char r; // Rotwert unsigned char g; // Grünwert unsigned char b; // Blauwert public: COLORREF rgb_color() // Funktion zum umwandeln der drei Werte in RGB { return RGB(r,g,b); // Rückgabewert vom Typ COLORREF - RGB(r,g,b) } void datei_zeichnen(CDC *dc) { dc->MoveTo(get_start()); // Gehe mit Pen zu Startpunkt der Linie dc->LineTo(get_end()); // Zeichne mit Pen Linie zum Endpunkt } };
-
connan schrieb:
Hast du denn auch den alten Pen wieder im DC selected, bevor du deinen Pen löschst?
Also ich habe ihn erstellt, dann im DC selektiert und dann gemalt.>>EDIT: Okay, ich glaube hier muss er nochmal DC->SelectObject(pOldPen) - Aber Fehler tritt trotzdem auf<<. Danach den Pen gelöscht und dann gehts ja wieder von vorn los.
Das sollte eigentlich so passen.
@Martin Richter: Mit CALL STACK kann ich nichts anfangen sorry.
-
Vielleicht hilft das weiter:
#ifdef _AFX_NO_OCC_SUPPORT if (m_hWnd != NULL) bResult = ::DestroyWindow(m_hWnd); #else //_AFX_NO_OCC_SUPPORT if ((m_hWnd != NULL) || (m_pCtrlSite != NULL)) { if (m_pCtrlSite == NULL) bResult = ::DestroyWindow(m_hWnd); else bResult = m_pCtrlSite->DestroyControl(); }
Das ist die If in der wincore.cpp, wo der Fehler auftritt an folgender Stelle: bResult = m_pCtrlSite->DestroyControl();
-
Oh, hab gerade mal wieder was gelernt zu Visual Studio, was neues entdeckt, danke Martin.
Also ich hoffe, ich habe jetzt auch den Inhalt aus dem Call Stack Fenster:
prak6_bmt09027.exe!CChildView::OnDateiZeichnen() Zeile 73 C++
mfc90ud.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x0034cb70, unsigned int nID=32771, int nCode=0, void (void)* pfn=0x004116a4, void * pExtra=0x00000000, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 82 C++
mfc90ud.dll!CCmdTarget::OnCmdMsg(unsigned int nID=32771, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 381 + 0x27 Bytes C++
prak6_bmt09027.exe!CMainFrame::OnCmdMsg(unsigned int nID=32771, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 120 + 0x29 Bytes C++
mfc90ud.dll!CWnd::OnCommand(unsigned int wParam=32771, long lParam=0) Zeile 2364 C++
mfc90ud.dll!CFrameWnd::OnCommand(unsigned int wParam=32771, long lParam=0) Zeile 366 C++
mfc90ud.dll!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=32771, long lParam=0, long * pResult=0x0012fc90) Zeile 1769 + 0x1e Bytes C++
mfc90ud.dll!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=32771, long lParam=0) Zeile 1755 + 0x20 Bytes C++
mfc90ud.dll!AfxCallWndProc(CWnd * pWnd=0x0034c930, HWND__ * hWnd=0x001c076a, unsigned int nMsg=273, unsigned int wParam=32771, long lParam=0) Zeile 240 + 0x1c Bytes C++
mfc90ud.dll!AfxWndProc(HWND__ * hWnd=0x001c076a, unsigned int nMsg=273, unsigned int wParam=32771, long lParam=0) Zeile 403 C++
mfc90ud.dll!AfxWndProcBase(HWND__ * hWnd=0x001c076a, unsigned int nMsg=273, unsigned int wParam=32771, long lParam=0) Zeile 441 + 0x15 Bytes C++
user32.dll!7e368734()
[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für user32.dll]
user32.dll!7e368816()
user32.dll!7e3689cd()
user32.dll!7e368a10()
mfc90ud.dll!AfxInternalPumpMessage() Zeile 183 C++
mfc90ud.dll!CWinThread::PumpMessage() Zeile 900 C++
mfc90ud.dll!CWinThread::Run() Zeile 629 + 0xd Bytes C++
mfc90ud.dll!CWinApp::Run() Zeile 865 C++
mfc90ud.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x000208e2, int nCmdShow=1) Zeile 47 + 0xd Bytes C++
prak6_bmt09027.exe!wWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x000208e2, int nCmdShow=1) Zeile 30 C++
prak6_bmt09027.exe!__tmainCRTStartup() Zeile 574 + 0x35 Bytes C
prak6_bmt09027.exe!wWinMainCRTStartup() Zeile 399 C
kernel32.dll!7c817077()Leider eröffnen sich mir nun ein paar mehr Fragezeichen
-
Okay, habs gelöst. In der Klasse CLinie ist mir nen :public CWnd reingerutscht.