SetColumnWidth fails in virtual CListCtrl (only in comctl32.dll v6
Hi.
I've found a problem with setting width of a first column in virtual
(LVS_OWNERDATA style) listview control in a report mode (LVS_REPORT style).
Using LVSCW_AUTOSIZE value as a width parameter causes control to incorrectly
compute the width which leads to a text truncation.
This works correctly in comctl32.dll prior to 6.0 (5.82), as well as in
comctl32.dll 6.10 (Vista).
To simply reproduce this behavior using VS2005, follow these steps:
1. create a dialog-based MFC application
2. insert a listcontrol on a main dialog, set properties [Owner Data =
True], [View = Report]
3. create a member variable for a control, say "m_list"
4. In YourDialog::OnInitDialog, insert a column and set an item count
...
// TODO: Add extra initialization here
m_list.InsertColumn(0, L"First column"); // arbitrary name
m_list.SetItemCount(10); // arbitrary count
m_list.SetColumnWidth(0, 100); // arbitrary width
return TRUE; // return TRUE unless you set the focus to a control
5. using a property manager, define a handler for LVN_GETDISPINFO notification
void YourDialog::OnLvnGetdispinfoList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LV_ITEM& item = ((LV_DISPINFO*)pNMHDR)->item;
if (item.mask & LVIF_TEXT)
{
item.mask = LVIF_TEXT;
_tcsncpy(item.pszText, L"ABCD", item.cchTextMax - 1);
}
else
{
item.mask = 0;
}
item.stateMask = 0;
*pResult = 0;
}
6. build and run the application, ensure you're using XP-look (themed
controls in comctl32.dll v6.0)
7. double-click on a column divider to simulate a SetColumnWidth(0,
LVSCW_AUTOSIZE) message
8. you should see the "ABCD" text as "AB..."
I would be very pleased, if somebody can reproduce this behavior, to confirm
this bug. I didn't find any similar bug reports anywhere, which frightens me
a lot ;)
Of course, I would appreciate any workaround as well.
Thanks in advance