Codefragment mit _TrackMouseEvent haut mir mein Programm um die Ohren
-
Hi!
Ich habe hier ein Problem mit meinem Programm, wenn ich es im Release-Mode kompiliere - im Debug-Mode läuft alles wie es soll. Ich habe versucht das Programm im Release-Mode zu debuggen und dabei festgestellt, dass einige Pointer plötzlich NULL werden und ich bekomme dann immer eine Access Violation, jedoch konnte ich nicht nachvollziehen, warum die Pointer NULL werden. Es war auch ein Pointer dabei, den ich nur im Konstruktor auf NULL setze und dann erst wieder im Destruktor, trotzdem wurde er im Release-Mode mitten während der Ausführung NULL. Wenn ich in den Projekteinstellungen (VC++ 6.0, Reiter C/C++, Kategorie Code Generation) die Laufzeitbibliothek von "Multithreaded" auf "Multithreaded debuggen" stelle, funktioniert das Programm auch im Release-Mode.
Bei dem Programm handelt es sich um eine Art Bildbetrachter, der u.a. die Funktion bietet das Bild bei gedrückter rechter Maustaste auf dem Bildschirm hin und her zuschieben. Damit das auch funktioniert, wenn der Mauscursor das Fenster des Bildbetrachters verlassen hat, benutze ich _TrackMouseEvent() und einen Timer. In der Funktion OnTimer() frage ich dann die Mausposition ab.Hier mal ein paar Codefragmente zum besseren Verständnis:
CDisplay::CDisplay() { RegisterWndClass(); ... m_bMouseCaptured = false; m_tme.cbSize = sizeof(TRACKMOUSEEVENT); m_tme.dwFlags = TME_LEAVE; m_tme.dwHoverTime = HOVER_DEFAULT; m_tme.hwndTrack = NULL; //m_hWnd ist hier noch NULL, wird erst in OnMouseMove gesetzt ... }Die Deklaration von m_tme sieht so aus: TRACKMOUSEEVENT m_tme;
void CDisplay::OnMouseMove(UINT nFlags, CPoint point) { ... if(!m_bMouseCaptured) { KillTimer(MOUSETRACKING); m_tme.hwndTrack = this->GetSafeHwnd();//m_hWnd; _TrackMouseEvent(&m_tme); m_bMouseCaptured = true; } ... CWnd::OnMouseMove(nFlags, point); } void CDisplay::OnMouseLeave() { m_bMouseCaptured = false; SetTimer(MOUSETRACKING, 50, NULL); this->SetCursor(RESTORE); //setzt nur ein anderes Mauszeigersymbol }Und noch die OnTimer-Funktion:
void CDisplay::OnTimer(UINT nIDEvent) { switch(nIDEvent) { case MOUSETRACKING: POINT mypoint; GetCursorPos(&mypoint); switch(m_objToMove) { case IMAGE: if(m_foto != NULL) { this->MoveDisplayRect(m_mousePosition.x - mypoint.x, m_mousePosition.y - mypoint.y); m_bRefresh = true; } break; case LABEL: if(m_labels && m_foto) { if(m_labels->MoveLabelRect(m_labelID, mypoint.x - m_mousePosition.x, mypoint.y - m_mousePosition.y, m_zoomFactor, m_foto->GetWidth(), m_foto->GetHeight())) { m_bRefresh = true; m_bRefreshOffScreen = true; } } break; case NONE: break; } m_mousePosition = mypoint; break; case DISPLAYREFRESH: ... break; } // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen CWnd::OnTimer(nIDEvent); }Wenn ich jedoch aus der OnMouseMove()-Methode den Teil zwischen den "..." auskommentiere, funktioniert das Programm auch im Release-Mode (mit Laufzeit-Biliothek "Multithreaded"). Dann kann ich das Bild allerdings nicht mehr verschieben, wenn der Mauszeiger das Fenster verlassen hat, was nicht weiter schlimm ist - ich würde aber gerne verstehen, warum mein Programm im Release-Mode so gegen den Baum fährt.
Sieht jemand in dem Code etwas verdächtiges?
