In borland c++ builder 2006:
Ik ben bezig met een listview (van windows, dus niet de tlistview van borland/vcl) te implementeren. Dit doe ik omdat de TListView van VCL veels te langzaam is bij grotere aantallen rijen. Nu plaats ik een listview op een TListView, dit doe ik zodat ik via designer de grootte en positie van de listview kan aangeven.
De listview is als volgt gecreeerd:
hAvailableList is een handle naar de nieuwe listview en lvAvailable is de TListView waar de list view overheen gelegd moet worden.
Om te zorgen dat ik van de listview messages kan afvangen heb ik de volgende code toegevoegd na de CreateWindowEx:
lvWndProc is ook een handle.
Daarna voeg ik nog 2 kolommen toe, wat geen probleem oplevert:
So far so good...
Het toevoegen van listitems is ook geen probleem:
Nu wil ik de messages afvangen door een functie ListViewProc te maken:
Dit stuk werkt dus niet
De OnColumnClick functie wordt geeneens aangeroepen (niet echt belangrijk wat daar in staat, want als ik maar eenmaal in die functie kan komen is het wel ok).
Ik heb half google rondgezocht, maar alles duidt erop dat bovenstaand moet werken, maar ik heb het idee dat de goede message niet doorkomt.
Een tweetal echte samples die ik vond hadden een DialogProc, welke in de WinMain was gezet, maar dat wil ik niet zo. Iemand die kan helpen?
Er zal wat overbodige code mogelijk hier en daar staan en da's niet zo erg... finetunen/optimaliseren komt wel nadat alles werkt.
Ik ben bezig met een listview (van windows, dus niet de tlistview van borland/vcl) te implementeren. Dit doe ik omdat de TListView van VCL veels te langzaam is bij grotere aantallen rijen. Nu plaats ik een listview op een TListView, dit doe ik zodat ik via designer de grootte en positie van de listview kan aangeven.
De listview is als volgt gecreeerd:
C++:
1
2
3
4
5
6
7
8
9
10
| DWORD dwStyle; dwStyle = LVS_REPORT | LVS_SINGLESEL | WS_VISIBLE | WS_CHILD | WS_VSCROLL; hAvailableList = CreateWindowEx(WS_EX_CLIENTEDGE, "SysListView32", "", dwStyle, 0, 0, lvAvailable->Width, lvAvailable->Height, lvAvailable->Handle, NULL, GetModuleHandle(NULL), NULL); |
hAvailableList is een handle naar de nieuwe listview en lvAvailable is de TListView waar de list view overheen gelegd moet worden.
Om te zorgen dat ik van de listview messages kan afvangen heb ik de volgende code toegevoegd na de CreateWindowEx:
C++:
1
2
| lvWndProc = (WNDPROC)GetWindowLong(hAvailableList, GWL_WNDPROC); SetWindowLong(hAvailableList, GWL_WNDPROC, (long)ListViewProc); |
lvWndProc is ook een handle.
Daarna voeg ik nog 2 kolommen toe, wat geen probleem oplevert:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
| LVCOLUMN lvc = { 0 }; lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT; lvc.fmt = LVCFMT_LEFT; lvc.iSubItem = 0; lvc.cx = 50; lvc.pszText = TEXT("Record"); ListView_InsertColumn(hAvailableList, 0, &lvc); lvc.iSubItem = 1; lvc.cx = 100; lvc.pszText = TEXT("Name"); ListView_InsertColumn(hAvailableList, 1, &lvc); |
So far so good...
Het toevoegen van listitems is ook geen probleem:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| char szText[64]; int nItem, nSubItem; LVITEM lvi; for (nItem = 0; nItem < 500; ++nItem) { sprintf(szText, "Item %d", nItem); lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iItem = nItem; lvi.iSubItem = 0; lvi.pszText = szText; lvi.cchTextMax = strlen(szText); lvi.lParam = nItem; ListView_InsertItem(hAvailableList, &lvi); // set up subitems for (nSubItem = 1; nSubItem < 2; ++nSubItem) { sprintf(szText, "Item %d.%d", nItem, nSubItem); lvi.mask = LVIF_TEXT; lvi.iItem = nItem; lvi.iSubItem = nSubItem; lvi.pszText = szText; lvi.cchTextMax = strlen(szText); ListView_SetItem(hAvailableList, &lvi); } } |
Nu wil ik de messages afvangen door een functie ListViewProc te maken:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| BOOL CALLBACK ListViewProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_NOTIFY: { switch (((LPNMHDR) lParam)->code) { case LVN_COLUMNCLICK: { OnColumnClick((LPNMLISTVIEW)lParam); } break; } } } return CallWindowProc((int(__stdcall*)())lvWndProc, hWnd, uMsg, wParam, lParam); } |
Dit stuk werkt dus niet
Ik heb half google rondgezocht, maar alles duidt erop dat bovenstaand moet werken, maar ik heb het idee dat de goede message niet doorkomt.
Een tweetal echte samples die ik vond hadden een DialogProc, welke in de WinMain was gezet, maar dat wil ik niet zo. Iemand die kan helpen?
Er zal wat overbodige code mogelijk hier en daar staan en da's niet zo erg... finetunen/optimaliseren komt wel nadat alles werkt.