File Drag&Drop



  • Hi Leute,
    Ich hab keine Ahnung, in welches Forum das hier soll, darum schreibe ich es einfach mal hier rein 😉 Falls das falsch ist, bitte einfach verschieben 😃 Ich schreibe gerade mit OpenGL & freeGLUT ein kleines Programm, welches ein "Projektdatei" als Input benötigt. Nun überlege ich, wie man diese möglichst komfortabel übergeben kann, ohne das ich erst einen Open File Dialog rendern muss(ich arbeite nur über freeGLUT mit der WinAPI, da ich ihre Syntax nicht sonderlich mag). Dabei bin ich auf File Drag&Drop "gestoßen". Ich stelle mir das so vor, dass ich einfach aus dem Windows Explorer die Projektdatei auf mein Programmfenster ziehe und ich dann mit dem Pfad weiterarbeiten kann. Irgendwelche Ideen?
    Danke schon mal 🙂
    MfG
    DragonRaider



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Siehe DragAcceptFiles und WM_DROPFILES



  • Hi Martin,
    Wie soll ich das denn, ohne die WinAPI direkt anzusprechen, machen?
    MfG
    DragonRaider

    Edit: Sorry, dass ich so barsch war 😮



  • Entweder überwinde dich und benutze die WinAPI oder finde eine Bibliothek, die die WinAPI benutzt.



  • Hi,
    Ich hab's jetzt so weit geschafft. Mein Code sieht wie folgt aus:

    char *path = "project.amp";
    unsigned int pathLength = 0;
    
    HWND hWND = WindowFromDC(wglGetCurrentDC());
    DragAcceptFiles(hWND, true);
    
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
      {
      TranslateMessage(&msg);
      if(msg.hwnd == hWND)
        {
        if(msg.message == WM_DROPFILES)
          {
          HDROP hDROP = (HDROP)msg.wParam;
          DragQueryFile(hDROP, 0, path, pathLength);
          DragFinish(hDROP);
          break;
          }
        }
      }
    wprintf(L"File: \"%S\", Lenght: %u\n", path, pathLength);
    system("pause");
    

    Nur leider lautet die Ausgabe

    File: "project.amp", Lenght: 0
    Drücken Sie eine beliebige Taste . . .
    

    😕 Habt ihr vielleicht ne Idee, woran das liegen köntte? Danke schon mal für den Denkanstoß 🙂 Ich dachte, es gibt vielleicht auch noch ne andere Methode, aber... 😉 So sollte es ja eigentlich auch gehen...
    MfG
    DragonRaider



  • Warum sollte DragQueryFile irgendetwas nach path schreiben, wenn du sagst, dass da kein Platz ist (pathLength = 0).

    Zudem sollte man auch nicht Stringliterale verändern.
    Nimm ein Array dafür.



  • Oh, stimmt... Ich hatte die msdn Seite dazu nicht aufmerksam genug gelesen ^^ Danke

    Ich dachte, in diesem uint würde die Länge des Outputs gespeichert werden 🙄 Dummheit meinerseits

    Danke noch mal an Alle.
    MfG
    DragonRaider

    PS.:
    An Alle, die es interessiert:

    char path[260];
    unsigned int pathLength = 260;
    
    HWND hWND = WindowFromDC(wglGetCurrentDC());
    DragAcceptFiles(hWND, true);
    
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
      {
      TranslateMessage(&msg);
      if(msg.hwnd == hWND)
        {
        if(msg.message == WM_DROPFILES)
          {
          HDROP hDROP = (HDROP)msg.wParam;
          DragQueryFile(hDROP, 0, path, pathLength);
          DragFinish(hDROP);
          break;
          }
        }
      }
    wprintf(L"File: \"%S\", Lenght: %u\n", path, pathLength);
    system("pause");
    


  • DragonRaider schrieb:

    Ich dachte, in diesem uint würde die Länge des Outputs gespeichert werden 🙄 Dummheit meinerseits

    Dann wäre da doch ein Zeiger im Spiel.



  • DragonRaider schrieb:

    🙄 Dummheit meinerseits

    ...


Anmelden zum Antworten