Drag&Drop
-
Gruezi,
ich habe jetzt schon viel Zeit damit verbracht, das Platform SDK nach einer Funktion zu durchforsten, mit deren Hilfe ich ein ChildWindow im Parent-Bereich draggen kann, habe aber nichts gefunden. Steht eine solche Funktion überhaupt zu Verfügung oder muss ich das zu Fuss erledigen?dankeschön im voraus,
Pablo
-
Wenn ich dich richtig verstanden habe willst du einfach nur Child-Fenster mit der Maus verschieben können, richtig?
In diesem Falle reicht es afaik, wenn du auf WM_LBUTTONDOWN in der MessageProc des ChildWindows mit SendMessage(hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0); reagierst
-
Danke Dir,
nur leider war meine Frage nicht präzise genug:
Ich will mir ein Scrollbar-Control (bzw. habe es schon gemacht, nur bin ich mit dem Draggen nicht ganz zufrieden) zusammenzubasteln, das Fenster - in diesem Fall eben das zu verschiebende Dingens in der Scrollbar - sollte also während des Draggens sichtbar sein und ich muss auf die aktuelle Position zugreifen können.Pablo
-
Jetzt wo du es sagst merke ich es auch - bei meiner Lösung wärst du von der Windows-Einstellung "Fensterinhalt beim Ziehen anzeigen" abhängig. Wenn du es sauber machen willst würde ich gleich alles selber zeichnen, sodass die komplette Scrollbar ein Fenster ist. Aber darf man fragen, wozu du das Rad neu erfindest
-
Hi,
es geht mir als Win-Api Noob um den Lerneffekt. Ausserdem hätte ich gerne das Design unter meiner Kontrolle. Ich weiss, man könnte subclassen... aber wie gesagt, es geht darum, mich in der Api zurechtzufinden und da ich ein Touchpad simulieren will ist eine Scrollbar sicher eine gute Vorübung.
Zurück zum Thema:
Die komplette Scrollbar an sich ist schon ein Fenster. Nur mit dem Draggen der "Bar" habe ich meine Probleme.Pablo
-
Die würde ich dann auch gleich in das Parent reinnehmen. Also kein extra Fenster dafür, sondern nur reingezeichnet
-
thx a lot, flanders.
Ich war fälschlicherweise darauf fixiert, dass das zu draggende Element ein Fenster sein muss, um es anpacken zu können.
Dennoch bleibe ich wissbegierig. Wie würde man das dann lösen, wenn man viele dragbare Objekte, wie z.B bei einem Puzzle oder dem 1-bis-15-Zahlen-Ordne-Schiebespiel, beherrschen will?Pablo
-
Wenn du es als eigenes Fenster machst bist du eben afaik von der Windows-Einstellung abhängig in Bezug auf's Anzeigen
Wenn du alles mit einem Fenster machst musst du eben selber schauen, was angeklickt wurde
-
falls es jemanden interessiert, so läuft's ganz ordentlich:
LRESULT CALLBACK DragProc(HWND hWnd,UINT msg,WPARAM wParam, LPARAM lParam) { static bool isDragging=false; static POINT start; switch(msg) { case WM_MOUSEMOVE: { if(isDragging) { POINT coord; coord.x=(signed short)LOWORD(lParam); coord.y=(signed short)HIWORD(lParam); ClientToScreen(hWnd,&coord); ScreenToClient(hParent,&coord); if(coord.x-start.x<0) coord.x=start.x; if(coord.y-start.y<0) coord.y=start.y; SetWindowPos(hWnd,HWND_TOP, coord.x-start.x,coord.y-start.y, 0,0,SWP_NOSIZE); } } break; case WM_LBUTTONDOWN: SetCapture(hWnd); start.x=LOWORD(lParam); start.y=HIWORD(lParam); isDragging=true; break; case WM_LBUTTONUP: isDragging=false; ReleaseCapture(); break; default: return DefWindowProc(hWnd,msg,wParam,lParam); } return 0; }
m.f.G.
Pablo