Linie mit Pfeil an beiden Enden erzeugen und mit Maus bewegen



  • Hallo Leute,

    in meinem Listview (Report-Style) behandele ich die Nachricht "LVN_BEGINDRAG" um einen Item von einer Stelle an eine andere zu bewegen. Dieser Vorgang funktioniert soweit. Lediglich die grafische Darstellung des Vorgangs sieht langweilig aus. Ich klicke ein Item an, Item wird aktiviert, ich ziehe den Item (man sieht das ziehen nicht) am die gewünschte Position und lasse es dort fallen (linker Mausbutton UP). Für das Ziehen des Items würde ich gerne einen "Divider" in den Listview zeichnen:

    genauso wie hier:

    https://www.codeproject.com/Articles/7034/Drag-and-Drop-List-View

    Der Divider soll, wie im Beispeil, an den Seiten Pfeile haben und eine Linie (2 Pixel dick) in Fensterbreite des Listviews. Die beiden Pfeile und die Linie könnte ich ja als 3 Bitmaps oder Icon Resourcen dem Programm beilegen. Die Linie strecke ich dann auf die gewünschte Fensterbreite und füge rechts und links die Pfeile dran. Soweit die Theorie, aber wie mach ich das in der Praxis und wie bekomme ich die Darstellung in den Listview und wie bewege ich das Ding mit der Maus?
    Abfangen der Mauskoordinaten während des Ziehens und Bestimmen ob die Maus im Listview ist klappt soweit, am Rest happerts. Wer kann helfen?



  • Die C# (.NET) - Implementierung holt sich Zugriff mittels Graphics g = this.CreateGraphics(); - dies entspricht dem DeviceContext DC, welche man mittels GetDC erhält.
    Und dann kannst du mit den Funktionen aus wingdi.h dort zeichnen (z.B. MoveLine, LineTo, StretchDIBits).



  • @Th69 sagte in Linie mit Pfeil an beiden Enden erzeugen und mit Maus bewegen:

    dies entspricht dem DeviceContext DC, welche man mittels GetDC erhält.

    Das war mir bewust. Mein Problem lag vielmehr darin, herauszufinden bei welchen Events das Zeichnen im DC am sinnvollsten ist. Dafür habe ich jetzt eine passende Lösung gefunden, die wie folgt aussieht:
    Ich mache das Zeichnen nun bei "WM_MOUSEMOVE" und am Ende wird bei "WM_LBUTTONUP" aufgeräumt. Die beiden Pfeile rechts und links habe ich als Bitmap-Resourcen meinem Programm beigelegt. Die Linie wird während "WM_MOUSEMOVE" entsprechend der Breite des Listviewfenster immer wieder neu erzeugt.



  • Für das Drag & Drop gibt es doch passende Ereignisse: IDropTarget interface (so wie es auch vom C#-Code benutzt wird: DragOver).



  • @Th69 sagte in Linie mit Pfeil an beiden Enden erzeugen und mit Maus bewegen:

    IDropTarget interface

    Ich sprech halt nur "C" und nicht "C++". Solange ich damit zurechtkomme reicht mir das erstmal.



  • Ich würde allerdings keine Bitmap-Dateien für die Pfeile nehmen. Das sind nur 3 oder 4 Punkte, die sich beliebig skalieren und rotieren lassen. Vor allem lässt sich die Farbe (besser) verändern.
    Außerdem sind sie ziemlich nützlich und können auch in zig anderen Bereichen zur Anwendung kommen.
    https://i.imgur.com/uivi28I.png

    COM lässt sich natürlich auch in C betreiben. Ich habe es allerdings noch nie gemacht.

     typedef struct IDropTargetVtbl
    {
            BEGIN_INTERFACE
            
            HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
                IDropTarget * This,
                /* [in] */ __RPC__in REFIID riid,
                /* [iid_is][out] */ 
                __RPC__deref_out  void **ppvObject);
        // und so weiter
    

Log in to reply