SendMessage Windowsfunktion mit LVM_GETCOLUMNORDERARRAY

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

danielos

Betreff: SendMessage Windowsfunktion mit LVM_GETCOLUMNORDERARRAY

BeitragSo, Jan 11, 2009 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

ich habe ein bisschen mit verschiedenen Styles für Listboxen und der SendMessageW - Funktion herumgespielt, zum Beispiel, das man die Columns (bei mehreren Spalten) beliebig verschieben kann.
Funktioniert soweit auch ganz gut, nur benötige ich beim Einfügen von Einträgen in die Listbox jetzt die aktuelle Reihenfolge der Columns.
Dafür gibt es laut MSDN auch eine Konstante ( LVM_SETCOLUMNORDERARRAY ) für die SendMessage - Funktion, nur verstehe ich die Funktionsweise nicht ganz, da ein Integer-Array zurückgeliefert werden soll, aber mithilfe eines Pointers oder so, da steig ich dann aus Confused

Wie (wenn überhaupt) lässt sich das Problem lösen ?

Quelle bei MSDN:
http://msdn.microsoft.com/de-de/library/bb761161(en-us,VS.85).aspx

Ich danke für Antworten,

MfG

Daniel
  • Zuletzt bearbeitet von danielos am So, Jan 11, 2009 22:40, insgesamt einmal bearbeitet

Suco-X

Betreff: .....

BeitragSo, Jan 11, 2009 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Ich denke wenn du die Reihenfolge erhalten willst musst du GET und nicht SET benutzen, also musst du mit LVM_GETCOLUMNORDERARRAY arbeiten. Übrigens kannst du jede Adresse (Pointer) auch in einen Integer umwandeln und so mit der SendMessage Funktion übergeben. Die Funktion schreibt dir dann in diese Adresse die benötigten Daten, soweit alles richtig übergeben wurde.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

danielos

BeitragSo, Jan 11, 2009 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort...

ich hab mich wohl verschrieben, natürlich meinte ich LVM_GETCOLUMNORDERARRAY Confused

Leider hilft mir das immer noch nicht wirklich weiter....

Suco-X

Betreff: ....

BeitragSo, Jan 11, 2009 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend.
Sende halt mal deinen Code, da könnte man dir sicher auf die schnelle mehr helfen.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

danielos

BeitragSo, Jan 11, 2009 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab hier mal das Prinzip des Codes zusammengeschrieben, nicht gerade brilliant, aber es geht ja nur ums Prinzip:

Code: [AUSKLAPPEN]

Import maxgui.drivers
SuperStrict

Local window:TGadget = CreateWindow("Listbox" , 0 , 0 , 800 , 600 , Null , WINDOW_CENTER | 15)

Local listbox:TGadget = CreateListBox(10 , 10 , 500 , 500 , window)


Global listboxHwnd:Int = QueryGadget(listbox,QUERY_HWND)
Global ListBoxstyle:Int = LVS_REPORT | LVS_EDITLABELS

SetHeading(0 , "Spalte 3" , 100)
SetHeading(0 , "Spalte 2" , 100 , LVM_INSERTCOLUMNW)
SetHeading(0 , "Spalte 1" , 100 , LVM_INSERTCOLUMNW)



' SendMessageW(listboxHwnd,  LVM_GETCOLUMNORDERARRAY , ? , ?) Hier wird Hilfe benötigt ^^

Repeat
   If WaitEvent() = EVENT_WINDOWCLOSE End
forever



Function SetHeading(column:Int, heading$, width:Int, action:Int = LVM_SETCOLUMNW)
   
      Local col:LVCOLUMNW = New LVCOLUMNW
      Local columnHeading:TColumnHeading[1]   
      columnHeading[column] = New TColumnHeading
      columnHeading[column].width = width
      
      If columnHeading[Column].width = 0 Then
         Col.mask = LVCF_TEXT| LVCF_FMT
      Else
         Col.mask = LVCF_TEXT| LVCF_FMT | LVCF_WIDTH
         col.cx   = columnHeading[Column].width
      End If
      
      col.pszText = heading$.ToWString()
      
      Local ListBoxstyle:Int = GetWindowLongW(ListboxHwnd , GWL_STYLE)

      
      If (ListBoxstyle &  LVS_NOCOLUMNHEADER ) Then
         ListBoxstyle  = ListBoxstyle  ~LVS_NOCOLUMNHEADER
         If ListBoxstyle & LVS_EDITLABELS = 0 Then ListBoxstyle = ListBoxstyle | LVS_REPORT
         SetWindowLongW(ListboxHwnd , GWL_STYLE , ListBoxstyle) 'Headings aktivieren
         
         SendMessageW(listboxhwnd , LVM_SETEXTENDEDLISTVIEWSTYLE , 0 , LVS_EX_HEADERDRAGDROP   )  ' Zum verschieben von Columns
         
      End If
      
      SendMessageW(ListboxHwnd, action, Column, Int(Byte Ptr Col))
      

End Function


Type TColumnHeading
   Field width:Int
   Field sortDir:Int = 1
EndType


Ich hab den notwendigen Befehl als Kommentar hingeschrieben, da er ja nicht funktioniert Confused


MfG

Daniel

Suco-X

Betreff: ....

BeitragMo, Jan 12, 2009 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.
Code: [AUSKLAPPEN]


Import maxgui.drivers
SuperStrict

Local window:TGadget = CreateWindow("Listbox" , 0 , 0 , 800 , 600 , Null , WINDOW_CENTER | 15)

Local listbox:TGadget = CreateListBox(10 , 10 , 500 , 500 , window)


Global listboxHwnd:Int = QueryGadget(listbox,QUERY_HWND)
Global ListBoxstyle:Int = LVS_REPORT | LVS_EDITLABELS

SetHeading(0 , "Spalte 3" , 100)
SetHeading(0 , "Spalte 2" , 100 , LVM_INSERTCOLUMNW)
SetHeading(0 , "Spalte 1" , 100 , LVM_INSERTCOLUMNW)





'Ein Integer Array mit 3 Einträgen wird erstellt und die Adresse
'an die Funktion übergeben. Die WinAPI schreibt die Information dort rein

Local buf:Int[3]
SendMessageW(listboxHwnd,  LVM_GETCOLUMNORDERARRAY , buf.length, Int(Varptr(buf[0])))

'Testweise eine Ausgabe der Reihenfolge
For Local i:Int = 0 Until buf.length
   Print buf[i]
Next


'Änderung, um den Effekt zu sehen
buf[0] = 2
buf[1] = 1
buf[2] = 0
SendMessageW(listboxHwnd,  LVM_SETCOLUMNORDERARRAY , buf.length, Int(Varptr(buf[0])))



'Erneute Ausgabe
SendMessageW(listboxHwnd,  LVM_GETCOLUMNORDERARRAY , buf.length, Int(Varptr(buf[0])))
For Local i:Int = 0 Until buf.length
   Print buf[i]
Next

Repeat
   If WaitEvent() = EVENT_WINDOWCLOSE End
Forever



Function SetHeading(column:Int, heading$, width:Int, action:Int = LVM_SETCOLUMNW)
   
      Local col:LVCOLUMNW = New LVCOLUMNW
      Local columnHeading:TColumnHeading[1]   
      columnHeading[column] = New TColumnHeading
      columnHeading[column].width = width
     
      If columnHeading[Column].width = 0 Then
         Col.mask = LVCF_TEXT| LVCF_FMT
      Else
         Col.mask = LVCF_TEXT| LVCF_FMT | LVCF_WIDTH
         col.cx   = columnHeading[Column].width
      End If
     
      col.pszText = heading$.ToWString()
     
      Local ListBoxstyle:Int = GetWindowLongW(ListboxHwnd , GWL_STYLE)

     
      If (ListBoxstyle &  LVS_NOCOLUMNHEADER ) Then
         ListBoxstyle  = ListBoxstyle  ~LVS_NOCOLUMNHEADER
         If ListBoxstyle & LVS_EDITLABELS = 0 Then ListBoxstyle = ListBoxstyle | LVS_REPORT
         SetWindowLongW(ListboxHwnd , GWL_STYLE , ListBoxstyle) 'Headings aktivieren
         
         SendMessageW(listboxhwnd , LVM_SETEXTENDEDLISTVIEWSTYLE , 0 , LVS_EX_HEADERDRAGDROP   )  ' Zum verschieben von Columns
         
      End If
     
      SendMessageW(ListboxHwnd, action, Column, Int(Byte Ptr Col))
     

End Function


Type TColumnHeading
   Field width:Int
   Field sortDir:Int = 1
EndType


So in etwa?
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Suco-X

Betreff: ....

BeitragMo, Jan 12, 2009 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte entfernen, wurde oberer Post wurde 2 mal gesendet,
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

danielos

Betreff: Danke!

BeitragMo, Jan 12, 2009 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey super vielen Dank Smile

jetzt kann ich mich in kompliziertere Funktionen für die Columns stürzen Smile

Danke!

Danielos

Suco-X

Betreff: ....

BeitragMo, Jan 12, 2009 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Np.
Hoffe du hast auch die Funktionsweise richtig verstanden, also das Spiel mit der WinAPI und Pointern.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group