【问题标题】:Why does my listview keep drawing in LargeIcon View?为什么我的列表视图一直在大图标视图中绘制?
【发布时间】:2011-02-21 21:21:52
【问题描述】:

我有一个继承的 Listview,其标准必须处于平铺模式。使用此控件时,DrawItem 会给出 e.bounds,它们显然是 largeIcon 视图的边界?在调试以检查它实际设置的视图时,它说它在平铺视图中?然而 e.DrawText 绘制 LargeIcon 视图??

…………编辑:…………

这似乎只发生在控件放在另一个用户控件上时?

....... 编辑 2:........

它变得陌生...当我在列表旁边添加按钮以在运行时更改视图时,“Tile”与“LargeIcon”相同,“List”视图与“SmallIcons”相同??? 我也彻底删除了ownerdraw ...

........ 编辑 3:..................

MSDN 文档: 平铺视图

每个项目都显示为一个全尺寸图标 带有项目标签和子项目 右侧的信息。这 出现的子项信息是 由应用程序指定。这 视图仅在 Windows XP 上可用 和 Windows Server 2003 家族。 在早期的操作系统中,该值会被忽略,并且 ListView 控制大图标中的显示 查看。

好吧,我在 XP 上?!?

...... 编辑 4 ......................

陌生的圣母... 我们现在已经完全剥离了一切......我们在表单上有一个标准的列表视图,手动填充了 3 个值。没有所有者抽奖。它设置为平铺。 当我们启动这个表单时,列表被绘制为 LARGEICON。

现在,我们开始另一个空白解决方案,将这个完全相同的表单复制到新项目中,开始调试,然后看,它是在 TILE 视图中绘制的????

...帮助...

public class InheritedListView : ListView
{
    //Hiding members ... mwuahahahahaha   //yeah i was still laughing then
    [BrowsableAttribute(false)]
    public new View View
    {
        get { return base.View; }
    }

    public InheritedListView()
    { 
        base.View = View.Tile;

        this.OwnerDraw = true;
        base.DrawItem += new DrawListViewItemEventHandler(DualLineGrid_DrawItem);
    }

    void DualLineGrid_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
        View v = this.View;

        //**when debugging, v is Tile, however e.DrawText() draws in LargeIcon mode,
        // e.Bounds also reflects LargeIcon mode ???? **
     }

..................

此代码在不同的解决方案中表现不同:

    private void InitializeComponent()
    {
        System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("fhsdhdsfhsdfhs");
        System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("fdshdsfhdsfhsd");
        System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("hdshsdfhsdfhsdfsdfsdf");
        this.listView1 = new System.Windows.Forms.ListView();
        this.SuspendLayout();
        // 
        // listView1
        // 
        this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
        listViewItem1,
        listViewItem2,
        listViewItem3});
        this.listView1.Location = new System.Drawing.Point(36, 12);
        this.listView1.Name = "listView1";
        this.listView1.Size = new System.Drawing.Size(487, 242);
        this.listView1.TabIndex = 2;
        this.listView1.TileSize = new System.Drawing.Size(480, 50);
        this.listView1.UseCompatibleStateImageBehavior = false;
        this.listView1.View = System.Windows.Forms.View.Tile;
        // 
        // TestControl
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(595, 712);
        this.Controls.Add(this.listView1);
        this.Name = "TestControl";
        this.Text = "TestControl";
        this.ResumeLayout(false);

    }

    #endregion

【问题讨论】:

    标签: c# .net listview


    【解决方案1】:

    好的,我们找到了。魔法咒语是:

    Application.EnableVisualStyles();
    

    我们跳过这行代码来测试我们的表单。 如果您在使用列表视图创建表单之前未调用此方法,则 TILE 视图将被绘制为 LARGEICON。

    似乎完全合乎逻辑...... :-(

    http://blogs.msdn.com/rprabhu/archive/2003/09/28/56540.aspx

    Q Application.EnableVisualStyles 实际上做了什么?

    Windows XP 附带两个版本的通用控件库 (comctl32.dll) - 版本 5.8 和 6.0。 v5.8 以您在 Windows NT/2000 和 Windows 9x 上获得的“经典”样式呈现控件。 v6.0 使用 XP 视觉样式的外观呈现控件。由于大多数 Windows 窗体控件都基于 comctl32,因此它们的呈现方式取决于用于呈现的 comctl32 版本。默认情况下,v5.8 用于渲染应用的客户区,v6.0 用于渲染非客户区。这就是为什么您会看到标题栏和窗口边框自动呈现“主题”,而控件(如 Button、TextBox、ListView、ComboBox 等)默认具有经典外观。

    在框架的 v1.0 中,在 Windows 窗体应用程序中获取视觉样式的方法是随应用程序一起提供一个清单文件,其中包含指示应使用 comctl32 的 v6.0 进行渲染的信息.虽然这很好用,但许多开发人员觉得编写、维护和部署清单文件很麻烦。他们觉得有必要以编程方式做到这一点。现在,Platform SDK 确实提供了 API 来执行此操作。基本上,您需要创建并激活一个激活上下文,其中包含与清单文件几乎相同的 DLL 重定向信息。激活上下文 API 可用于以适合您的应用程序的方式执行此操作。

    如果您查看这些 API,您可能会注意到它们不是很容易使用。虽然高级开发人员可能喜欢修改激活上下文,但想要一些“快速而肮脏”的代码来获得视觉样式的开发人员可能不会这样做。因此,Windows 窗体团队决定封装这些 API,并公开一个开发人员可以调用的简单方法,从而将它们与这些复杂性隔离开来。因此,本质上,当您调用 Application.EnableVisualStyles 时,我们围绕应用程序的消息循环设置了一个激活上下文,以便 comctl32 函数调用可以正确重定向到 comctl32 v6.0。这样,您无需在应用中包含清单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多