'ListView_SetSelectionMark' funktioniert nicht
-
Hi,
Das Macro: ListView_SetSelectionMark funktioniert bei mir irgendwie nicht

Ich hab`s auch schon mit der Funktion SendMessage versucht aber da passiert nichts, und ich hab für commctrl.h die Konstante #define _WIN32_IE 0x0400 definiert damit ich dieses Macro überhaupt nutzen kann.
Fehlt da noch was?#define _WIN32_IE 0x0400 #include <windows.h> #include <commctrl.h> /* #define LISTVIEW_ID ... HWND hParentWnd = ... HINSTANCE hInstance = ... */ HWND hListview = CreateWindow(WC_LISTVIEW, "LISTVIEW CONTROL", WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT | LVS_SINGLESEL, 10, 10, 100, 100, hParentWnd, (HMENU) LISTVIEW_ID, hInstance, NULL );
-
LukasBanana schrieb:
Fehlt da noch was?
Hast du die comctl32.lib zu deinem Programm gelinkt?
-
Ja das hab ich.
Wie gesagt, der Funktionsaufruf verursacht keinen Fehler, der Compiler erkennt die Funktion, aber sie ändert absolut nichts an meinem Programm.
-
Was willst du denn das passiert?
The selection mark is the item index from which a multiple selection starts. This macro does not affect the selection state of the item.
Wenn du ein Item selektiren willst benutze ListView_SetItemState mit LVIS_SELECTED, Informationen über das Makro gibt es natürlich in der MSDN

schirrmie
-
Okay, es ist nur so: um die Selektion eines Items abzufragen verwendete ich ListView_GetSelectionMark, und da dachte ich, ich benötige nur das Gegenteil mit "Set" anstatt "Get"
Aber wie soll der Code denn aussehen? Ich hab das schon mal geraten bekommen und auch ausprobiert, aber ich hab nicht ganz verstanden wie das aussehen soll.
Kann mir da mal jemand einen kleinen Code zeigen?!
-
Ich meine, was soll ich z.B. für UINT mask einsetzten?
-
Hast du denn bei mask schonmal LVIS_SELECTED probiert?
-
Ich dachte das währe für state, was soll ich denn dann bei state angeben?
-
Das gleiche

Ich habe mir das in der MSDN angeguckt, und da da keine Extra-Flags für mask stehen, gehe ich davon aus, dass die Flags sowohl für state als auch für mask gelten
-
Ich muss zugeben das es in der MSDN schlecht erklärt ist finde ich aber ok hab sowieso ne alte kann sein das es in der neuen besser erklärt ist.
Das hier sollte es dir aber zeigen, es ist von CodeProject.comSelect Item: ListView_SetItemState(hList, -1, 0, LVIS_SELECTED); // deselect all items SendMessage(hList,LVM_ENSUREVISIBLE , (WPARAM)item,FALSE); // if item is far, scroll to it ListView_SetItemState(hList,item, LVIS_SELECTED ,LVIS_SELECTED); // select item ListView_SetItemState(hList,item, LVIS_FOCUSED ,LVIS_FOCUSED); // optional Select All Item: ListView_SetItemState(hList, -1, 0, LVIS_SELECTED); // deselect all items ListView_SetItemState(hList,-1, LVIS_SELECTED ,LVIS_SELECTED);schirrmie
-
Okay, es funktioniert endlich

Allerdings muss ich dann selbst scrollen um die Position auch mit dem Scrollbar einheitlich zu machen
Danke
-
// auszug aus meinen WinAPI wrapper
bool CListsControl::SelItem(const unsigned int& uiPos) { LV_ITEM itemstate; itemstate.mask = LVIF_STATE; itemstate.iItem = uiPos; itemstate.stateMask = LVIS_SELECTED; ::SendMessage(m_Handle, LVM_SETITEMSTATE, uiPos, reinterpret_cast<LPARAM>(&itemstate)); return true; }