Forum | | | | - Seite 1 - |
| Thomas Freier | Angelehnt an Andreas Beispiel für eine Listbox wollte ich aus optischen Gründen auch einen Merker haben. Leider kann ich ihn nicht dazu bewegen, dass er sich bewegt. Wie gehts ?
$H Windows.ph
$H Messages.ph
$H ListView.ph
$H commctrl.ph
DEF $DRAGLISTMSGSTRING "commctrl_DragListMsg"
DEF &DL_BEGINDRAG 1157
DEF &DL_DRAGGING 1158
DEF &DL_DROPPED 1159
DEF &DL_MOVECURSOR 3
DEF &DL_COPYCURSOR 2
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,l%,L.SubItem$
Dim LVHTI#,LVHitTestInfo
Proc LV_HitTest
Parameters LV&,X%,Y%
~GetCursorPos(LVHTI#)
~ScreenToClient(LV&,LVHTI#)
SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
Return LVHTI#.SubItem&
EndProc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proc LvDeSelect'deselectieren
parameters Lv&,Item&
Declare s#
dim s#,1024
long s#,12=0
long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
dispose s#
endproc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proc LvSelect'selectieren
parameters Lv&,Item&
Declare s#
dim s#,1024
long s#,12=$2
long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
sendmessage(lv&,~LVM_SETHOTITEM ,item&,0)
sendmessage(lv&,~LVM_ENSUREVISIBLE ,Item&,0)
dispose s#
endproc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct POINT = X&,Y&
Struct DRAGLISTINFO = uNotification&,hWnd&,ptCursor!POINT
Var FirstItem& = 0
Var LastItem& = 0
Var MoveString$ = ""
Var MoveCursor& = ~LoadCursor(~GetModuleHandle("shell32.dll"),1003)
'Genau diese spezielle Meldung muss registiert werden
'damit das Fenster die Drag&Drop Operationen verarbeiten kann.
Var DragMSG& = ~RegisterWindowMessage($DRAGLISTMSGSTRING)
CLS
SetDialogFont ~GetStockObject(~ANSI_VAR_FONT)
Var Ende& = 0
Var dlg& = @Create("ChildWindow", %hwnd, "Liste", 80, 60,300,300)
var Text$ = "Name;0;140"
var draglist& = Create("GridBox", dlg&, text$, 0, 80, 14, 100, 220)
'Die Listbox für Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",Draglist&)
Addstring(Draglist&,"Eintrag")
Addstring(Draglist&,"Auftrag")
Addstring(Draglist&,"Anton")
Addstring(Draglist&,"Otto")
Addstring(Draglist&,"Werner")
Addstring(Draglist&,"Karl")
SubClass dlg&,1
WhileNot Ende&
Waitinput
EndWhile
SubClass dlg&,0
end
SubClassProc
If SubClassMessage(dlg&,DragMSG&)
Var Info# = New(DRAGLISTINFO)
locate 0,0
l% = LV_HitTest(Draglist&,%mousex,%mousey)
L.SubItem$=GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)
Info# = &slParam
If Info#.uNotification& = &DL_BEGINDRAG'Drag&Drop beginnt und Item merken
FirstItem& = LVHTI#.Item&
print FirstItem&, " nach "
'Marker zeichnen, muss nicht sein, erhöht aber die Sichtbarkeit
External("comctl32.dll","DrawInsert",dlg&,Draglist&,Firstitem&)
MoveString$ = GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)'Item-Text merken
Set("WinProc", 0)
~SetCursor(MoveCursor&)
Return &DL_COPYCURSOR
ElseIf Info#.uNotification& = &DL_DRAGGING'Drag&Drop ist im Gange
LastItem& = LVHTI#.Item&
locate 0,10
Print LastItem&
LvSelect Draglist&,LastItem&
'Marker neuzeichnen
External("comctl32.dll","DrawInsert",dlg&,Draglist&,LastItem&)
Set("WinProc", 0)
'Item markieren
SendMessage(DragList&,~Lb_SETCURSEL,LastItem&,0)
~SetCursor(MoveCursor&)
ElseIf Info#.uNotification& = &DL_DROPPED'Drag&Drop ist beendet
LastItem& = LVHTI#.Item&
If Lastitem& <> -1
'Marker entfernen
External("comctl32.dll","DrawInsert",dlg&,Draglist&,-1)
'das erste gemerkte Item löschen
DeleteString(DragList&,FirstItem&)
'und an der Position des letzten gemerkten Items einfügen
InsertString(DragList&,LastItem&,MoveString$)
Set("WinProc", 0)
LvSelect Draglist&,LastItem&
EndIf
EndIf
EndIf
EndProc
|
| | | | |
| | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | Andreas Miethe
| Thomas Freier (11/21/10)
Angelehnt an Andreas Beispiel für eine Listbox wollte ich aus optischen Gründen auch einen Merker haben. Leider kann ich ihn nicht dazu bewegen, dass er sich bewegt. Wie gehts ?
Hallo Thomas,
für Listviews ist das auch nicht gedacht. Dafür nimmt man Insert-Marks
$H Windows.ph
$H Messages.ph
'$H ListView.ph
$H commctrl.ph
DEF &LVM_SETINSERTMARK 4262
Struct LVINSERTMARK = cbSize&,dwFlags&,iItem&,dwReserved&
DEF $DRAGLISTMSGSTRING "commctrl_DragListMsg"
DEF &DL_BEGINDRAG 1157
DEF &DL_DRAGGING 1158
DEF &DL_DROPPED 1159
DEF &DL_MOVECURSOR 3
DEF &DL_COPYCURSOR 2
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,l%,L.SubItem$
Dim LVHTI#,LVHitTestInfo
Proc LV_HitTest
Parameters LV&,X%,Y%
~GetCursorPos(LVHTI#)
~ScreenToClient(LV&,LVHTI#)
SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
Return LVHTI#.SubItem&
EndProc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Proc LvDeSelect'deselectieren
Parameters Lv&,Item&
Declare s#
Dim s#,1024
LONG s#,12=0
LONG s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
dispose s#
EndProc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Proc LvSelect'selectieren
Parameters Lv&,Item&
Declare s#
Dim s#,1024
LONG s#,12=$2
LONG s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
sendmessage(lv&,~LVM_SETHOTITEM ,item&,0)
sendmessage(lv&,~LVM_ENSUREVISIBLE ,Item&,0)
dispose s#
EndProc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct POINT = X&,Y&
Struct DRAGLISTINFO = uNotification&,hWnd&,ptCursor!POINT
Var FirstItem& = 0
Var LastItem& = 0
Var MoveString$ = ""
Var MoveCursor& = ~LoadCursor(~GetModuleHandle("shell32.dll"),1003)
'Genau diese spezielle Meldung muss registiert werden
'damit das Fenster die Drag&Drop Operationen verarbeiten kann.
Var DragMSG& = ~RegisterWindowMessage($DRAGLISTMSGSTRING)
CLS
SetDialogFont ~GetStockObject(~ANSI_VAR_FONT)
Var Ende& = 0
Var dlg& = @Create("ChildWindow", %hwnd, "Liste", 80, 60,300,300)
Var Text$ = "Name;0;140"
Var draglist& = Create("GridBox", dlg&, text$, 0, 80, 14, 100, 220)
'Die Listbox für Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",Draglist&)
Addstring(Draglist&,"Eintrag")
Addstring(Draglist&,"Auftrag")
Addstring(Draglist&,"Anton")
Addstring(Draglist&,"Otto")
Addstring(Draglist&,"Werner")
Addstring(Draglist&,"Karl")
SubClass dlg&,1
WhileNot Ende&
Waitinput
EndWhile
SubClass dlg&,0
End
SubClassProc
If SubClassMessage(dlg&,DragMSG&)
Var structInsertMark# = New(LVINSERTMARK)
structInsertMark#.cbSize& = 16
structInsertMark#.dwFlags& = 1'LVIM_AFTER
structInsertMark#.dwReserved& = 0
Var Info# = New(DRAGLISTINFO)
locate 0,0
l% = LV_HitTest(Draglist&,%mousex,%mousey)
L.SubItem$=GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)
Info# = &slParam
If Info#.uNotification& = &DL_BEGINDRAG'Drag&Drop beginnt und Item merken
FirstItem& = LVHTI#.Item&
print FirstItem&, " nach "
'Marker zeichnen, muss nicht sein, erhöht aber die Sichtbarkeit
structInsertMark#.iItem& = -1
SendMessage(Draglist&, &LVM_SETINSERTMARK, 0,structInsertMark#)
MoveString$ = GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)'Item-Text merken
Set("WinProc", 0)
~SetCursor(MoveCursor&)
Return &DL_COPYCURSOR
ElseIf Info#.uNotification& = &DL_DRAGGING'Drag&Drop ist im Gange
LastItem& = LVHTI#.Item&
locate 0,10
Print LastItem&
LvSelect Draglist&,LastItem&
'Marker neuzeichnen
structInsertMark#.iItem& = LastItem&
SendMessage(Draglist&, &LVM_SETINSERTMARK, 0,structInsertMark#)
Set("WinProc", 0)
'Item markieren
SendMessage(DragList&,~Lb_SETCURSEL,LastItem&,0)
~SetCursor(MoveCursor&)
ElseIf Info#.uNotification& = &DL_DROPPED'Drag&Drop ist beendet
LastItem& = LVHTI#.Item&
If Lastitem& <> -1
'das erste gemerkte Item löschen
DeleteString(DragList&,FirstItem&)
'und an der Position des letzten gemerkten Items einfügen
InsertString(DragList&,LastItem&,MoveString$)
Set("WinProc", 0)
LvSelect Draglist&,LastItem&
EndIf
EndIf
EndIf
EndProc
|
| | | Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 21.11.2010 ▲ |
| | |
| | Thomas Freier | Hallo Andreas. Danke für die schnelle Reaktion. Leider bekomme ich keinen Merker zu sehen ??? |
| | | | |
| | Andreas Miethe
| Hallo Thomas,
laut MS funktioniert das nur im Iconview,SmallIconview und Tileview, also nicht als Liste. Das gilt scheinbar nicht mehr ab Vista, da funktioniert es auch mit Liste, daher habe ich nicht weiter probiert. Mit XP funktioniert es wohl nicht
Ich habe hier Vista auf dem Laptop und es geht bestens, man kann sogar die Farbe der Insertmark festlegen. |
| | | Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 21.11.2010 ▲ |
| |
| | | Bei mir unter XP sehe ich beim Code von Thomas (aber auch nur wenn ich per Interpreter ablaufen lasse) immerhin solch Pfeil während ich dragge:
der aber an dieser Position klebt bzw. sich nicht bewegt. |
| | | | |
| | Dieter Zornow | Mit Win 7 sehe ich auch keinen Pfeil |
| | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 21.11.2010 ▲ |
| |
| | Thomas Freier | Ich werde auf den Merker verzichten und mal nach einer Möglichkeit suchen, dass wenn D&D eingeleitet wird die zu verschiebende Zeile andersfarbig darzustellen und nach Ende von D&D wieder aufheben. Ist bei mir wie stochern im Nebel, da bisher nur mit der Listview.dll gearbeitet. |
| | | | |
| | | | | | | |
| | Thomas Freier | Hatte ich mir auch schon angesehen, wenn auch noch nicht abgearbeitet. Werde, warum nicht gleich, ToolTip einsetzen, hilft ja auch, falls vergessen, welcher Text verschoben werden sollte.
$H Windows.ph
$H Messages.ph
$H ListView.ph
$H commctrl.ph
DEF $DRAGLISTMSGSTRING "commctrl_DragListMsg"
DEF &DL_BEGINDRAG 1157
DEF &DL_DRAGGING 1158
DEF &DL_DROPPED 1159
DEF &DL_MOVECURSOR 3
DEF &DL_COPYCURSOR 2
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,l%,L.SubItem$,T_Tip&
Dim LVHTI#,LVHitTestInfo
Proc LV_HitTest
Parameters LV&,X%,Y%
~GetCursorPos(LVHTI#)
~ScreenToClient(LV&,LVHTI#)
SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
Return LVHTI#.SubItem&
EndProc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proc LvDeSelect'deselectieren
parameters Lv&,Item&
Declare s#
dim s#,1024
long s#,12=0
long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
dispose s#
endproc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proc LvSelect'selectieren
parameters Lv&,Item&
Declare s#
dim s#,1024
long s#,12=$2
long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
sendmessage(lv&,~LVM_SETHOTITEM ,item&,0)
sendmessage(lv&,~LVM_ENSUREVISIBLE ,Item&,0)
dispose s#
endproc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct POINT = X&,Y&
Struct DRAGLISTINFO = uNotification&,hWnd&,ptCursor!POINT
Var FirstItem& = 0
Var LastItem& = 0
Var MoveString$ = ""
Var MoveCursor& = ~LoadCursor(~GetModuleHandle("shell32.dll"),1003)
'Genau diese spezielle Meldung muss registiert werden
'damit das Fenster die Drag&Drop Operationen verarbeiten kann.
Var DragMSG& = ~RegisterWindowMessage($DRAGLISTMSGSTRING)
CLS
SetDialogFont ~GetStockObject(~ANSI_VAR_FONT)
Var Ende& = 0
Var dlg& = @Create("ChildWindow", %hwnd, "Liste", 80, 60,300,300)
var Text$ = "Name;0;140"
var draglist& = Create("GridBox", dlg&, text$, 0, 80, 14, 100, 220)
'Die Listbox für Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",Draglist&)
Addstring(Draglist&,"Eintrag")
Addstring(Draglist&,"Auftrag")
Addstring(Draglist&,"Anton")
Addstring(Draglist&,"Otto")
Addstring(Draglist&,"Werner")
Addstring(Draglist&,"Karl")
SubClass dlg&,1
WhileNot Ende&
Waitinput
EndWhile
SubClass dlg&,0
end
SubClassProc
If SubClassMessage(dlg&,DragMSG&)
Var Info# = New(DRAGLISTINFO)
locate 0,0
l% = LV_HitTest(Draglist&,%mousex,%mousey)
L.SubItem$=GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)
Info# = &slParam
If Info#.uNotification& = &DL_BEGINDRAG'Drag&Drop beginnt und Item merken
FirstItem& = LVHTI#.Item&
print FirstItem&, " nach "
MoveString$ = GetText$(Draglist&,LVHTI#.Item&,LVHTI#.SubItem&)'Item-Text merken
T_Tip&=Create("Tooltip",%hwnd,Draglist&,MoveString$)
Set("WinProc", 0)
~SetCursor(MoveCursor&)
Return &DL_COPYCURSOR
ElseIf Info#.uNotification& = &DL_DRAGGING'Drag&Drop ist im Gange
LastItem& = LVHTI#.Item&
locate 0,10
Print LastItem&
LvSelect Draglist&,LastItem&
Set("WinProc", 0)
'Item markieren
SendMessage(DragList&,~Lb_SETCURSEL,LastItem&,0)
~SetCursor(MoveCursor&)
ElseIf Info#.uNotification& = &DL_DROPPED'Drag&Drop ist beendet
LastItem& = LVHTI#.Item&
If Lastitem& <> -1
'das erste gemerkte Item löschen
DeleteString(DragList&,FirstItem&)
'und an der Position des letzten gemerkten Items einfügen
InsertString(DragList&,LastItem&,MoveString$)
Set("WinProc", 0)
LvSelect Draglist&,LastItem&
DestroyWindow(T_Tip&)
EndIf
EndIf
EndIf
EndProc
|
| | | | |
| | | Ich weiß nicht mehr in welchem Programm ich mal ListBox-Einträge mausverschiebbar gemacht habe aber dadurch das ich den Eintrag sofort nach Erreichen der neuen Zeile verschoben habe war eine weitere Kennzeichnung irgendwie garnicht notwendig.
Könnte man zusätzlich ja auch noch ein > an den Zeilenanfang der zu verschiebenden Zeile setzen. |
| | | | |
|
AntwortenThemenoptionen | 14.307 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |