How to remove highlight/focus from an ownerdraw CListCtrl
Gary_Shank@stercomm.com Thursday, April 11, 1996 I'm using MSVC 4.1 on Windows NT 4.0 beta. I've got an ownerdraw CListCtrl and I'm trying to write a function that will remove the highlight and focus of an item that is selected. Below is some code that I've tried but failed to produce the desired results. I do get the correct item using GetItem but then it's as if SetItemState isn't working. I've tried using Update by itself, then InvalidateRect by itself, then Update and InvalidateRect together, but nomatter what, my DrawItem function gets an itemState (from DRAWITEMSTRUCT) of ODS_SELECTED and ODS_FOCUS. Any ideas? void CMyCListCtrl::RemoveHighlight() { // get selected item memset(&m_lvItem, NULL, sizeof(m_lvItem)); m_lvItem.mask = LVIF_STATE; m_lvItem.state = LVIS_SELECTED; m_lvItem.stateMask = LVIS_SELECTED; if ( GetItem(&m_lvItem) == FALSE ) return; SetItemState(m_lvItem.iItem, 0, LVIF_STATE); Update(m_lvItem.iItem); InvalidateRect(NULL, TRUE); } Gary_Shank@stercomm.com
Glen Okita -- go@svpal.org Monday, April 15, 1996 [Mini-digest: 3 responses] The 3rd parameter to SetItemState() is a bit mask. The constant LVIF_STATE has the value 0x0008, which means the low order focus and select bits are never affected. Use a mask value of 0x000F or possibly (LVIS_FOCUSED | LVIS_SELECTED | LVIS_CUT | LVIS_DROPHILITED). BTW - I have noticed that my state icon does not update properly when I grab LVN_ITEMCHANGING and modify the state icon bits. I need to post a message to myself and call SetItemState() to get the display corrected. (I don't call Update() cause it repaints the entire control unnecessarily.) Anyone else notice something like this? Glen Okita ti desrever sediT -- Tides reversed it go@svpal.org -----From: "Joseph M. Koral">> SetItemState(m_lvItem.iItem, 0, LVIF_STATE); You need to provide the stateMask as the third parameter to SetItemState, not the mask. So in your case, you would want: SetItemState(m_lvItem.iItem, 0, LVIS_SELECTED); Also, why are you using GetItem to find the selected item? How will this work when multiple items are selected? - Joseph -----From: "Frederic Steppe" >I've got an ownerdraw CListCtrl and I'm trying to write a function >that will remove the highlight and focus of an item that is selected. Try something like this (not tested, but it should work) : void CMyCListCtrl::RemoveState(int nState) { int nItem = -1; while((nItem = GetNextItem(nItem, nState)) >= 0) { SetItemState(nItem, 0, nState); } } void CMyCListCtrl::RemoveHighlight() { int nItem = -1; RemoveState(LVIS_SELECTED); RemoveState(LVIS_FOCUSED); } Frederic. (frederics@msn.com)
Joseph Koral -- jkoral@ftp.com Thursday, April 18, 1996 Frederic. (frederics@msn.com) wrote: >> void CMyCListCtrl::RemoveState(int nState) >> { >> int nItem = -1; >> while((nItem = GetNextItem(nItem, nState)) >= 0) >> { >> SetItemState(nItem, 0, nState); >> } >> } >> >> >> void CMyCListCtrl::RemoveHighlight() >> { >> int nItem = -1; >> >> RemoveState(LVIS_SELECTED); >> RemoveState(LVIS_FOCUSED); >> } Ouch. Why so expensive? You can change multiple states at the same time. Why not just RemoveState(LVIS_SELECTED | LVIS_FOCUSED)? - Joseph
| Вернуться в корень Архива |