1、我为list ctrl 设置了一个image list,每个item对应一张图片,但由于item很多,因此要花较长的时间才能插入所有的item。我发现list ctrl 是在所有的item都插入以后才一起把他们显示出来的,能不能每插入一个item就显示呢?2、CListCtrl有一个方法(GetSelectedCount)可以获得选中的item,那么有没有办法可以设置某个item被选中呢?比如说我要设置最后一个item被选中。3、如何才能控制list ctrl 的滚动?比如说,我的list ctrl中只有一个item,它对应一张很大的图片,我能不能控制滚动条的位置使得图片上指定的位置显示在list ctrl中?分数可以加,最好有sample(有的话一定加)

解决方案 »

  1.   

    2, SetItemState(...)
    3, WM_VSCROLL, SetScrollPos(), ScrollWindow()
      

  2.   

    1. 如果你没有设置SetRedraw(FALSE)的话,插入的时候是会显示的。
    如果你一定要插入一条显示一次的话,那你可以在插入完每一条后让list ctrl重画RedrawWindow()
      

  3.   

    我没有设置SetReDraw(FALSE)啊。如果用ReDrawWindow()的话,显示出来很混乱,而且闪烁厉害
      

  4.   

    To everandforever(Forever)
    我用SetItemState确实解决了第2个问题,不过又出现有一个新的问题,我的list中的东西比较多,用程序设定选中某一item后,不会自动滚动到该item所在的位置,这个滚动的工作一定要利用滚动消息做的吗?还是有什么简单的方法?
      

  5.   

    3, listctrl自身的scroll bar的控制有先天缺陷,在只有一个item的时候是不会出来scroll bar的,而且不会滚动的时候是以一个Item为单位的,如果这个item的高度超过整个list box的时候你就怎么也看不到这个item的下半部分了。 建议disable掉listbox 自带的scroll bar,自己外加一个自己处理。
      

  6.   

    SetCurSel 或者处理 发个LB_SETCURSEL消息
      

  7.   

    1、
    在添加item的大循环中添加如下代码:
    while(1)
    {
      ...
      InsertItem(...);  MSG message;
      while(::PeekMessage(&message, m_hWnd, 0, 0, PM_REMOVE))
      {
       ::TranslateMessage(&message);
       ::DispatchMessage(&message);
      }2, SetItemState(...)
    3, WM_VSCROLL, SetScrollPos(), ScrollWindow()
      

  8.   

    To kingtsui(老农民):
    一个item的时候滚动条没有问题啊,可以看到其余部分的To tuyang()
    你给的代码不好用啊,看不到item一个一个显示的效果。可以解释一下这段代码吗?
      

  9.   

    结贴!第一个问题由我自己来回答:    在每插入一个item后,加上这两句就ok了
        RedrawItems ( i , i ) ; // i is the index of the inserted item
        UpdateWindow () ;