Heb al een tijdje een probleem met mijn List View (wat een rotdingen zijn dat). Ben al een avondje bezig om subitems bij de kolommen te krijgen, maar het wil nog niet echt.
Hier m'n code voor de handigheid. Eerst de code die de kolommen maakt.
Dan WM_NOTIFY, wat voor het maken van lijst-subitems gebruikt wordt:
Dan de code die volgt na de 'Voeg toe'-knop:
Elke keer als ik WM_NOTIFY onderschep, of er nou alleen maar een break staat of die hele lap van daarboven, gaat meneer ListView (HWND hNote) raar doen. Selecteren werkt niet meer, kolommen willen niet meer verplaatsen, rare artefacten bij slepen items, enzovoorts.
Hier een plaatje van het geheel:

Die grote List View in het midden wordt dus zoals gezegd kreupel doordat ik WM_NOTIFY onderschep, alleen al door hem bij WndProc te vermelden met bijvoorbeeld alleen een break.
Dus, ehm, zijn er hier mensen die wel een List View met Win32 API mèt kolommen aan de gang hebben gekregen, en zouden die me kunnen uitleggen wat hier fout gaat?
Hier m'n code voor de handigheid. Eerst de code die de kolommen maakt.
C++:
1
2
3
4
5
6
7
8
9
10
11
| LVCOLUMN lvc; char szText[256]; lvc.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM; for (int iCol = 0; iCol < 4; iCol++) { lvc.iSubItem = iCol; lvc.pszText = szText; lvc.cx = 100; // width of column in pixels lvc.fmt = LVCFMT_LEFT; LoadString(GetModuleHandle(NULL),IDS_FIRSTCOLUMN + iCol,szText,sizeof(szText)/sizeof(szText[0])); ListView_InsertColumn(hNote, iCol, &lvc); } |
Dan WM_NOTIFY, wat voor het maken van lijst-subitems gebruikt wordt:
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
| case WM_NOTIFY: { switch (((LPNMHDR) lParam)->code) { case LVN_GETDISPINFO: { NMLVDISPINFO* plvdi; plvdi = (NMLVDISPINFO*) lParam; switch (plvdi->item.iSubItem) { case 1: { plvdi->item.pszText = CijferRatioChar; break; } case 2: { plvdi->item.pszText = AantalFoutChar; break; } case 3: { plvdi->item.pszText = Cijfer; break; } } break; } } break; } |
Dan de code die volgt na de 'Voeg toe'-knop:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| case IDC_PUT: { char buf[32] = "Ratio: "; SendMessage(hRatio,WM_GETTEXT,6,(LPARAM)CijferRatioChar); strcat(buf,CijferRatioChar); SendMessage(hStatus, SB_SETTEXT, 1, (LPARAM)buf); char buf2[1024] = ""; SendMessage(hNote,WM_GETTEXT,1024,(LPARAM)buf2); SendMessage(hNaam,WM_GETTEXT,32,(LPARAM)name); if(strlen(name) > 0) { strcat(buf2,name); strcat(buf2,", "); } strcat(buf2,"Fout per punt: "); strcat(buf2,CijferRatioChar); strcat(buf2,", Aantal fout: "); SendMessage(hFouten,WM_GETTEXT,6,(LPARAM)AantalFoutChar); strcat(buf2,AantalFoutChar); strcat(buf2,", Cijfer: "); float CijferRatio = atof(CijferRatioChar); float AantalFout = atof(AantalFoutChar); float fCijfer = 10 - (AantalFout/CijferRatio); if(fCijfer < 1.0) { fCijfer = 1.0; } else if(fCijfer > 10.0) { fCijfer = 10.0; } sprintf(Cijfer,"%.1f",fCijfer); strcat(buf2,Cijfer); strcat(buf2,"\r\n"); // Lijstitems toevoegen LVITEM lvI; lvI.mask = LVIF_TEXT|LVIF_STATE; lvI.iSubItem = 0; lvI.state = 0; lvI.stateMask = 0; lvI.iItem = 1024; lvI.pszText = name; // Deze volgende regel veroorzaakt de WM_NOTIFY, LVN_GETDISPINFO van hierboven SendMessage(hNote,LVM_INSERTITEM,0,(LPARAM)&lvI); // Vullende balk SendMessage(hProgress,PBM_SETPOS,65536,0); break; } |
Elke keer als ik WM_NOTIFY onderschep, of er nou alleen maar een break staat of die hele lap van daarboven, gaat meneer ListView (HWND hNote) raar doen. Selecteren werkt niet meer, kolommen willen niet meer verplaatsen, rare artefacten bij slepen items, enzovoorts.
Hier een plaatje van het geheel:

Die grote List View in het midden wordt dus zoals gezegd kreupel doordat ik WM_NOTIFY onderschep, alleen al door hem bij WndProc te vermelden met bijvoorbeeld alleen een break.
Dus, ehm, zijn er hier mensen die wel een List View met Win32 API mèt kolommen aan de gang hebben gekregen, en zouden die me kunnen uitleggen wat hier fout gaat?
[ Voor 136% gewijzigd door Orwell op 02-06-2010 20:53 ]