Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Windows Forms / WinForm General / September 2005

Tip: Looking for answers? Try searching our database.

TreeNode bounds are 0,0,0,0

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Tim_Mac - 06 Sep 2005 18:06 GMT
hi,
i am trying to draw an alpha effect on top of the icon for a treenode.
here is my code:

node.ImageIndex = 9;
ImageAttributes ia = new ImageAttributes();
ColorMatrix cm = new ColorMatrix();
cm.Matrix33 = 0.5F;  //50% transparency
ia.SetColorMatrix(cm);

using(Graphics g = CreateGraphics())
{
    Bitmap icon = this.ImageList.Images[9] as Bitmap;
    g.Clear(this.BackColor);
    g.DrawImage(icon, node.Bounds, 0, 0, icon.Width, icon.Height,
GraphicsUnit.Pixel, ia);
}

nothing is different when i run this, and when i debug, node.Bounds has
X=0, Y=0, Height=0, Width=0.
does anyone know why?  the 'node' variable is a valid treenode object.

thanks
tim
Allen Anderson - 07 Sep 2005 05:13 GMT
Did you attach the node to the tree before you tried to see the bounds
member?  For instance, if you just create your own treenode without
adding it to the Nodes collection, it will of course not have any
bounds in and of itself because there is no context.

-Allen
http://www.glacialcomponents.com
http://allenanderson.blogspot.com

>hi,
>i am trying to draw an alpha effect on top of the icon for a treenode.
[quoted text clipped - 20 lines]
>thanks
>tim
Tim_Mac - 07 Sep 2005 12:26 GMT
hi Allen,
thanks for the reply.
it is attached to the tree, but i'm accessing the nodes recursively through
their parent TreeNode, so maybe the location context is not following on
from there.
i think i'm going to give up on the idea.  i found out that it's a bad idea
to use CreateGraphics to do custom painting, because the Paint event is
going to override it.  so i'll just have to stick with an imagelist
containing every combination of images, assigning them in a cumbersome
if/else statement.

thanks anyway
tim

--------------------------
blog: http://tim.mackey.ie

> Did you attach the node to the tree before you tried to see the bounds
> member?  For instance, if you just create your own treenode without
[quoted text clipped - 29 lines]
>>thanks
>>tim
"Jeffrey Tan[MSFT]" - 07 Sep 2005 12:16 GMT
Hi Tim,

Thanks for your post.

I am not sure where does this code snippet executed. I have tried it in
TreeView.BeforeSelect and other methods, TreeView.Bounds will return the
correct values.

Can you provide a little sample project for us to reproduce your problem?
Thanks

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Signature

Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

Tim_Mac - 07 Sep 2005 12:45 GMT
hi Jeffrey,
thanks for the reply.  it seems to be to do with the way i build my
treenodes.  i start with a root node, and add all the children to that.  it
seems that unless the child nodes are added directly to the tree, they do
not get any bounds.

you can reproduce this with the following code:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Web;

namespace Test
{
public class Form1 : System.Windows.Forms.Form
{
 private System.Windows.Forms.TreeView treeView1;
 private System.Windows.Forms.TextBox textBox1;
 private System.ComponentModel.IContainer components = null;

 public Form1()
 {
  InitializeComponent();
 }

 protected override void Dispose( bool disposing )
 {
  if( disposing )
  {
   if (components != null)
   {
    components.Dispose();
   }
  }
  base.Dispose( disposing );
 }

 #region Windows Form Designer generated code

 private void InitializeComponent()
 {
  this.treeView1 = new System.Windows.Forms.TreeView();
  this.textBox1 = new System.Windows.Forms.TextBox();
  this.SuspendLayout();
  //
  // treeView1
  //
  this.treeView1.Dock = System.Windows.Forms.DockStyle.Left;
  this.treeView1.ImageIndex = -1;
  this.treeView1.Location = new System.Drawing.Point(0, 0);
  this.treeView1.Name = "treeView1";
  this.treeView1.SelectedImageIndex = -1;
  this.treeView1.Size = new System.Drawing.Size(232, 396);
  this.treeView1.TabIndex = 0;
  //
  // textBox1
  //
  this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
  this.textBox1.Location = new System.Drawing.Point(232, 0);
  this.textBox1.Multiline = true;
  this.textBox1.Name = "textBox1";
  this.textBox1.Size = new System.Drawing.Size(304, 396);
  this.textBox1.TabIndex = 1;
  this.textBox1.Text = "";
  //
  // Form1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
  this.ClientSize = new System.Drawing.Size(536, 396);
  this.Controls.Add(this.textBox1);
  this.Controls.Add(this.treeView1);
  this.Name = "Form1";
  this.Text = "Form1";
  this.Load += new System.EventHandler(this.Form1_Load);
  this.ResumeLayout(false);

 }
 #endregion

 [STAThread]
 static void Main()
 {
  Application.Run(new Form1());
 }

 private void Form1_Load(object sender, System.EventArgs e)
 {
  TreeNode root = new TreeNode("Node1");
  root.Nodes.Add(new TreeNode("Node2"));
  root.Nodes.Add(new TreeNode("Node3"));
  root.Nodes.Add(new TreeNode("Node4"));

  this.treeView1.Nodes.Add(root);

  foreach(TreeNode node in root.Nodes)
   this.textBox1.Text += node.Bounds.ToString() + "\r\n";
 }
}
}

i wouldn't have thought there was anything weird about my approach above
(which is simplified).  recursion is used a lot with treeviews.

do i get a prize for finding a bug in the treeview?  ;)

tim

--------------------------
blog: http://tim.mackey.ie

> Hi Tim,
>
[quoted text clipped - 12 lines]
> Get Secure! - www.microsoft.com/security
> This posting is provided "as is" with no warranties and confers no rights.
"Jeffrey Tan[MSFT]" - 08 Sep 2005 08:21 GMT
Hi Tim,

Thanks for your feedback.

Yes, with your sample code snippet, I can reproduce out your issue.
However, it is not a bug.

If we use Reflector to view System.Windows.Forms.TreeNode.get_Bounds, we
will see that it actually p/invoked SendMessage win32 API to send
TVM_GETITEMRECT(0x1104) message to TreeView control.

From the MSDN of "TVM_GETITEMRECT Message", we get this:
"If the item is visible and the bounding rectangle was successfully
retrieved, the return value is TRUE. Otherwise, the message returns FALSE
and does not retrieve the bounding rectangle."

So actually because the child nodes of the root nodes are all invisible,
this SendMessage call will fail with empty rectangle data returned.

If we called this.treeView1.ExpandAll() before TreeNode.Bounds checking
code, everything will work well with correct bound information returned.

private void Form1_Load(object sender, System.EventArgs e)
{
    TreeNode root = new TreeNode("Node1");
    root.Nodes.Add(new TreeNode("Node2"));
    root.Nodes.Add(new TreeNode("Node3"));
    root.Nodes.Add(new TreeNode("Node4"));

    this.treeView1.Nodes.Add(root);

    this.treeView1.ExpandAll();

    foreach(TreeNode node in root.Nodes)
        this.textBox1.Text += node.Bounds.ToString() + "\r\n";
}

Hope this helps.
=====================================

Thank you for your patience and cooperation. If you have any questions or
concerns, please feel free to post it in the group. I am standing by to be
of assistance.

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Signature

Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

Tim_Mac - 08 Sep 2005 19:46 GMT
hi Jeffrey,
very good, thanks for the in-depth reply.

tim

--------------------------
blog: http://tim.mackey.ie

> Hi Tim,
>
[quoted text clipped - 45 lines]
> Get Secure! - www.microsoft.com/security
> This posting is provided "as is" with no warranties and confers no rights.
"Jeffrey Tan[MSFT]" - 09 Sep 2005 03:20 GMT
You are welcome

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Signature

Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

Tim_Mac - 07 Sep 2005 14:18 GMT
p.s. note that if i reference the child nodes through the
treeview.Nodes collection instead of the local 'root' variable, the
result is the same,  presumably because it is the same object.

foreach(TreeNode node in this.treeView1.Nodes[0].Nodes)
    this.textBox1.Text += node.Bounds.ToString() + "\r\n";
// still shows 0,0,0,0 for each child node

tim

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.