I'm creating a SQL client with WinAPI. Every time a user submits a query, the current columns and items of my ListView
are deleted, then new columns and items are created based on the results of the query.
I've noticed through Visual Studio
heap profiler, that every time the columns and items are created, 3 objects and ~60 bytes are allocated, and I can't figure out why. Examining the snapshot suggests this has to do with adding SubItems via the ListView_SetItem
function (_ListView_OnSetItem
is the last thing I can identify in Stacks View).
The results I'm using to test with create 4 columns and 36 items/subitems.
To the best of my knowledge, I've implemented the ListView
stuff correctly. Still, here are my two functions that reset and populate the ListView
. Any help is appreciated.
void ResetListView(HWND hWnd) {
HWND hWndHdr = (HWND)SendMessage(GetDlgItem(hWnd, IDQ_LISTVIEW), LVM_GETHEADER, 0, 0);
int numColumns = (int)SendMessage(hWndHdr, HDM_GETITEMCOUNT, 0, 0L);
ListView_DeleteAllItems(GetDlgItem(hWnd, IDQ_LISTVIEW));
for (int i = 0; i < numColumns; i++)
ListView_DeleteColumn(GetDlgItem(hWnd, IDQ_LISTVIEW), 0);
}
void CreateListView(HWND hWnd, QueryResults * queryResults) {
LVCOLUMN lvc;
ZeroMemory(&lvc, sizeof(LVCOLUMN));
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_CENTER;
int numHeaders = queryResults->numHeaders;
// Add columns
for (int i = 0; i < numHeaders; i++) {
lvc.iSubItem = i;
lvc.pszText = queryResults->headers[i];
lvc.cx = 100;
ListView_InsertColumn(GetDlgItem(hWnd, IDQ_LISTVIEW), i, (LPARAM)&lvc);
}
LVITEM lvi;
ZeroMemory(&lvi, sizeof(LVITEM));
lvi.mask = LVIF_TEXT;
// Add items and subitems
for (int i = 0; i < queryResults->rows.size(); i++) {
lvi.iItem = i;
lvi.pszText = queryResults->rows[i]->cells[0];
lvi.iSubItem = 0;
ListView_InsertItem(GetDlgItem(hWnd, IDQ_LISTVIEW), (LPARAM)&lvi);
for (int j = 1; j < numHeaders; j++) {
lvi.pszText = queryResults->rows[i]->cells[j];
lvi.iSubItem = j;
ListView_SetItem(GetDlgItem(hWnd, IDQ_LISTVIEW), (LPARAM)&lvi);
}
}
return;
}