2010-08-13 3 views
5

Ich spielte mit Drag and Drop herum. Ich machte eine Beispielanwendung und legte eine Datei aus dem Ordner My Music auf meine Anwendung. Hier ist, was e.Data.GetFormats() zurückgegeben:Was bedeuten verschiedene Clipboard/Drag-and-Drop-Formate?

  • Shell idlist Array
  • UsingDefaultDragImage
  • DragImageBits
  • DragContext
  • DragSourceHelperFlags
  • InShellDragLoop
  • Filedrop
  • FileNameW
  • Filename
  • IsShowingLayered
  • DragWindow
  • IsComputingImage
  • DropDescription
  • DisableDragText
  • ComputedDragImage
  • IsShowingText

Was jeder von ihnen bedeuten und wie sie entschlüsseln und zu verwenden ?

Googeln jeder von ihnen ergab keine nützlichen Informationen.

Antwort

1

FileDrop ist Standard und wird von der DataFormats-Klasse abgedeckt. Shell IDList und FileName/W sind für Windows Explorer üblich. Der Rest von ihnen sind alle Gewohnheit. Bei ihren Namen klingt es so, als würden sie das D + D-Feedback verbessern, wenn Sie in andere Microsoft-Apps wie Media Player ziehen. Dieses Zeug ist schlecht dokumentiert, möglicherweise absichtlich.

4

DragImageBits beschreibt das Bild, das angezeigt wird, wenn Sie Material ziehen. Sein Header wird von SHDRAGIMAGE beschrieben.

var data = e.Data.GetData("DragImageBits") as MemoryStream; 
var buffer = new byte[24]; 
data.Read(buffer, 0, 24); 
int w = buffer[0] + (buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24); 
int h = buffer[4] + (buffer[5] << 8) + (buffer[6] << 16) + (buffer[7] << 24); 
// Stride accounts for any padding bytes at the end of each row. For 32 bit 
// bitmaps there are none, so stride = width * size of each pixel in bytes. 
int stride = width * 4; 
// x and y is the relative position between the top left corner of the image and 
// the mouse cursor. 
int x = buffer[8] + (buffer[9] << 8) + (buffer[10] << 16) + (buffer[11] << 24); 
int y = buffer[12] + (buffer[13] << 8) + (buffer[14] << 16) + (buffer[15] << 24); 
buffer = new byte[stride * h]; 
// The image is stored upside down, so we flip it as we read it. 
for (int i = (h - 1) * stride; i >= 0; i -= stride) data.Read(buffer, i, stride); 
BitmapSource.Create(w, h, 96, 96, PixelFormats.Bgra32, null, buffer, stride); 

Man sollte stattdessen DragDropHelper stattdessen für bessere Kompatibilität verwenden.

+0

+1 - Ich habe etwas von diesem Code für eine andere Antwort verwendet: http://StackOverflow.com/A/8468171/25216 Während dies funktioniert, kann es mit einem BinaryReader vereinfacht werden. –

+0

Ich habe Probleme beim Zeichnen der Farben .. Die meisten Farben passen perfekt zum Original, aber weiße Bereiche erscheinen in Grau? – Karel