【问题标题】:Vertical Scrollbar in CListCtrlCListCtrl 中的垂直滚动条
【发布时间】:2009-11-27 04:05:20
【问题描述】:

我在图标视图中使用 CListCtrl,但它水平滚动:

1 3 5 7 -->
2 4 6 8 -->

我宁愿它水平滚动:

1 2
3 4
5 6
| |
V V

有没有办法做到这一点?

【问题讨论】:

    标签: c++ mfc scroll clistctrl


    【解决方案1】:

    将设计器中的对齐样式从左更改为上。

    【讨论】:

    • 这还不够;查看我更完整的答案。
    • 这在一个充满图像缩略图的列表控件中非常适合我
    【解决方案2】:

    我似乎已经通过使用“报告”视图解决了这个问题。通过 VS 设计器,这意味着将“视图”样式更改为报告,从而在 .RC 文件中产生给定 LVS_REPORT 属性的控件。请注意,这相当于在代码中调用CListCtrl::SetView(LV_VIEW_DETAILS)。然而,这还不够。如果您还没有列,则还需要创建一个列,其中包含几行代码:

    m_lstScenarios.InsertColumn(0, L"NO HEADER");
    m_lstScenarios.SetColumnWidth(k_nListColScenario, LVSCW_AUTOSIZE);
    

    如果不想要列标题,在设计器中通过'No Column Header'样式设置LVS_NOCOLUMNHEADER。

    【讨论】:

      【解决方案3】:

      在 Visual Studio 对话框编辑器上,确保您有“列表控件”而不是“列表框”。

      在 Visual Studio 对话框编辑器的属性列表中,将“No Column Header”设置为 True,将“View”设置为 Report。 (将“对齐”设置为左在报告模式下无效。)

      OnInitDialog() 中,执行以下操作(在调用超类的OnInitDialog() 之后):

        CListCtrl* plistError = (CListCtrl*) GetDlgItem( IDC_ERROR );
        plistError->InsertColumn( 0, "" );
        plistError->SetColumnWidth( 0, LVSCW_AUTOSIZE_USEHEADER );
      

      事实上,这似乎给出了控件创建时使用的 initial 宽度的最大自动大小。字符串在该点显示为用省略号截断。扩大窗口没有帮助。

      要更正此问题,请将方法 OnSize() 添加到您的 CDialog 子类中,再次提醒列表它更宽。 (假设加宽窗口可以让CListCtrl 显示更多文本。如果您有其他方式,例如按钮,请在您正在执行此操作的地方尝试此SetColumnWidth() 调用。)

       WinProgress::OnSize() {
          CListCtrl* plist = (CListCtrl*) GetDlgItem( IDC_ERROR );
          plist->SetColumnWidth( 0, LVSCW_AUTOSIZE_USEHEADER );
      

      然后您可以使用以下代码将新行添加到列表底部:

        CListCtrl* plist = (CListCtrl*) GetDlgItem( IDC_ERROR );
        int iCount = plist->GetItemCount();
      
        plist->InsertItem( iCount, "Next Item" );
      

      对于列表来说太宽的项目将首先显示省略号。当您稍微调整窗口大小时,列表项将变宽,并在必要时出现水平滚动条。就外观而言,它还不是 10/10,但即使是经验丰富的 GUI 程序员也可能不会注意到。

      【讨论】:

        【解决方案4】:

        在列表控件中,使用垂直滚动条在单列中显示带有图像的内容。添加以下代码, 在 PreCreateWindow 函数中,添加以下行 cs.style |= (LVS_REPORT|LVS_NOCOLUMNHEADER); 并在 OnIntialUpdate 函数中添加以下行, fileList.InsertColumn(0," ",LVCFMT_LEFT|LVCFMT_IMAGE,120,-1); ShowScrollBar(SB_VERT,1); 在此之后,无论您想在列表中的哪个位置插入数据,都可以,但请注意设置 imagelist,然后使用 insertitem 插入数据,例如: 文件列表,插入项(0,“印度”,1); 其中 1-> 是 imagelist 中图像的索引。

        【讨论】:

          猜你喜欢
          • 2012-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多