Drag & Drop Bitmap



  • Hallo zusammen,
    ich versuche gerade ein Bitmap, das ich von einem Fenster in ein anderes ziehen möchte, wie bei D&D üblich, anzuzeigen! Hab schon einiges versucht (das Bitmap habe ich), doch alles was ich hinbekommen habe, war ein Bitmap, das einen Schweif hinter sich herzieht(d.h. der Hintergrung wird nicht aktualisiert). Jedenfalls würde ich gerne wissen, wie ich das Ziehen eines Bitmaps alla Drag & Drop realisieren kann. 😕

    Gruß
    rg_Basser



  • Dazu mußt Du Dir eine Klasse von COleDropTarget ableiten, in allen Fenstern, über die Du das Bitmap ziehen willst, für COleDropTarget Register aufrufen. Dann mußt Du OnDragOver überschreiben, damit bekommst Du die aktuellen Mauskoordinaten.
    Weiterhin COleDataObject überschreiben, genauer GetData. Dort wandelst Du die Daten in ein HBITMAP um, falls sie das nicht schon sind und gibst dieses Bitmap zurück.
    In OnDragOver holst Du Dir den DC des Fensters (CWindowDC), und dann zeichnest Du das Bitmap ....

    Ist zwar etwas komplizierter, ist aber die Methode, mit der man das meiste an Drag 'n Drop abhandeln kann



  • Hi Renè,
    bei OnDragOver war ich schon vorher, d.h. ich habe bis dahin schon alle Schritte unternommen, die du erwähnt hast und ich habe auch das Bitmap bzw. den Kontext. Nun habe ich versucht das Bitmap mit dc.StretchBlt anzuzeigen, aber genau da entsteht dann der seltsame Effekt, das das Bitmap verwischt, wenn ich die Maus bewege. Würde ich ein einfaches GDI Objekt zeichnen, könnte ich mit 'pDC->SetROP2(R2_NOT)' das vorherige Objekt löschen und danach in der neuen Position wieder zeichnen. Aber ich möchte kein GDI Objekt sondern das Bitmap zeigen, das ich per D&D verschieben möchte.
    Kannst du mir da auch weiter helfen 😉

    Gruß
    rg_Basser



  • Was heißt verwischen? Wird das Bitmap auf der alten Position nicht gelöscht?

    Du hast recht, SetROP geht bei Bitmaps nicht, da gibts nur die Parameter, die Du bei BitBlt angeben kannst. Um die alte Stelle beim 'Drüberzeichnen' zu behalten, bleibt Dir nur die Möglichkeit, XOR als Verknüpfung zu nehmen, dass verändert aber die Farben und es siehst sch... aus.
    Besser ist, in OnDragEnter sich die alte Position zu merken und das Bitmap das erste Mal zu zeichnen, dann in OnDragOver die alte Position nehmen und invalidieren und Fenster updaten, dann das Bitmap an die neue Position zeichnen und Position updaten.



  • Zusätzlich in OnDragLeave dann die alte Position wieder invalidieren (müßte reichen), wenn nicht, auch gleich updaten.



  • Hi, ich bins nochmal ...
    da ich gerade vor dem gleichen Problem stehe, habe ich mal die Doku durchgeschaut und folgende Objekte gefunden:

    IDropTargetHelper sowie IDragSourceHelper

    Falls das Programm also nur unter Win2K, WinME und größer laufen soll, könnte man diese nehmen ...


Log in to reply