1

サイズ変更可能な CListCtrl があり、アイテムが部分的に表示されるのを避けたいと思っています。

例えば:

部分的に見えるアイテム: アイテム 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 まで表示し、その下に部分的に表示されるアイテムを表示したくありません。

4

2 に答える 2

2

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);
于 2010-01-01T15:50:51.507 に答える
1

私はひるみにも同様の問題があり、誤って解決策を見つけました。インターネットには直接的な解決策がないため、メッセージを受信した後にスクロールバーの位置を変更することにしました。ひるみで使用できる唯一のメッセージは、呼び出されないWM_LBUTTONDOWNなどの他のメッセージです。コードに問題がある可能性があります。OnEndScroll

とにかく、タイマー(<code>ON_WM_TIMER)を使用してWM_LBUTTONDOWNメッセージを受信したときにスクロール バーの位置を変更すると、リスト コントロールが自動的にスクロールしないことがわかりました。次に、空の OnTimer 関数のままにして、他のすべてを削除します。それは機能し、リストコントロールはタイマーを使用して部分的な行をスクロールすると思います。

あなたに役立つことを願っています。

于 2012-02-29T14:10:32.620 に答える