Großer Fadenkreuzcursor im Clientfenster???



  • Hallo,

    ich programmiere im Moment ein kleines CAD Programm. Es handelt sich um eine SDI Anwendung bei der ich über OnDraw meine Zeichnungsdaten in den Clientbereich des Fenster zeichne.
    Ich würde jetzt gerne einen Mousecursor realisieren, der wie ein Fadenkreuz aussieht und sich über den ganzen Clientbereich erstreckt, also vom linken zum rechten und vom oberen zum unteren rand.
    Normale Mousecursor können ja nur eine bestimmte größe haben. Damit geht es leider nicht.

    Also hab ich probiert Die X,Y Koordinaten des Mousecursors in der MouseMove Ereignisbehandlungsroutine zu merken und dort InvalidateRect aufzurufen. Und Das kreuz dann in OnDraw mitzuzeichnen.

    Allerdings muß ich dann ja immer den gesamten Clientbereich an InvalidateRect übergeben da sich das Fadenkreuz ja über den gesamten Clientbereich erstreckt. Das führt zu dem Problem das der Bildschirm unerträglich flackert weil die hardware offensichtlich nicht mit dem Zeichnen nachkommt (schließlich zeichne ich dann bei jedem mousemove den ganzen clientbereich neu) wenn ich die mouse bewege. Schließlich führt das ganze irgendwann zu einer unbehandelten Exception.

    Was könnte ich ändern? Oder gibts irgendwie ne bessere Möglichkeit das Fadenkreuz zu realisieren?

    Vielen Dank



  • Hi !

    Diese Methode ist zwar sicherlich sehr kompliziert und umständlich, mir fällt aber im moment nix anderes ein :

    Speichere doch einfach die Pixelwerte die dein Fadenkreuz "überschreibt".
    Wenn dann das Kreuz weiterbewegt wird, kannst du die Pixel wiederherstellen.
    Du updatest also nur DAS was grade geändert wird...



  • CCadDrawView::OnMouseMove(..., CPoint pt)
    {
      CRect rc;
      GetClientRect( rc);
      CClientDC dc(this);
      dc.SetROP2( XOR_PEN);
      dc.MoveTo( rc.left, m_ptOld.y);
      dc.LineTo( rc.right, m_ptOld.y);
      dc.MoveTo( m_ptOld.x, rc.top);
      dc.LineTo( m_ptOld.x, rc.bottom);
      m_ptOld = pt;
      dc.MoveTo( rc.left, m_ptOld.y);
      dc.LineTo( rc.right, m_ptOld.y);
      dc.MoveTo( m_ptOld.x, rc.top);
      dc.LineTo( m_ptOld.x, rc.bottom);
    }
    

    Zu beachten:
    - Am Anfang m_ptOld auf (-1,-1) setzen
    - über TrackMouseEvent abfangen, ob Maus den Clientbereich verlassen hat, da muss die Linie gelöscht werden und m_ptOld auf (-1,-1) gesetzt werden
    - In OnDraw auch die MoveTo/LineTo-Befehle sowie SetROP2 aufrufen, denn wenn eine WM_PAINT-Nachricht geschickt wird, ohne dass sich die Mausposition verändert hat, verschwinden die Mauslinien



  • Headhunters Idee hat den Vorteil, dass Dein Fadenkreuz komplett schwarz sein kann, während der Code von meinereiner über die XOR-Methode eine 'komisch-farbige' Linie erzeugt


Log in to reply