KA wie ich das beschreiben soll :(



  • Hi

    Es tut mir sehr leidd, aber ich wusste echt nicht wie ich das beschreiben soll und in den Titel packen.

    Hier erstmal ein Bild von der Anwendunghttp://www.abload.de/thumb/unbenannt6gv.png
    (Das ist nur eine Skizze die ich mir gemacht habe)

    Also ich soll in der Anwendung einen Cursor integrieren der die Werte (der gezeichneten Linie, diese sind gespeichert in einem Array) unten bei "Kanal 1*" wieder reinschreibt wenn man mit der Maus oder den Pfeiltasen die Linie (Cursor) bewegt.

    Da ich MFC (SDI) noch nicht so lange mache (ca. 3-4 Monate) habe ich keine Ahnung wie das realisiren soll. Ich bin froh das die Anwendung in der Version 1.0.0 nun fertig ist und ohne Probleme läuft.

    MFG
    Shona

    * Insgesamt sind es 8 Kanäle aber wenn es bei einem funktioniert kann ich es bei den anderen einfach reinkopieren 😉



  • Wenn ich dich richtig verstanden habe: Nimm einfach die Mausposition und überlege dir, wie du daraus den passenden Array-Index findest (X minus Offset und dann durch Pixel-Abstand zwischen 2 Werten, schätze ich).



  • Hallo,

    Du hast doch eine Funktion geschrieben die das ganze "malt". Dort hast Du ja schon die Zuweisung [Array mit Daten]->[Pixel]

    jetzt must Du das ganze nur Rückwerts rechnen. Oder erstell Dir ein 2. Array wo Du zu jeder Pixel-Spalte den Wert reinschreibst. Ist nicht sehr Elegant.

    Nun mußt Du ja noch die Linie verschieben. schau mal mal WM_LButtonDown, Up und MouseMove.

    Viel Erfolg

    Stefan



  • Mir ist schon klar das ich das ganze dann Rückwärtsrechnen muss, ich weiß nur nicht wie ich diese ver****** Linie zum bewegen bekommme.

    Ich weiß das ich dafür WM_MOUSEMOVE brauche aber nicht wie ich das einsetze, den das ganze soll ja bei der Bewegung der Maus ablaufen und dann den Wert wieder geben.

    Die Linie habe ich auch schon (wenn nur als test ob das ein und ausschalten funktioniert) hier mal der code

    if (pDoc->m_bCursor == FALSE)
    {
    CPen linePen (PS_SOLID, 1, RGB(255,0,0));
    pDC->SelectObject (&linePen);
    pDC->MoveTo(11*25,20);
    pDC->LineTo(11*25,530);
    }
    

    Warum soll ich mir aber WM_LButtonDown und WM_LButtonUp anschauen? Ich brauche noch die Pfeiltasten auf der Tastatur und nicht die Linke und Rechte Maustaste 🙂 aber ich denke mal wenn ich es für die Maus hinbekomme dann ist es füe die Pfeiltasten ja nicht anders.

    Wie gesagt ich mache das noch nicht so lange

    EDIT:
    Wie ich eben erfahren habe soll das ganze sich erst dann bewegen wenn irgendeine Maustaste gedrückt ist. (ich werd noch wahnsinnig 🙂 )

    MFG
    Shona



  • Kann mir den keiner helfen ich weiß nämlich absolute nicht was ich nun machen soll 😕

    Habe mir WM_MOUSEMOVE angeschaut aber da steht nicht wirklich viel dazu in der Hilfe drin und das was da drin steht wusste ich auch schon vorher.

    Habe es zumindest geschafft das ich die X-Koordinate der Maus speichere (ist die eizigste die ich brauche) und kann damit die Linie auch bewegen aber nicht so wie es sein soll.

    Die Linie wird in OnDraw gezeichnet, der Code dafür ist dieser

    if (pDoc->m_bCursor == FALSE)
    	{
    		CPen linePen (PS_SOLID, 1, RGB(0,0,0));
    		pDC->SelectObject (&linePen);
    		pDC->MoveTo(m_iPrevX,20);
    		pDC->LineTo(m_iPrevX,530);
    	}
    

    Aber die Linie ändert nur ihre position wenn ich das fenster zu mache und wieder öffne.

    MFG
    Shona



  • Aktualisierst Du das Fenster nach Änderung der X-Koordinate auch mit InvalidateRect, damit es in OnDraw neugezeichnet werden kann?



  • sri schrieb:

    Aktualisierst Du das Fenster nach Änderung der X-Koordinate auch mit InvalidateRect, damit es in OnDraw neugezeichnet werden kann?

    Jetzt ja, brauchte nur wieder mal eine Denkhilfe ;), Danke!

    Jetzt habe ich nur noch das Problem mit den Pfeiltasten "Links" und "Rechts", wie kann ich das mit denen machen? Habe leider keine funktion gefunden wie ich das machen kann bzw. wie ich die Standarteinstellungen für die Tasten überschreiben kann.



  • WM_KEYDOWN abfangen und pruefen ob es pfeil rechts oder links war {o;



  • Mr Evil schrieb:

    WM_KEYDOWN abfangen und pruefen ob es pfeil rechts oder links war {o;

    aha und wie soll das funktionieren, weil ich hab das noch nie gemacht



  • schau einfach wie es bei den anderen messages wie WM_PAINT geloest ist - das verhaelt sich aehnlich - schau dazu einfach in die MSDN {=



  • danke aber das half mir auch nicht weiter



  • Shona schrieb:

    danke aber das half mir auch nicht weiter

    Du nutzt ja die MFC, also:

    - In deine Dialog-Klasse gehen (Header).
    - Dort auf eine leere Zeile innerhalb der Deklaration klicken.
    - Im Eigenschaftenfenster "Meldungen" auswählen.
    - Bis WM_KEYDOWN runterscrollen
    - Im rechten Feld (ComboBox) "Hinzufügen OnKeyDown" anklicken
    - Tada! Du hast einen Event-Handler namens OnKeyDown, der aufgerufen wird, wenn WM_KEYDOWN gesendet wird.

    Du kannst das natürlich auch manuell machen (Stichwort ON_WM_KEYDOWN() Makro).



  • Das hab ich doch schon längst drin aber ich weiß nicht wie ich die Pfeiltasten abfangen soll bzw. ob es rechts oder links war.



  • Na ja, du sagtest, du hättest das noch nie gemacht... 🙄

    Dann sieh dir die Doku an (erster Parameter):

    http://msdn.microsoft.com/de-de/library/983st27a(VS.80).aspx

    (Tipp: VK_LEFT, VK_RIGHT)



  • Ich denke mal du meinst damit "nChar", soweit war ich auch schon aber ich hab keine Ahnung wie ich das schreiben soll.

    Habe einfach mal aus dem Bauch heraus wie folgt angefangen aber ich weiß nicht ob das richtig ist und wie es weiter geht bzw. was da noch hin muss

    if ((nChar == VK_LEFT || VK_RIGHT) && )
    


  • Sieht doch schon gut aus, glaube ich. Du musst dann auch nix mehr verunden, wenn du nur die Tasten Links und Rechts abfragen willst. Dass ein Key gedrückt wurde, ist ja schon klar. Und ich vermute, dich interessiert auch nicht, ob STRG, SHIFT oder sonstwas gedrückt ist. Also klatsch deinen Code darunter und sieh, was passiert!



  • _matze schrieb:

    Sieht doch schon gut aus, glaube ich. Du musst dann auch nix mehr verunden, wenn du nur die Tasten Links und Rechts abfragen willst. Dass ein Key gedrückt wurde, ist ja schon klar. Und ich vermute, dich interessiert auch nicht, ob STRG, SHIFT oder sonstwas gedrückt ist. Also klatsch deinen Code darunter und sieh, was passiert!

    Es funktioniert einwenig zumindest bewegt sich die linie, das problem ist aber das sie sich bei jeder anderen taste auch bewegt.



  • 😕

    Dann zeig mal deine komplette OnKeyDown.



  • Das ist aber nur provesorisch um zu schauen ob das mit den Pfeiltasten funktioniert.

    void CDSOZView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	CPoint mouseXY;
    	if ((nChar == VK_LEFT || VK_RIGHT))
    	{
    		GetCursorPos(&mouseXY);
    
    		// Aktuellen Punkt als letzten Punkt speichern
    		m_iPrevX = mouseXY.x;
    
    		Invalidate();
    	}
    
    	CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }
    


  • Shona schrieb:

    Es funktioniert einwenig zumindest bewegt sich die linie, das problem ist aber das sie sich bei jeder anderen taste auch bewegt.

    Das liegt an Deiner Bedingung, die prüft, ob die Ausdrücke

    nChar == VK_LEFT
    

    oder

    VK_RIGHT
    

    wahr sind. Der erste ist es nur bei der Cursor-links Taste, der zweite aber immer (weil ungleich 0).

    Richtig:

    if (VK_LEFT == nChar || VK_RIGHT == nChar)
    


  • Danke jetzt funktioniert es bestens 🙂 😃 👍


Anmelden zum Antworten