CXTPListCtrl / Can't have more than one and sort |
Post Reply |
Author | |
rhfritz
Groupie Joined: 19 September 2014 Status: Offline Points: 9 |
Post Options
Thanks(0)
Posted: 16 November 2017 at 3:45pm |
There's a bug in XTP that is reproducible using ListCtrl_vc150 example code. The platform is Win10 Enterprise. Visual Studio 2017. Xtreme ToolkitPro v18.0.1. I've attached a screen snapshot of the problem, which is that if you have more than one CXTPListCtrl on a window, the OnNotify event does not let you differentiate which one you attempted to sort. Note that in the screen snapshot of the breakpoint after the if (pHDNotify->hdr.code == HDN_ITEMCLICKA ...), both wParam and pHDNotify->hdr.idFrom are zero. We should be able to select based on either wParam or pHDNotify->hdr.idFrom to determine the origin of the message. So the only reason the ListCtrl_vc150 example code works is that there's only one control on the dialog that could generate HDN_ITEMCLICKA. The work around is that when the list control of interest is getting focus and the column-header is clicked, both wParam and pHDNotify->hdr.idFrom are valid, but pHDNotify->hdr.code is not HDN_ITEMCLICKA. So by trapping the idFrom, we can determine which list control generated the event. Here is the work around code that fixes the example: void CListCtrlDlg::SortColumn(CXTPListCtrl *pListCtrl, int iCol, bool bAsc) { m_bAscending = bAsc; // each list control needs a unique instance m_nSortedCol = iCol; // each list control needs a unique instance // set sort image for header and sort column. pListCtrl->SetSortImage(m_nSortedCol, m_bAscending); CXTPSortClass csc(pListCtrl, m_nSortedCol); csc.Sort(m_bAscending, xtpSortString); } BOOL CListCtrlDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { HD_NOTIFY *pHDNotify = (HD_NOTIFY*)lParam; #pragma region XTP_NOTIFY_BUG // There's a bug in XTP. The OnNotify events received *just prior* to pHDNotify->hdr.code == HDN_ITEMCLICKA // have the wParam and idFrom set to the proper control. But at the time of the HDN_ITEMCLICKA, both are always zero. // So we save the idFrom and use it instead. static UINT idFrom = 0; if (wParam && wParam == pHDNotify->hdr.idFrom) idFrom = pHDNotify->hdr.idFrom; #pragma endregion if (pHDNotify->hdr.code == HDN_ITEMCLICKA || pHDNotify->hdr.code == HDN_ITEMCLICKW) { switch (idFrom) { case IDC_LIST_CTRL: if (pHDNotify->iItem == m_nSortedCol) SortColumn(&m_listCtrl, pHDNotify->iItem, !m_bAscending); else SortColumn(&m_listCtrl, pHDNotify->iItem, BoolType(m_header.GetAscending())); break; case IDC_LIST_CTRL2: if (pHDNotify->iItem == m_nSortedCol) SortColumn(&m_listCtrl2, pHDNotify->iItem, !m_bAscending); else SortColumn(&m_listCtrl2, pHDNotify->iItem, BoolType(m_header.GetAscending())); break; } } return CXTPResizeDialog::OnNotify(wParam, lParam, pResult); } |
|
Post Reply | |
Tweet
|
Forum Jump | Forum Permissions You cannot post new topics in this forum You cannot reply to topics in this forum You cannot delete your posts in this forum You cannot edit your posts in this forum You cannot create polls in this forum You cannot vote in polls in this forum |