ListView: Breite einer Spalte festsetzen
-
Hallo,
ich versuche vergeblich seit längerer Zeit die Breite der Spalten einer ListView festzusetzen. Mein Ansatz mitLVCFMT_FIXED_WIDTH
:... LV_COLUMN lvColumn; switch(Msg) { case WM_INITDIALOG: { lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; //Create the 1st column (checkbox column) lvColumn.iSubItem = 0; lvColumn.fmt = LVCFMT_LEFT | LVCFMT_FIXED_WIDTH; lvColumn.cx = 30; lvColumn.pszText = "x"; ListView_InsertColumn(hList, 0, &lvColumn); //Create the 2nd column (name list) lvColumn.iSubItem = 1; lvColumn.fmt = LVCFMT_LEFT | LVCFMT_FIXED_WIDTH; lvColumn.cx = 160; lvColumn.pszText = "Embedded elements"; ListView_InsertColumn(hList, 1, &lvColumn); ...
Wenn ich das so mach, dann wird nur die Breite der zweiten Spalte festgesetzt. Das kann ich gar nicht erklären... Wo liegt der Fehler? Oder gibt es noch andere Möglichkeiten? Noch ein kleiner Hinweis: in der ersten Spalte sollen später Checkboxes stehen. Hier ist der Code der ListView-Ressource:
CONTROL "", IDC_PROFILELIST, WC_LISTVIEW, WS_EX_CLIENTEDGE | WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_ALIGNLEFT | LVS_EX_CHECKBOXES | LVS_SHOWSELALWAYS, 25, 30, 125, 75
Danke.
-
Dir ist klar, dass es dise Funktion erst ab Vista gibt?
-
Ja, ich bin mir dessen bewusst. Wie gesagt, für die zweite Spalte funktioniert das.
-
Evtl. gilt die nachfolgende Aussage auch für andere Format Flags.
If a column is added to a list-view control with index 0 (the leftmost column), it is always LVCFMT_LEFT. Setting other flags on column 0 does not override that alignment. Therefore if you keep inserting columns with index 0, the text in all columns are left-aligned. If you want the first column to be right-aligned or centered you can make a dummy column, then insert one or more columns with index 1 or higher and specify the alignment you require. Finally delete the dummy column.
Folge mal dem Rat. Füge eine Dumy-Spalte 0 ein, dann eine "Deine Spalte 0" mit dem entsprechenden Format und lösche danach die Dummy-Spalte 0
-
Danke, das werde ich mir genauer anschauen.
-
Ok, ich wollte kein neues Thema wegen dieser Frage öffnen, deswegen poste ich einfach hier. Für die Interaktion mit einer ListBox habe ich Folgendes implementiert:
... case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_ACCESSLIST: { if (SendMessage(accListHandle, LB_GETCURSEL, 0, 0) >= 0) { //--> Aktion ...
Die Frage ist jetzt, warum wird denn die Aktion zweimal durchgeführt, und das unabhängig ob ich auf ein Element in der Listbox klicke oder irgendwo anders in der LB?
Danke.
-
ListBox != ListView. Ich verstehe Deine Frage nicht.
Du musst auch schon den Reason unterscheiden warum die WM_COMMAND Nachricht gesendet wird.
-
Martin Richter schrieb:
ListBox != ListView. Ich verstehe Deine Frage nicht.
Das ist mir schon klar.
Sie hat zwar mit dem Thema dieses Beitrags nur indirekt zu tun, aber ich dachte ich hätte meine Frage klar und verständlich gestellt.
Welchen Reason meinst du denn?
-
Eine WM_COMMAND Nachricht besteht aus 3 Teilen.
Handle, ID und Control-defined notification code.Letzteres steht im HIWORD. Dort findest Du LBN_SELCHANGE etc.
Du prüfst nur ob überhaupt irgendwas vom LB kommt. Das genügt nicht.
-
Danke erstmal. Ich habe den Code geändert:
... case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_ACCESSLIST: { if (SendMessage(accListHandle, LB_GETCURSEL, 0, 0) >= 0 && HIWORD(wParam) == LBN_SELCHANGE) { //--> Aktion ...
und damit wird die Aktion auch nur einmal ausgeführt
Das Problem ist jetzt nur noch, dass sie auch dann ausgeführt wird, wenn die Auswahl in der LB sich nicht verändert hat, obwohl die LB keinen multiselection-Style hat. Soll ich eine statische Variable zum Speichern der Auswahl anlegen und dann immer überprüfen oder habe ich einfach irgendwas vergessen? Und falls die Frage kommt, nein ich schicke nirgendwo eine LB_SETCURSEL-Nachricht ab. LBS_NOTIFY ist auch gesetzt.
Edit & offtopic @Martin: mir ist aufgefallen, dass du häufig jeden Satz in einem neuen Absatz anfängst, weshalb dann die Zeilen nicht sehr lang sind (Stichwort: die magische 80), was keineswegs schlecht ist. Kommt da etwa der Programmierer durch?
-
1. Würde ich die Prüfung umdrehen und nur dann LB_GETCURSEL machen wenn ich auch ein LB_SELCHANGE bekomme.
2. Mir ist nicht bekannt, dass LBN_SELCHANGE mehrfach gesendet wird, "obwohl" sichnichts ändert.
Was ist das problematische, an der Änderung der Selektion?PS: Kann sein, dass mein Schreibstil sich der Doku annähert. In dem Fall ist es die magische 90 bei mir