Dialogfeldproblem
-
Bitte sehr
FIRSTSTEP! 00412481() CWnd::OnWndMsg(unsigned int 15, unsigned int 0, long 0, long * 0x0012fcb8) line 1825 CWnd::WindowProc(unsigned int 15, unsigned int 0, long 0) line 1585 + 30 bytes AfxCallWndProc(CWnd * 0x012e60e8 {CWnd hWnd=0x00170602}, HWND__ * 0x00170602, unsigned int 15, unsigned int 0, long 0) line 215 + 26 bytes AfxWndProc(HWND__ * 0x00170602, unsigned int 15, unsigned int 0, long 0) line 368 AfxWndProcBase(HWND__ * 0x00170602, unsigned int 15, unsigned int 0, long 0) line 220 + 21 bytes USER32! 77e02ca8() USER32! 77e04764() USER32! 77e04720() NTDLL! 778a15ef() USER32! 77e0577d() CWinThread::Run() line 487 + 11 bytes CWinApp::Run() line 400 AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00133227, int 1) line 49 + 11 bytes FIRSTSTEP! 00413618() FIRSTSTEP! 004134e3() KERNEL32! 77e787f5()
-
Doppelklickst du bitte mal auf die zweite Zeile von oben (CWnd::OnWndMsg) und zeigst ein wenig des Codeumfelds?
-
. . . case AfxSig_lwl: lResult = (this->*mmf.pfn_lwl)(wParam, lParam); break; case AfxSig_lwwM: lResult = (this->*mmf.pfn_lwwM)((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (CMenu*)CMenu::FromHandle((HMENU)lParam)); break; case AfxSig_vv: (this->*mmf.pfn_vv)(); break; case AfxSig_vw: // AfxSig_vb, AfxSig_vh (this->*mmf.pfn_vw)(wParam); break; case AfxSig_vww: (this->*mmf.pfn_vww)((UINT)wParam, (UINT)lParam); break; case AfxSig_vvii: (this->*mmf.pfn_vvii)((short)LOWORD(lParam), (short)HIWORD(lParam)); break; case AfxSig_vwww: (this->*mmf.pfn_vwww)(wParam, LOWORD(lParam), HIWORD(lParam)); break; case AfxSig_vwii: (this->*mmf.pfn_vwii)(wParam, LOWORD(lParam), HIWORD(lParam)); break; . . .er verweist mich dabei auf die WINCORE.CPP
der genau stand ist das break nach dem dritten case
-
Hast du ein Hauptfenster, oder nur diese drei?
Falls du eines hast, wie sieht die MessageMap aus?
Falls nicht, wie sieht InitInstance aus?
Weist du m_pMainWnd irgendwo einen Wert zu?
-
Das Hauptfenster ist ein SDI-Projekt. DIe MessageMap habe ich leider nicht gefunden aber die InitInstancd sieht so aus:
// Standardinitialisierung // Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen // ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden // spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen. // Ändern des Registrierungsschlüssels, unter dem unsere Einstellungen gespeichert sind. // ZU ERLEDIGEN: Sie sollten dieser Zeichenfolge einen geeigneten Inhalt geben // wie z.B. den Namen Ihrer Firma oder Organisation. SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(); // Standard INI-Dateioptionen laden (einschließlich MRU) // Dokumentvorlagen der Anwendung registrieren. Dokumentvorlagen // dienen als Verbindung zwischen Dokumenten, Rahmenfenstern und Ansichten. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CFirststepDoc), RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster RUNTIME_CLASS(CFirststepView)); AddDocTemplate(pDocTemplate); // Befehlszeile parsen, um zu prüfen auf Standard-Umgebungsbefehle DDE, Datei offen CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Verteilung der in der Befehlszeile angegebenen Befehle if (!ProcessShellCommand(cmdInfo)) return FALSE; // Das einzige Fenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); if( ! DShowLib::InitLibrary( "IS-2090097660" ) ) { return FALSE; } else { return TRUE; }Über die Suchfunktion habe ich folgendes über m_pMainWnd gefunden:
C:\tmp\Kopie von Kopie von Firststep 0.3\Firststep.cpp(82): m_pMainWnd->ShowWindow(SW_SHOW); C:\tmp\Kopie von Kopie von Firststep 0.3\Firststep.cpp(83): m_pMainWnd->UpdateWindow(); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPCORE.CPP(393): if (m_pMainWnd == NULL && AfxOleGetUserCtrl()) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPCORE.CPP(396): TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n"); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(28): ASSERT(m_pMainWnd != NULL); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(29): m_pMainWnd->SendMessage(WM_CLOSE); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(38): ASSERT_VALID(m_pMainWnd); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(41): m_pMainWnd->ShowWindow(SW_HIDE); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(42): m_pMainWnd->ShowOwnedPopups(FALSE); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(45): m_pMainWnd->SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0, C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI2.CPP(33): if (m_pMainWnd == NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI2.CPP(53): m_pMainWnd->SendMessage(WM_COMMAND, ID_FILE_PRINT_DIRECT); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DBCORE.CPP(750): TRACE0("Error: No default window (AfxGetApp()->m_pMainWnd) for SQLDriverConnect.\n"); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCMGR.CPP(689): CWnd* pMainWnd = AfxGetApp()->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCMGR.CPP(786): AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND, ID_FILE_PRINT_DIRECT); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCMGR.CPP(795): AfxGetApp()->m_pMainWnd->PostMessage(WM_CLOSE); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCMGR.CPP(933): if (pFrame != (pAppFrame = (CFrameWnd*)AfxGetApp()->m_pMainWnd)) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCSINGL.CPP(198): if (bCreated && pThread->m_pMainWnd == NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCSINGL.CPP(201): pThread->m_pMainWnd = pFrame; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(38): if (pApp != NULL && pApp->m_pMainWnd != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(41): if (pApp->m_pMainWnd->IsWindowEnabled()) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(44): pApp->m_pMainWnd->DestroyWindow(); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(87): (pApp == NULL || pApp->m_pMainWnd == NULL || C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(88): !pApp->m_pMainWnd->IsWindowVisible())) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLESVR1.CPP(782): else if (pApp->m_pMainWnd != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLESVR1.CPP(873): CFrameWnd* pMainFrame = (CFrameWnd*)pApp->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(75): pThread->m_pMainWnd == NULL && pApp->m_pMainWnd->GetSafeHwnd() != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(78): threadWnd.Attach(pApp->m_pMainWnd->m_hWnd); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(79): pThread->m_pMainWnd = &threadWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(342): m_pMainWnd = NULL; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(548): CWnd* pMainWnd = m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(761): if ((m_pMainWnd != NULL) && (IsEnterKey(lpMsg) || IsButtonUp(lpMsg))) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(800):// Access to m_pMainWnd & m_pActiveWnd C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(808): if (m_pMainWnd != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(809): return m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(876): dc << "\nm_pMainWnd = " << m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\VIEWPREV.CPP(750): CWnd* pMainWnd = AfxGetThread()->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\VIEWPREV.CPP(892): CFrameWnd* pParent = (CFrameWnd*)AfxGetThread()->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(785): if (pThread->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(793): pThread->m_pMainWnd = NULL; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2841): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2850): if (AfxGetThread() != NULL && AfxGetThread()->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2879): if (AfxGetThread() != NULL && AfxGetThread()->m_pMainWnd == this && C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2905): if (AfxGetThread() != NULL && AfxGetThread()->m_pMainWnd == this && C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2919): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(760): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(792): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(817): if (!afxContextIsDLL && pApp->m_pMainWnd == NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(867): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(948): if (AfxGetThread()->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(1072): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(1085): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINMAIN.CPP(41): if (pThread->m_pMainWnd != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINMAIN.CPP(43): TRACE0("Warning: Destroying non-NULL m_pMainWnd\n"); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINMAIN.CPP(44): pThread->m_pMainWnd->DestroyWindow(); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINMDI.CPP(508): CWnd* pMainWnd = AfxGetThread()->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\INCLUDE\AFXWIN.H(3802): CWnd* m_pMainWnd; // main window (usually same AfxGetApp()->m_pMainWnd) C:\Programme\Microsoft Visual Studio\VC98\MFC\INCLUDE\AFXWIN.H(3803): CWnd* m_pActiveWnd; // active main window (may not be m_pMainWnd) C:\Programme\Microsoft Visual Studio\VC98\MFC\INCLUDE\AFXWIN.H(3839): // Advanced: virtual access to m_pMainWnd Es wurde(n) 59 Übereinstimmung(en) gefunden.
-
OK, an m_pMainWnd liegt es nicht. Aber irgendwas geht schief beim Aufruf der Behandlungsfunktion für WM_PAINT.
Wie erstellst du die Dialoge?
Hast du irgendwelche OnPaint-Methoden überschrieben?
Kannst du anhand des ersten Parameters von AfxCallWndProc erkennen, um welches der Fenster es sich handelt?
-
Die Dialogfeldfenster erstelle ich wiefolgt:
m_rotdlg.DestroyWindow(); // schutz vor doppelaufruf m_rotdlg.Create(IDD_rot); m_rotdlg.ShowWindow(SW_SHOW); m_rotdlg.OnPaint(Rot); m_blaudlg.DestroyWindow(); // schutz vor doppelaufruf m_blaudlg.Create(IDD_blau); m_blaudlg.ShowWindow(SW_SHOW); m_blaudlg.OnPaint(Blau); m_gruendlg.DestroyWindow(); // schutz vor doppelaufruf m_gruendlg.Create(IDD_gruen); m_gruendlg.ShowWindow(SW_SHOW); m_gruendlg.OnPaint(Gruen);dann sieht die OnPaint anhand des Beispiels für rot so aus:
void rotdlg::OnPaint(unsigned char prot[PICX][PICY]) { int x=0,y=0; CPaintDC dc(this); // device context for painting HDC hdc=dc.GetSafeHdc(); for(x=0;x<640;x++) { for(y=0;y<480;y++) { dc.SetPixel(x+10,y+10,RGB(prot[x][y],prot[x][y],prot[x][y])); } } // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen // Kein Aufruf von CDialog::OnPaint() für Zeichnungsnachrichten }und die OnMove so:
oid rotdlg::OnMove(void) { //CDialog::OnMove(x, y); AfxMessageBox("MOVE"); int x=0,y=0; CPaintDC dc(this); // device context for painting HDC hdc=dc.GetSafeHdc(); for(x=0;x<640;x++) { for(y=0;y<480;y++) { dc.SetPixel(x+10,y+10,RGB(Rot[x][y],Rot[x][y],Rot[x][y])); } } }und die OnSize:
void rotdlg::OnSize(UINT nType, int cx, int cy) { AfxMessageBox("SIZE"); int x=0,y=0; CDialog::OnSize(nType, cx, cy); CPaintDC dc(this); // device context for painting HDC hdc=dc.GetSafeHdc(); for(x=0;x<640;x++) { for(y=0;y<480;y++) { dc.SetPixel(x+10,y+10,RGB(Rot[x][y],Rot[x][y],Rot[x][y])); } } // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen }
-
Mach den Parameter bei OnPaint weg.
-
Das war der Fehler
Nur wie komme ich dann an die Bilddaten die in der Klasse View stehen und ich in den Klassen Rot,Gruen und Blau brauche? dann muss ich die mir erstmal mit extern übergeben lassen oder?
-
blind schrieb:
dann muss ich mir aber wie dekomme ich die Bilddaten dann in die Klass rot von der View klasse?
Du rufst doch nicht etwa die OnPaint-Methoden der Dialoge aus der View-Klasse auf?

Du könntest der View-Klasse eine Methode verpassen, die die Bilddaten liefert.
Du könntest den Dialogklassen eine weitere Methode verpassen, mit der du die Bilddaten übergibst.
etc...Jedenfalls kannst du einer Nachrichtenbehandlungsfunktion nicht einfach weitere Parameter verpassen!
-
Danke erstmal für deine mühe!
Werde mir jetzt was anderes überlegen wie ich das mit den Bildarrays mache es müste doch auch gehen view.array[][] wenn ich view in der Rot klasse bekannt mache oder nicht?
MFK schrieb:
Du rufst doch nicht etwa die OnPaint-Methoden der Dialoge aus der View-Klasse auf?
Wer lesen kann ist klar im Vorteil. Im erten beitrag von mir auf dieser Seite in "Die Dialogfeldfenster erstelle ich wiefolgt:" steht drinne das ich die OnPaint in der View klasse aufrufe. aber das Funktioniert ja jetzt fehlerfrei und das werde ich wenn ich noch genug zeit am ende des Projektes habe ändern.