SendMessage Windowsfunktion mit LVM_GETCOLUMNORDERARRAY
Übersicht

danielosBetreff: SendMessage Windowsfunktion mit LVM_GETCOLUMNORDERARRAY |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Antwort...
ich hab mich wohl verschrieben, natürlich meinte ich LVM_GETCOLUMNORDERARRAY ![]() Leider hilft mir das immer noch nicht wirklich weiter.... |
||
![]() |
Suco-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() MfG Daniel |
||
![]() |
Suco-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
danielosBetreff: Danke! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey super vielen Dank ![]() jetzt kann ich mich in kompliziertere Funktionen für die Columns stürzen ![]() Danke! Danielos |
||
![]() |
Suco-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group