2010-05-20 52 views
1

我有一个继承Listview哪个标准必须在瓷砖模式。使用此控件时,DrawItem提供的e.bounds显然是largeIcon视图的界限?当调试来检查它实际设置的视图时,它说它在平铺视图中?然而eDrawText吸引LargeIcon视图?为什么我的listview在LargeIcon View中保持绘图?

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

这似乎当控制被放置在另一个用户控件只出现呢?

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

它变得陌生......当我添加按钮旁边list在运行时更改视图,“Tile”与“LargeIcon”相同,“List”视图与“SmallIcons”相同?我也完全清除的OwnerDraw ...

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

MSDN文档:

每个项目显示为一个全尺寸的图标 与商品标签和子项目 信息,它的右边 平铺视图。出现的 子项信息是由应用程序指定的 。此 视图仅在Windows XP 和Windows Server 2003系列上可用。 在较早版本的操作系统,该值被忽略并在LargeIcon 视图ListView的 控制显示器。

那么我在XP?!?

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

陌生感的神圣母亲...... 我们现在是在我们已经完全剥离了EVERYTING ...我们在表单上有一个标准的listview,手动填充了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 

回答

3

OK,我们发现它。魔法是:

Application.EnableVisualStyles(); 

我们跳过了这行代码来测试我们的表单。 如果你创建你的ListView表单前不调用此方法,平铺视图被绘制成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上使用的“Classic”风格的控件v6.0使用XP Visual风格的外观呈现控件由于大多数Windows Forms控件基于comctl32,它们如何呈现取决于哪个版本comctl32被用来做渲染。默认情况下,v5.8用于渲染应用程序的客户端区域,v6.0用于渲染非客户端区域。这就是为什么你看到标题栏和窗口边框自动呈现“主题”,而控件(如Button,TextBox,ListView,ComboBox等)默认具有经典外观。

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

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

相关问题