如何避免CListCtrl项部分可见?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何避免CListCtrl项部分可见?相关的知识,希望对你有一定的参考价值。

我有一个可调整大小的CListCtrl,我想避免任何项目被部分显示,永远。

例如:

partially visible item: item 9

我希望在这种情况下不显示第9项。这有旗帜或方法吗?你会如何解决这个问题?

我尝试了以下内容并不是很好:

void CMyCListCtrl::OnEndScrolling()
{
    int iCount = this->GetCountPerPage();
    EnsureVisible(iCount - 1, FALSE);
}

抓住后

...

ON_NOTIFY( LVN_ENDSCROLL, IDC_LIST1, OnEndScroll )

...

   void CWheelTestDlg::OnEndScroll(NMHDR* pNMHDR, LRESULT* pResult)
   {
       LPNMLVSCROLL pnmLVScroll = (LPNMLVSCROLL) pNMHDR;

       m_MyListCtrl.OnEndScrolling();
       *pResult = 0;
   }

在CListCtrl父对话框中。 (我不想这样做,我想只在我的CListCtrl派生类中做所有事情,如果可能的话)。

我所完成的只是完全显示第9项,但第10项在其下方部分可见。如果我有30个项目我不想滚动列表以显示项目30,我想要显示项目8,其下方没有部分可见的项目。

答案

CListCtrl似乎不支持Integral Height。这是一个解决方案,通过强制更改控制高度[使用注释条件](http://www.codeproject.com/Messages/418084/Socket-accept-call.aspx)来实现您的需求:

/////////////////////////////////////////////////////////////////////////////////
// This assumes a REPORT-style CListCtrl.
//
// Resize the control. This works correctly only if scrolling is disabled. If
// there is scrolling, then setting to the size from ApproximateViewRect() will
// always give scroll bars showing. Which is irritating.
//
// We need to adjust the vertical size from what ApproximateViewRect() returns
// by one row minus border width
//////////////////////////////////////////////////////////////////////////////////
CSize sz = m_list.ApproximateViewRect();    // always adds room for a new row

CRect itRect;   // Get the height of a single row (there had better *be* a row!)
m_list.GetItemRect(0, &itRect, LVIR_BOUNDS);

int vOffset = itRect.Height() - 3;  // leave a little 'cuz it looks better
m_list.SetWindowPos(NULL, 0, 0, sz.cx, sz.cy - vOffset,
    SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);
另一答案

我在wince有类似的问题,并且意外地找到了解决方案。在互联网上没有直接解决方案,所以我决定在收到一些消息后重新定位滚动条,而我在wince中使用的唯一消息是WM_LBUTTONDOWN,其他消息如OnEndScroll没有被调用,可能在我的代码中有问题。

无论如何,我在收到ON_WM_TIMER消息时使用Timer(WM_LBUTTONDOWN)重新定位滚动条,然后发现列表控件不会自动滚动!然后我仍然是一个空的OnTimer函数,并删除其他一切。它工作,我猜列表控件使用Timer滚动部分行。

希望对你有用。

以上是关于如何避免CListCtrl项部分可见?的主要内容,如果未能解决你的问题,请参考以下文章

在 vc++ 中重新调整任何 clistctrl 列的大小时避免使用补丁

Android:通过更改片段更改菜单项的可见性

如何为不可见的列优化 CListCtrl LVN_GETDISPINFO?

重新创建活动后片段不可见

禁用 HSCROLL 的 CListCtrl - 无法选择最后一个可见项目

在 MFC 中的 CListCtrl 中禁用多项选择项上的按钮