如何计算弹出树位置?帮看下代码。。

时间:2022-04-01 13:10:18
用textBox、Button、TreeView做了一个下拉树的控件,现在完成的效果是单击Button可以弹出TreeView,问题是现在树只能向下弹出,能不能根据这个控件的现有位置自动判断树向上或向下弹出,像WINDOWS上的弹出菜单一样,在桌面右下角时,菜单自动向上弹出? 

C# code
private void ToggleTreeView(object sender,EventArgs e)
        {
            //设置treeview在textBox之上或下
            
            if(!treeView.Visible) 
            {

                SetTreeViewSizeAndLocation();
                try 
                {
                    this.btnSelect.Text = "-";
                    this.Parent.Controls.Add(treeView);
                    this.treeView.BringToFront();
                    treeView.Visible = true;
                    //treeView.Select();
                    Parent.MouseMove += new MouseEventHandler(ParentMouseMoveHandler);
                    if(treeView.Width < this.Width || treeView.Height < this.Height) 
                    {
                        treeView.Width = tvMinWidth;
                        treeView.Height = 150;
                        SetHotSpot();
                    }

                } 
                catch 
                {
                }
            } 
            else 
            {
                try 
                {
                    btnSelect.Text = "+";
                    treeView.Visible = false;
                    this.Parent.Controls.Remove(treeView);
                    Parent.MouseMove -= new MouseEventHandler(ParentMouseMoveHandler);
                } 
                catch 
                {
                }
            }
        }



上面这个函数就是button的单击事件

10 个解决方案

#1


楼主,请先确认个问题。
WM的TreeView支持向上弹出么?
我查了MSDN没发现类似的属性或方法。
关注。

#2


不是那个意思,是指设置treeView的弹出位置,可以在textbox之上或是之下
这个贴子如何发图片啊。。

#3


不知道怎么发图片。
如果是这样,就是楼主自己计算的事了,说说思路。
先用textbox的Location判断距离Client的底部距离,与treeView的高度比较。
如果距离<treeView高度就在textbox的上面弹出treeView。
弹出的Location用当前textbox的Location的Y坐标-treeView的高度。
如果距离>treeView高度,就能在textbox下面显示下treeView。

写的比较混乱,不知道楼主能看懂不。

#4


引用 3 楼 jiangyongtao 的回复:
先用textbox的Location判断距离Client的底部距离,与treeView的高度比较。 


这个Location如何与Client的底部距离比较,Client没接触过。。

#5


不是放到Form里面么,Form的高

#6



                    if (this.txtValue.Location.Y - this.Height > this.treeView.Height)
                    {
                        //textbox下显示
                    }
                    else
                    {
                        //textbox显示
                        Point point = new Point(this.txtValue.Location.X, this.txtValue.Location.Y - this.treeView.Height);
                    }

#7


好像反了,应该这样

if (this.Height - this.txtValue.Location.Y > this.treeView.Height)
{
    //textbox下显示
}
else
{
    //textbox显示
     Point point = new Point(this.txtValue.Location.X, this.txtValue.Location.Y - this.treeView.Height);
}

#8


颜色没显示出来呢
if ( this.Height - this.txtValue.Location.Y > this.treeView.Height)
{
    //textbox下显示
}
else
{
    //textbox显示
     Point point = new Point(this.txtValue.Location.X, this.txtValue.Location.Y - this.treeView.Height);
}

#9


只需判断一下当前的位置如果是向下显示的空间够不够, 不够就把整个tree向上移一个tree的高度显示.

#10


引用 9 楼 xmanlin 的回复:
只需判断一下当前的位置如果是向下显示的空间够不够, 不够就把整个tree向上移一个tree的高度显示.


能不能讲下具体思路?比如与剩余空间的判断

#1


楼主,请先确认个问题。
WM的TreeView支持向上弹出么?
我查了MSDN没发现类似的属性或方法。
关注。

#2


不是那个意思,是指设置treeView的弹出位置,可以在textbox之上或是之下
这个贴子如何发图片啊。。

#3


不知道怎么发图片。
如果是这样,就是楼主自己计算的事了,说说思路。
先用textbox的Location判断距离Client的底部距离,与treeView的高度比较。
如果距离<treeView高度就在textbox的上面弹出treeView。
弹出的Location用当前textbox的Location的Y坐标-treeView的高度。
如果距离>treeView高度,就能在textbox下面显示下treeView。

写的比较混乱,不知道楼主能看懂不。

#4


引用 3 楼 jiangyongtao 的回复:
先用textbox的Location判断距离Client的底部距离,与treeView的高度比较。 


这个Location如何与Client的底部距离比较,Client没接触过。。

#5


不是放到Form里面么,Form的高

#6



                    if (this.txtValue.Location.Y - this.Height > this.treeView.Height)
                    {
                        //textbox下显示
                    }
                    else
                    {
                        //textbox显示
                        Point point = new Point(this.txtValue.Location.X, this.txtValue.Location.Y - this.treeView.Height);
                    }

#7


好像反了,应该这样

if (this.Height - this.txtValue.Location.Y > this.treeView.Height)
{
    //textbox下显示
}
else
{
    //textbox显示
     Point point = new Point(this.txtValue.Location.X, this.txtValue.Location.Y - this.treeView.Height);
}

#8


颜色没显示出来呢
if ( this.Height - this.txtValue.Location.Y > this.treeView.Height)
{
    //textbox下显示
}
else
{
    //textbox显示
     Point point = new Point(this.txtValue.Location.X, this.txtValue.Location.Y - this.treeView.Height);
}

#9


只需判断一下当前的位置如果是向下显示的空间够不够, 不够就把整个tree向上移一个tree的高度显示.

#10


引用 9 楼 xmanlin 的回复:
只需判断一下当前的位置如果是向下显示的空间够不够, 不够就把整个tree向上移一个tree的高度显示.


能不能讲下具体思路?比如与剩余空间的判断