Italia
Foro

Gridbox - Maus- und Tastenwahl

 
- Page 1 -



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  
 



 
- Page 1 -



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
Download
 
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  
 



 
- Page 2 -



Uwe
''Pascal''
Niemeier
Hi Leute!

@Thomas:


Aufgefallen ist mir, dass bei Anwahl kleine Reaktionspausen entstehen.


Asche auf mein Haupt!
Bei Cambiamento der Auswahl wird LVN_ITEMCHANGED drei (!) Mal empfangen und genauso oft die Auswertung aufgerufen.
Hier die korrigierte Version der SubClassProc per die Lv-Demos:
subclassproc'--------------------------------------------subclassproc

    if subclassmessage(%hwnd,~WM_KEYDOWN)'-----Taste in Hwnd

        if (&swparam>32)*((&swparam<41))'-------Navi-relevante Tasten

            setfocus(Lv&)
            sendkey(Lv&,&swparam)'---------------weiterleiten an ListView

        endif

    elseif subclassmessage(Dlg&,~WM_NOTIFY)'---Ereignis in Dialog   (&slparam => NMHDR-Struktur)

        if long(&slparam,0)=Lv&'----------------Ereignis in ListView (&slparam => NMLISTVIEW-Struktur)

            if long(&slparam,8)=~LVN_BEGINDRAG'--Drag & Drop mit linker Maustaste erkannt

                LvDragDrop(long(&slparam,12))'---Drag & Drop einleiten

            elseif long(&slparam,8)=~LVN_ITEMCHANGED'--Wechsel der Markierung erkannt

                case long(&slparam,20)=~LVIS_FOCUSED | ~LVIS_SELECTED:Auswertung(long(&slparam,12))'--Neue Auswahl

            endif

        endif

    endif

endproc'-------------------------------------------------------------


Ähnlich verhält es sich mit der DragListBox-Version. Da muß es am Ende der SubClassProc heißen:
...

elseif subclassmessage(Dlg&,~WM_COMMAND)'----Auswahl geändert

case hiword(&swparam)=~LBN_SELCHANGE:Auswertung

endif

endproc'-------------------------------------------------------------


Die TreeView-Demos sind allerdings nicht betroffen.

BTW: Was mir bei deinem Programm aufgefallen ist: Wenn ich mit der Maus circa die PicButtons gehe, verschwinden die Icons.
Der Grund potrebbe sein, daß du die IconHandles sofort nach Anlegen der Buttons freigibst. Die sollten aber erhalten bleiben bis zum Schluß.
Tipp: Wenn du die IconHandles nicht als Variablen bis zum Programmende mitschleppen willst, kannst du sie jederzeit circa das ButtonHandle ermitteln:
Icon&=sendmessage(Button&,~BM_GETIMAGE,~IMAGE_ICON,0)

@Dieter:


Also mit der Setcurselversion habe ich unter Win7 immer einen Absturz.


Kann ja nur in der Schleife liegen, in der auf Loslassen der Maustaste gewartet wird.
Vielleicht kannst du den Fehler eingrenzen?
Das Grundgerüst ist ja recht einfach:

Alles andere kannst du ja Stück per Stück auskommentieren
(Wird doch wohl nicht SetCurSel selbst sein??)
BTW: Es handelt sich ja (mal wieder) um Minimaldemos. Es würde durchaus Sinn machen, in dieser Schleife noch andere Abbruchbedingungen einzubauen ( Rechte Maustaste runter, ESC gedrückt usw.)

@ All: Sobald der von Dieter beschriebene Fehler erkannt ist, werde ich die ZIP aktualisieren.

SeeYou
Pascal
 
15.12.2010  
 




Dieter
Zornow
Ich denke mal, dass die Message WM_LBUTTONUP nie ankommt. Ich habe mir mal die Messages Mostra lassen 514 war nie dabei.

Ich teste übrigens mit der Beta XProfan X2
 
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  
 




Thomas
Freier
@Dieter, kannst du die AZ-LvDragDrop SetCurSel.exe einmal unter W7 testen ob der Fehler damit behoben ist.

PS.: EXE gelöscht, da geklärt.
 
Gruß Thomas
Windows XP SP2, XProfan X2
15.12.2010  
 




Dieter
Zornow
@Thomas: Mit der Exe gehts
 
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  
 




Thomas
Freier
In der habe ich
case %message=~WM_LBUTTONUP:break'--Maustaste wurde losgelassen

ersetzt durch
Def Getasynckeystate(1) !"USER32","GetAsyncKeyState"'Maustaste gedrückt ?

und dann in der Schleife
While Getasynckeystate(1)'1

    ~SetCursor(Cursor&)
    getmessage
    '   case %message=~WM_LBUTTONUP:break'--Maustaste wurde losgelassen
    ~GetCursorPos(HIT#)
 
Gruß Thomas
Windows XP SP2, XProfan X2
15.12.2010  
 



Statt getAsyncKeyState potrebbe auch iskey(1) funktionieren.
 
15.12.2010  
 




Dieter
Zornow
@Thomas

ist dir eigentlich schon aufgefallen, dass man nie auf den ersten Platz droppen kann ?
Muss wohl noch etwas geändert werden.
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
16.12.2010  
 




Uwe
''Pascal''
Niemeier
Hi Leute!


Ich denke mal, dass die Message WM_LBUTTONUP nie ankommt. Ich habe mir mal die Messages Mostra lassen 514 war nie dabei.


Und das betrifft nur die SetCurSel-Version? Das wird doch in allen List-und TreeView-Demos so gehandhabt
Aber die IsKey()-Idee scheint mir generell besser geeignet


ist dir eigentlich schon aufgefallen, dass man nie auf den ersten Platz droppen kann ?


Der bewegte Eintrag wird ja immer unter dem Ziel eingefügt. Wenn du den 1. Eintrag anpeilst, wird eben an Position 2 eingefügt. Danach obersten Eintrag eine Zeile tiefer ziehen; dann tauschen beide die Plätze - Fertig. Erschien mir eigendlich auch logisch so. Bei der TreeView-Version mit der Einfügemarke potuto man das vielleicht verbessern.

SeeYou
Pascal
 
16.12.2010  
 




Dieter
Zornow
Ich habe gerade mal die LvDragDrop DragImage.prf ausprobiert, da kommt die Message durch, keine Ahnung warum. Das Problem mit der Message scheint aber generell zu bestehen. Ich habe circa Probleme auch in Foren anderer Programmiersprachen gelesen, auch dort wurde dann als Alternative Getasynckeystate genommen.
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
16.12.2010  
 




Thomas
Freier

ist dir eigentlich schon aufgefallen, dass man nie auf den ersten Platz droppen kann ?


Ja, deshalb hatte ich die Zeile:
'   case Quelle&>Ziel&:Ziel&=Ziel&+1'---Quelle oberhalb von Ziel: Ziel verschiebt sich durch Löschen von Quelle
deaktiviert und dann geht es. Fehler hatte ich bisher noch nicht.
Pascal fand das Einfügen unter der gewählten Zeile logischer. Ist aber Ansichtssache.
 
Gruß Thomas
Windows XP SP2, XProfan X2
16.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.768 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