Italia
Foro

Gridbox - Maus- und Tastenwahl

 

Thomas
Freier
Im Moment seh Io l' Wald vor lauter Bäumen nicht und eine Lösung, wenn mit der Maus ein Item zum Mostra gewählt wurde, anschließend von dieser Pos. mit der Pfeiltaste weiter zu gehen. Lieg's am Subproc?
Mini-Beispiel:
' {$cleq}
 $H Windows.ph
 $H Messages.ph
 $H commctrl.ph
Declare text$,Font&,Navi&
Declare hGrid&
Declare x&,x%
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("commctrl_DragListMsg")
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SET("TRUECOLOR",1)
CLS RGB(255,255,255)
Font&=Create("Font","MS Sans Serif",16,0,0,0,0)
SETDIALOGFONT Font&
Windowstyle 538
Navi&=Create("Window",%hwnd,"",(%maxx-160),2,154,670)
Text$ = "Blätter;0;140"
hGrid&   = Create("GridBox", Navi&, text$, 0, 8, 8, 130, 356)
'Die Listbox per Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",hGrid&)
clearlist
AddString "Item 1"
AddString "Item 2"
AddString "Item 3"
AddString "Item 4"
AddString "Item 5"
AddString "Item 6"
AddString "Item 7"
AddString "Item 8"
MoveListToHandle(hGrid&)
SelectString(hGrid&,-1,GetString$(hGrid&,0))
LVSelect hGrid&,0
SEITE_ZEIGEN 0
@Set("FastMode", 1)
setfocus(Navi&)
SubClass navi&,1
AddHotKey 2020, 37, 0
AddHotKey 2022, 39, 0
AddHotKey 2021, 38, 0
AddHotKey 2023, 40, 0

while 1

    WaitInput 1
    Case %key=2:BREAK

    If (%menuitem=2020) OR (%menuitem=2021)'linke Pfeiltaste

        If GetCount(hGrid&)>0

            x%=GetCurSel(hGrid&)
            dec x%
            case x%<0: x%=(GetCount(hGrid&)-1)
            SelectString(hGrid&,-1,GetString$(hGrid&,x%))
            x%=GetCurSel(hGrid&)
            SEITE_ZEIGEN x%

        endIf'

        setfocus(navi&)

    ElseIf (%menuitem=2022) OR (%menuitem=2023)'rechte Pfeiltaste

        If GetCount(hGrid&)>0

            x%=GetCurSel(hGrid&)
            inc x%
            SelectString(hGrid&,-1,GetString$(hGrid&,x%))
            x%=GetCurSel(hGrid&)
            SEITE_ZEIGEN x%

        Endif

        setfocus(navi&)

    EndIf

EndWhile

SubClass navi&,0
@Set("FastMode", 0)
destroywindow(navi&)
DeleteObject Font&
destroywindow(%hwnd)
End

Proc SEITE_ZEIGEN

    Parameters x%
    var x1%= val(right$(GetString$(hGrid&,x%),1))
    case x1%=1: MCls 600, 800 ,RGB(255,255,100)
    case x1%=2: MCls 600, 800 ,RGB(255,255,0)
    case x1%=3: MCls 600, 800 ,RGB(255,0,100)
    case x1%=4: MCls 600, 800 ,RGB(255,0,255)
    case x1%=5: MCls 600, 800 ,RGB(255,100,100)
    case x1%=6: MCls 600, 800 ,RGB(100,255,0)
    case x1%=7: MCls 600, 800 ,RGB(0,255,100)
    case x1%=8: MCls 600, 800 ,RGB(255,0,0)
    MCopyBmp 0,0 - 800,600 > 0,0;0

EndProc

SubClassProc

    If SubClassMessage(navi&,DragMSG&)

        var Info# = New(DRAGLISTINFO)
        l% =  LV_HitTest(hgrid&,%mousex,%mousey)
        L.SubItem$=GetText$(hGrid&,LVHTI#.Item&,LVHTI#.SubItem&)
        Info# = &slParam

        If Info#.uNotification& = &DL_BEGINDRAG'Drag&Drop beginnt und Item merken

            FirstItem& = LVHTI#.Item&
            MoveString$ = GetText$(hGrid&,LVHTI#.Item&,LVHTI#.SubItem&)'Item-Text merken
            T_Tip&=Create("Tooltip",%hwnd,hGrid&,MoveString$)
            Set("WinProc", 0)
            ~SetCursor(MoveCursor&)
            Return &DL_COPYCURSOR

        ElseIf Info#.uNotification& = &DL_DRAGGING'Drag&Drop ist im Gange

            LastItem& = LVHTI#.Item&
            LvSelect  hGrid&,LastItem&
            Set("WinProc", 0)
            'Item markieren
            SendMessage(hGrid&,~Lb_SETCURSEL,LastItem&,0)
            ~SetCursor(MoveCursor&)

        ElseIf Info#.uNotification& = &DL_DROPPED'Drag&Drop ist beendet

            LastItem& = LVHTI#.Item&

            If Lastitem& <> -1

                IF Lastitem& <> Firstitem&

                    'das erste gemerkte Item löschen
                    DeleteString(hGrid&,FirstItem&)
                    'und an der Position des letzten gemerkten Items einfügen
                    InsertString(hGrid&,LastItem&,MoveString$)
                    Set("WinProc", 0)
                    LvSelect  hGrid&,LastItem&

                EndIf

                DestroyWindow(T_Tip&)
                SEITE_ZEIGEN LastItem&

            EndIf

        EndIf

    EndIf

EndProc

 
Gruß Thomas
Windows XP SP2, XProfan X2
07.12.2010  
 



Bei mir funktioniert das Programm "überhauptnicht" (XProfan11 32Bit XP SP2) -

ich bekomme auch im Kompilat garkeine GridBox zur Anzeige sondern nur ein gelbes hWnd und per Interpreter erhalte ich sofort einen Absturz.

Absturz im Interpreter bei

Übergibst an die API eine Def-Konstante - ist imho nicht unbedingt im Sinne des Erfinders - erwartet wird eine Speicheradresse und ne DEF-Konstante potuto da doch zu komplex sein - besser die Adresse eines einfachen Strings bzw. Speichers trasferimento.
 
07.12.2010  
 



Wenn ich
Var DragMSG& = ~RegisterWindowMessage("commctrl_DragListMsg")
schreibe funktionierts und ich kann in Interpreter und Kompilat mit Maus und Tastatur wählen - halt einfach die Adresse eines Strings trasferimento
 
07.12.2010  
 




Thomas
Freier
OK. War Andreas Code, der mit XP12 kein Problem bereitete.
Aber ich suche noch, wenn mit der Maus z.B.: Item5 markiert wurde und ich anschließend die Pfeil-Taste runter benutze auch Item6 markiert und angezeigt wird. Meist erfolgt der Sprung an den Anfang. Ist mir auch schon bei anderer Software aufgefallen, dass wenn etwas mit der Maus in der Tabelle gewählt wird beim Drücken der Taste Bild runter, ein Sprung zu Zeile 1 erfolgt.
 
Gruß Thomas
Windows XP SP2, XProfan X2
07.12.2010  
 



Habs nicht getestet aber teste doch mal obs hilft wenn Du nach dem D&D z.B. mit SelectString entsprechende Zeile markierst oder gar mal eine andere und wieder zurück.
 
07.12.2010  
 




Uwe
''Pascal''
Niemeier
Hi Thomas!

Mal 'ne ganz dumme Frage: Lassen sich die DragListBox-Messages überhaupt auf ListViews (GridBoxen) anwenden? Laut MSDN sind die doch per normale Listboxen vorgesehen?
Eigendlich sollte man doch per SubClassing die LVN_BEGINDRAG-Message des ListViews auswerten?

SeeYou
Pascal
 
08.12.2010  
 




Thomas
Freier
He Pascal,
die Antwort muß ich dir schuldig bleiben, da ich bisher nur mit Franks ListView.dll gearbeitet habe und in diesem Fall es ohne machen wollte. Ein Beispiel von Andreas führte zum gewünschten Ergebnis. Nur bekomme ich jetzt Probleme bei der "Tastensteuerung".
Aber du bist ja LV Spezi und siehst vielleicht eine Lösung.
 
Gruß Thomas
Windows XP SP2, XProfan X2
08.12.2010  
 




Uwe
''Pascal''
Niemeier
Hi Thomas!

Standartmäßig kann man ja in jeder Art von Liste mit der Tastatur navigieren, wenn das betreffende Control den Focus hat.
Darum wäre die einfachste Lösung, relevante Tastendrücke im Hauptfenster  per SetFocus(Liste&) & SendKey(Liste&,Key%) an die Liste weiterzuleiten.
Allerdings erkennt XProfan dabei möglicherweise nicht, das die Auswahl geändert wurde, wenn die Liste erstmal den Focus hat und behält (WaitInput wird nicht durchbrochen).
Also entweder nach SendKey den Focus wieder auf's Hauptfenster legen oder sowas versuchen (hab's mit deinem Code noch nicht getestet):
settimer 100

while 1'--------------Beginn Eingabeschleife

    waitinput
    Neu%=getcursel(Liste&)

    if Neu%<>Alt%

        Alt%=Neu%
        '---Irgendeine Reaktion auf geänderte Auswahl

    endif

    '---Weitere Abfragen per Bedienungselemente usw.

endif'----------------Ende Eingabeschleife


Eleganter wäre allerdings eine entsprechende Ereignis-Auswertung per SubClassing.
Ich werd' da mal was vorbereiten

HTH
Pascal
 
09.12.2010  
 




Thomas
Freier
Bin schon gespannt.
Einiges hatte ich naturalmente schon versucht, diesen "Schönheitsfehler" zu beheben. Möglich auch, dass ein vorhandenes EDIT bei meinen Lösungen ausbremsend war. Ich hatte es im Beispiel weg gelassen, und kann es zur Not in einen eigenen Dialog packen.
 
Gruß Thomas
Windows XP SP2, XProfan X2
09.12.2010  
 




Uwe
''Pascal''
Niemeier
Hi Thomas!

Habe mal ein paar Beispiele per Drag&Drop ( aktuelles XProfan 12 ) zusammengestellt.

Herunterladen
externer Download


Die Umleitung der Tasten von Hwnd auf die jeweilige Liste erfolgt dabei immer nach dem gleichen oben erwähnten Prinzip per SubClassing, ebenso die Auswertung der neuen Auswahl. Unterschiedlich sind eigendlich nur die optischen Effekte. Vielleicht hilft es dir weiter.
PS: Habe mir erlaubt, den Trick mit dem ToolTip zu klauen

SeeYou
Pascal

8 kB
Version:1
Kurzbeschreibung: Drag&Drop-Demos XProfan 12
Hochgeladen:14.12.2010
Downloadcounter218
Herunterladen
 
14.12.2010  
 




Thomas
Freier
He Pascal,
feine Sache, die du zusammengestellt hast.
Aufgefallen ist mir, dass bei Anwahl kleine Reaktionspausen entstehen.
Nun bin ich mir noch unsicher, wie ich weiter verfahre.

Ein kleines Beispiel beigepackt. Nur, wenn auch noch mit einem kleinen Fehler, die Ansicht-Zeitung-1m.exe hat Endstand. Nach dem Start bitte erst einmal die Pfade zu den PNG- und ODT-File anlegen. Wer hat, kann dann zum Testen/Bearbeiten, eine OpenOffice.exe verknüpfen und die File dann auch als PDF speichern (Pfad dann einrichten). Die zur Anzeige benötigten PNG-File können circa IrfanView, wenn er PDFs öffnen kann, oder einen PDF-Reader (z.B.: Portable PDFXCview.exe) erstellt werden. Das Ganze mag umständlich klingen, aber leider gelang es mir noch nicht eine beliebige halbe PDF-Seite anzuzeigen.

3.838 kB
Hochgeladen:15.12.2010
Downloadcounter323
Herunterladen
 
Gruß Thomas
Windows XP SP2, XProfan X2
15.12.2010  
 




Dieter
Zornow
Also mit der Setcurselversion habe ich unter Win7 immer einen Absturz. Der Drop-Cursor erscheint dann kann ich klicken oder was auch immer, es passiert nichts mehr. Kann dann nur noch mit dem Taskmanager beenden. Ist aber schon so mit dem Originalcode von Pascal.
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
15.12.2010  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

17.780 Views

Untitledvor 0 min.
H.Brill26.01.2022
Sven Bader11.07.2021
Ralf Netz22.05.2021
ByteAttack02.12.2018
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie