Как избежать того, чтобы элементы CListCtrl были частично видны? - PullRequest
1 голос
/ 22 сентября 2009

У меня есть изменяемый размер 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, при этом частично видимый элемент не отображается под ним.

Ответы [ 2 ]

2 голосов
/ 01 января 2010

CListCtrl не поддерживает интегральную высоту. Вот решение, которое выполняет то, что вы хотите, путем принудительного изменения высоты элемента управления [с закомментированными условиями] (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);
1 голос
/ 29 февраля 2012

У меня похожая проблема в порыве, и я случайно нашел решение. Прямого решения в интернете нет, поэтому я решаю переместить полосу прокрутки после получения какого-либо сообщения, и единственное сообщение, которое я могу использовать в wince, это WM_LBUTTONDOWN, другие сообщения, такие как OnEndScroll, не вызываются, возможно, что-то не так в моем код.

Как бы то ни было, я использую Таймер (ON_WM_TIMER), чтобы изменить положение полосы прокрутки при получении сообщения WM_LBUTTONDOWN, а затем обнаружил, что элемент управления списком не прокручивается автоматически! тогда я остаюсь пустой функцией OnTimer и удаляю все остальное. Это работает, и я предполагаю, что управление списком использует Таймер для прокрутки частичной строки.

Надежда полезна для вас.

...