2009-09-22 10 views
1

J'ai un CListCtrl redimensionnable et je veux éviter tout élément affiché partiellement, jamais.Comment éviter que les éléments CListCtrl soient partiellement visibles?

Par exemple:

partially visible item: item 9 http://i37.tinypic.com/2guxtfn.png

Je veux point 9 de ne pas être affiché dans ce cas. Y a-t-il un drapeau ou une méthode pour cela? Comment allez-vous résoudre ce problème?

J'ai essayé ce qui suit et il était pas bon:

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

après avoir attrapé

...

ON_NOTIFY(LVN_ENDSCROLL, IDC_LIST1, OnEndScroll) 

...

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

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

Dans CListCtrl dialogue parent. (ce que je ne veux pas faire, je veux tout faire dans ma classe dérivée de CListCtrl seulement, si possible). Tout ce que j'accomplis montre complètement le point 9, mais le point 10 est partiellement visible en dessous. Si j'ai 30 articles, je ne veux pas faire défiler la liste pour afficher l'article 30, je veux montrer à l'article 8 avec aucun élément partiellement visible ci-dessous. CListCtrl ne semble pas prendre en charge Integral Height

Répondre

2

est ici une solution qui accomplit ce que vous désirez en changeant avec force la hauteur de contrôle [des conditions commentaires] (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); 
+0

solution très pure. – elimad

1

J'ai le même problème dans WinCE, et de trouver une solution par hasard. Pas de solution directe sur Internet, donc je décide de repositionner la barre de défilement après avoir reçu un message, et le seul message que je peux utiliser dans wince est WM_LBUTTONDOWN, d'autres messages tels que OnEndScroll ne sont pas appelés, peut-être quelque chose de mal dans mon code. Quoi qu'il en soit, j'utilise Timer (ON_WM_TIMER) pour repositionner la barre de défilement lors de la réception du message WM_LBUTTONDOWN, puis je trouve que le contrôle de liste ne défile pas automatiquement! alors je reste une fonction OnTimer vide et supprime tout le reste. Cela fonctionne, et je suppose que le contrôle de liste utilise Minuterie pour faire défiler la rangée partielle.

Nous espérons que cela vous sera utile.

Questions connexes