UpdateWindow(FALSE) - funktioniert nicht.



  • Hallo estartu,

    Danke für die Antwort.

    Tja... Das hatte ich schon versucht. Ich habe mit einem Zeiger die Variable m_comp in der Funktion CompSpiele() auf true und/oder false gesetzt und in OnLButtonDown abgefragt.

    void CMemoryTrainingView::CompSpiele()
    {
    
    	//Verbindung zur Documenten-Klasse herstellen
        CMemoryTrainingDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    
    	if(pDoc->GetSpielStatus()) {
    
    		CString str;
    		str.Format("%i",m_feldZ);
    		m_Textfeld.SetWindowText(str);
    
    //		m_comp = true;
    		*pComp = true,
    
    		InvalidateRect(m_background);
    		UpdateWindow();
    
    		for( int i = 0; i<m_feldZ; ++i) {
    
    			ID = m_feldReihe[i] * 2;
    
    			Sleep(pDoc->m_iRadio);
    
    			Blinke(ID);
    		}
    
    		m_runde = 0;
    
    //		m_comp = false;
    		*pComp = false;
    
    		InvalidateRect(m_background);
    		UpdateWindow();
    
    	}
    
    }
    
    void CMemoryTrainingView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
    
    	ID = -1;
    
    	if(!m_comp) {
    
    		if(m_feld[0].PtInRect(point)) {
    			ID = 0;		
    		}
    		if(m_feld[1].PtInRect(point)) {
    			ID = 2;		
    		}
    		if(m_feld[2].PtInRect(point)) {
    			ID = 4;		
    		}
    		if(m_feld[3].PtInRect(point)) {
    			ID = 6;		
    		}
    	}
    
    	if(ID != -1) {
    
    		m_runde++;
    		Spieler(ID);
    	}
    
    	CView::OnLButtonDown(nFlags, point);
    }
    

    Es funktioniert aber nicht. Wenn die Logik stimmt, habe ich eine Vermutung...

    Meine Intuition sagt dass vielleicht werden die Klicks-Nachrichten in einer Warteschleife gesammelt und werden erst bearbeitet als der Computer eigentlich schon gespielt hat, das heisst, m_comp ist immer false bei der Klicks Bearbeitung... Ist das Blödsinn???

    Gruß

    bird



  • Warum machst du das mit einem Zeiger? 😕



  • Da hast Du eine gute Intuition 😉 Du setzt natürlich die ganze Nachrichtenbehandlung mit dem Sleep/for außer Kraft. Du könntest also mit einem Thread arbeiten oder mit einem Timer, aber die For-Schleife mit dem Sleep ist tödlich.



  • estartu schrieb:

    Warum machst du das mit einem Zeiger? 😕

    Nochmal Anfänger Vermutung... Da es nicht funktioniert hat, dachte ich wäre es weil der aktuelle Wert von m_comp nicht in OnLButtonDown zur Verfügung stand. Das war ein Versuch m_comp Wert für alle Funktionen zu ändern... Falsch??

    Im Konstruktor habe ich das geschrieben:

    m_comp = false;
    pComp = &m_comp;
    

    Naja... Aber egal was ich tue, mit oder ohne pointer, funktioniert nicht...



  • connan schrieb:

    Da hast Du eine gute Intuition 😉 Du setzt natürlich die ganze Nachrichtenbehandlung mit dem Sleep/for außer Kraft. Du könntest also mit einem Thread arbeiten oder mit einem Timer, aber die For-Schleife mit dem Sleep ist tödlich.

    Oh, das hatte ich übersehen. Das ist wohl die wahrscheinlichere Ursache.
    Ich würde es nun mit einem Timer versuchen.



  • connan schrieb:

    Da hast Du eine gute Intuition 😉 Du setzt natürlich die ganze Nachrichtenbehandlung mit dem Sleep/for außer Kraft. Du könntest also mit einem Thread arbeiten oder mit einem Timer, aber die For-Schleife mit dem Sleep ist tödlich.

    Hallo connan und estartu,

    Die folgende Intuition nach dieser Intuition 🙂 war die Sleep() Funktion...

    Ich habe dann versucht mit SetTimer() zu arbeiten. Die Blinke Funktion habe ich hingekriegt, aber die CompSpiele(), mit der For-Schleife scheint mir unmöglich zu realisieren...



  • Unmöglich ist nichts. Du kannst mit Threads arbeiten oder du bearbeitest die Messageloop selbst. Siehe FAQ.



  • ShareBird schrieb:

    Ich habe dann versucht mit SetTimer() zu arbeiten. Die Blinke Funktion habe ich hingekriegt, aber die CompSpiele(), mit der For-Schleife scheint mir unmöglich zu realisieren...

    Das geht schon 😉
    1. Du kannst mehrere Timer setzen und per ID in OnTimer reagieren (also für blink UND compute).
    2. Kannst Du, statt der For-Schleife, in einer Funktion einen Timer immer wieder neu setzen und z.B. über eine statische Variable den Zähler(=Abruchbedingung=>KillTimer) realisieren.
    Wenn Du aber einfach nur Spaß am Programmieren und Lernen hast, schau Dir Threads an 😉


  • Mod

    Das einfachste ist es ein durchsichtiges Fenster über Deine eigentlichen Fenster zu legen. Dort werden die entsprechenden Mausklicks behandelt und werden dann in entsprechende MoveWndow/SetWindowPos auf die eigentlichen Objekte unter diesem Control ausgeführt.



  • Martin Richter schrieb:

    Das einfachste ist es ein durchsichtiges Fenster über Deine eigentlichen Fenster zu legen. Dort werden die entsprechenden Mausklicks behandelt und werden dann in entsprechende MoveWndow/SetWindowPos auf die eigentlichen Objekte unter diesem Control ausgeführt.

    Hmmm... Das war meine erste Idee, einer Art "Schutz" Ebene drauf zu legen, aber wie?? Wenn ich ein neues Fenster innerhalb dieses Fenster erzeuge, werden trotzdem Mausklicks wahrgenommen... (ich habe Testweise ein CEdit Objekt erzeugt, ich weiß nicht wie man ein neues Fenster CWindow innerhalb dieses Fenster erzeugt...).

    Ich bin sehr dankbar für alle Tips die ich bis jetzt bekommen habe, aber ich schildere kurz meine Schwierigkeiten: Das erste mal dass ich einer Schleife, einer if Anweisung begegnet bin, war vor 30 Jahren!! Damals hat es nicht gefunkt, also, ich habe mich nicht weiter gekümmert.

    Das zweite mal ist gerade 8 Monate her gewesen im Rahmen einer Reihe von "Blitz" Kurse: HTML, PHP, JavaScript, Flash, ActionScript, C++ und MFC, jeweils 15 Tage Theorie und 5 Tage Projekt. Bevor hatte ich keine Idee was ein "Array" zu bedeuten hätte... Ich habe Schwierigkeiten mit der Logik (ich habe Stunden gebraucht um die Spieler Funktion zu realisieren), Flow-Charts, etc., etc., etc...

    Egal.. Irgendwie hat es diesmal gefunkt, ich lerne weiter.

    Danke für die Geduld 🙂


  • Mod

    Du musst das "obere" Fenster in der Z-Order so legen, dass es wirklich "über" den anderen Fenstern liegt.

    Aber wenn Du so viele Schwieirgkeiten mit den Grundlagen hast. Würde ich mit etwas simpleren anfangen... Just my 2 cents.



  • Tja... Ich habe alles versucht...

    Ich setze hier eine Sleep(ne Weile)...

    Vielen Dank an alle für den Tips! Echt nett hier 😉

    Gruß



  • Hmm... Anscheinend habe ich das Problem gelöst. Ich werde sicherlich (besser, hoffentlich) sehr darüber lachen was für Lösungen ich in dieser Zeit gefunden habe.

    Ich habe diesen Code in der Funktion CompSpiele() eingefügt:
    MSG message;

    if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
    ::TranslateMessage(&message);
    ::DispatchMessage(&message);
    }

    void CMemoryTrainingView::CompSpiele()
    {
    
    	//Verbindung zur Documenten-Klasse herstellen
        CMemoryTrainingDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    
    	if(pDoc->GetSpielStatus()) {
    		CString str;
    		str.Format("%i",m_feldZ);
    		m_Textfeld.SetWindowText(str);
    
    		m_comp = true;
    
    		InvalidateRect(m_background);
    		UpdateWindow();
    
    		for( int i = 0; i<m_feldZ; ++i) {
    			ID = m_feldReihe[i] * 2;
    			Sleep(pDoc->m_iRadio);
    
    			MSG message;
    
    			if(::PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {
    				::TranslateMessage(&message);
    				::DispatchMessage(&message);
    			}
    
    			Blinke(ID);
    		}
    
    		m_runde = 0;
    		m_comp = false;
    
    		InvalidateRect(m_background);
    		UpdateWindow();
    	}
    }
    

    Irgendwann werde ich verstehen warum es geklappt hat... 😃

    Gruß

    bird


Anmelden zum Antworten