Can't SetItemStatus in dialog
Asila Salem -- ASalem_Ideal@nets.com.jo
Tuesday, March 04, 1997
Environment: VC++ 4.0, Windows 95
Hello.
It seem that there is a problem with programmatically setting the status of
an item in a list control in a dialog.
I'm displaying a CListCtrl in a modal dialog, in which I (try to) change
items' user-defined status and display the corresponding status icon.
When I call SetItemState for an item in the corresponding member list
control, I check with GetItemState that it has been set correctly. As soon as
a call to UpdateData(TRUE) or UpdateData(FALSE) is made, the item status is
reset to a value which I've never set(*).
The debugging sessions led to the following:
//m_lcStatusList is the member variable mapped
// to the list control in the dialog.
CListCtrl m_lcStatusList;
int nStatus = 0x00002000;
m_lcStatusList.SetItemState(nItem, LVIS_STATEIMAGEMASK, nStatus);
nStatus = m_lcStatusList.GetItemState(nItem , LVIS_STATEIMAGEMASK);
//nStatus is still 0x00002000;
UpdateData(FALSE);
nStatus = m_lcStatusList.GetItemState(nItem , LVIS_STATEIMAGEMASK);
//nStatus becomes 0x00003000(*)
So I try the following:
CListCtrl* plcDlgCtrl = (CListCtrl*) GetDlgItem(IDC_STATUSLIST);
nStatus = plcDlgCtrl->GetItemState(nItem, LVIS_STATEIMAGEMASK);
//nStatus is 0x00003000
nStatus = 0x00002000;
plcDlgCtrl->SetItemState(nItem, LVIS_STATEIMAGEMASK, nStatus);
//nStatus is 0x00002000
nStatus = plcDlgCtrl->GetItemState(nItem, LVIS_STATEIMAGEMASK);
//nStatus is 0x00003000(*)
The debugger shows that the status of the item in plcDlgCtrl never changes.
I'm I doing something wrong?
Oksana Lien -- lien@ares.csd.net
Wednesday, March 05, 1997
[Mini-digest: 2 responses]
To set a state of a list control item to - for instance - LVIS_DROPHILITED,
do this:
m_YourListCtrl.SetItemState(index, LVIS_DROPHILITED, LVIS_DROPHILITED);
VC++ documentation is not clear at all about this, but the second argument
of the function - state bit values - has to match the bit values in the
third argument, the mask. Couldn't they just tell it to us in the documentation?
At 08:31 AM 3/4/97 GMT, you wrote:
>>CListCtrl m_lcStatusList;
>
>int nStatus = 0x00002000;
>m_lcStatusList.SetItemState(nItem, LVIS_STATEIMAGEMASK, nStatus);
>nStatus = m_lcStatusList.GetItemState(nItem , LVIS_STATEIMAGEMASK);
> //nStatus is still 0x00002000;
>UpdateData(FALSE);
>nStatus = m_lcStatusList.GetItemState(nItem , LVIS_STATEIMAGEMASK);
> //nStatus becomes 0x00003000(*)
_________________________
Oksana Lien
Dimension Softek, Inc.
lien@ares.csd.net
-----From: ASalem_Ideal@nets.com.jo (Asila Salem)
Far from UNDERSTANDING, I TRIED this and it DID work:
CListCtrl* plcDlgCtrl = (CListCtrl*) GetDlgItem(IDC_STATUSLIST);
LV_ITEM lvItem;
lvItem.iItem = nItem;
lvItem.mask = LVIF_STATE;
lvItem.stateMask = LVIS_STATEIMAGEMASK;
lvItem.state = nStatus;
plcDlgCtrl ->SetItem(&lvItem);
UpdateData(TRUE);
So, for some reason, GetItemState() does not work on CListCtrl in a dialog,
one should use SetItem() instead.
Asila Salem
ASalem_Ideal@nets.com.jo
Become an MFC-L member
| Вернуться в корень Архива
|