Winform控件问题:设置控件容器区域、或更改子控件窗口区域(简单问题、帮顶有分)

时间:2022-05-07 19:50:08
实现以下功能:
子控件只能在主控件的指定区域内显示!超过指定区域的超过部分不显示。
Winform控件问题:设置控件容器区域、或更改子控件窗口区域(简单问题、帮顶有分)

图中 兰色线框为绘制的矩形(非控件)
当移动滚动条控制 Button 移动 Button移动超出兰色矩形区域时超出部分不显示,

我用更改子控件窗口区域(既改为不规则控件)方法实现了此功能
但是此时频繁更改子控件窗口区域属性,子控件却不停的闪烁。

问题:
1:用更改子控件窗口区域属性的方法怎么能让它不闪烁或尽量少闪烁。

2:是否有更改主控件的控件容器区域等方法,让子控件在一定区域内显示,
当然若控件也会闪烁是不行的。

拒绝利用在主控件上绘制来遮住子控件的思路。谢谢朋友指点

42 个解决方案

#1


帮顶!

#2


好像想做游戏的样子啊。。。。

#3


顶~~

#4


在form上加一个panel做为子容器,再将button放到panel中

#5


TO:
breadjyh 
新小鱼 

谢谢你的回答,但是你说的方法已经脱离了我的问题。
如果这样 那我问题中的主控件 就是Panel了 

#6


Go On!

#7


Up.

#8


顶~~

#9


up

#10


帮顶

#11


帮顶

#12


先up

#13


怎么没人回答呢?!

#14


让他们在不同的层上
然后控制层的前后位置
上面的会罩住后面的把

#15


To:
virusplayer 

你好,请问 Winform 中有层的概念吗?
有些什么相关 类或资料吗?

#16


别用form了,实现很困难。
用容器,应该简单些。

#17


qiyousyc 

你好!我是针对类似问题提问。
这只是一个例子,
我需要在主控件(UserControl或Form)内指定一个区域容纳子控件(UserControl和ScrollBar)

#18


先UP

#19


问题: 
1:用更改子控件窗口区域属性的方法怎么能让它不闪烁或尽量少闪烁。

要他不闪烁.试试,把控件挂起,更改他的属性后再重新ResumeLayout

#20


19楼

哎 不行啊 刚去试了

SuspendLayout();
更改后...
ResumeLayout();
是这样吧! 还比之前闪得厉害!



谁告诉我:
有没有在控件(UserControl或Form)内指定一个容纳子控件区域的方法?

#21


呵呵,如果是website,用div可能做到,如果是windows application先帮顶一下,对这方面不熟

#22


          用directX试试。

#23


另外定义一个Form,作为当前Form的子控件,使其区域为该矩形以外部分
如不能控制此Form在最前,可调用BringToFront方法

#24


To:
dancingbit 

方法不错啊!

不过不合适解决上面两个问题!
因为用到多的控件,这个和4楼一个道理,反而有点饶了!

谢谢大家关心

#25


我想你没有完全理解我的意思
Button仍然是原来的Form的子控件
我所说的Form不过是遮掉原来的Form的一部分罢了

#26


我理解是
第二个Form 的中间是空的对吧??它盖住第一个Form除矩形位置的所有其他位置

#27


#28


对,如果我和4楼说的方法你都不能满意的话,那很抱歉,我也想不出什么好办法了。

#29


定义一个区域,然后判断控件是否进入该区域,如果是,就更改控件大小,需要的话还要调整位置.

#30


应该是绘制窗口的问题,区域内的直接绘制,区域外的处理后绘制btn以外的部分。

#31


采用控件做,这样做效果基本都不会好。因为控件资源消耗比较大,当数量多的时候停滞回比较严重

最好的方法是所有的都自己绘图。

如果非要这样做可以考虑以下方法:

控件闪烁是因为图片绘制太频繁,系统响应不够及时所致。
可以采用双缓存技术解决。
也可以在后台自己创建子控件,创建好后再添加桌面显示。

#32


up

#33


该回复于2008-03-19 13:36:48被版主删除

#34


To楼主,
那你试试.把他的容器= 也一起挂起.

具体写法可以看一下 winform程序自动生成的代码.InitializeComponent

#35


像楼主这种需求一般是用两个窗体实现的,中间那一块叫Client,是有Handle(窗体)的,MDI窗体就是这样实现的。
但是楼主拒绝这种做法,我就不多说了。。。

#36


up

#37


继续!
看来问题很难很严重

#38


帮顶有份耶

#39


提上去!

#40


再提

#41


#42


你好楼主,我以前用Padding调整个,不显示子控件部分是有特别用处,也是自己画的,不过好像是不适合你,你说的这个我现在也正想实现,加我QQ吧122281069

#1


帮顶!

#2


好像想做游戏的样子啊。。。。

#3


顶~~

#4


在form上加一个panel做为子容器,再将button放到panel中

#5


TO:
breadjyh 
新小鱼 

谢谢你的回答,但是你说的方法已经脱离了我的问题。
如果这样 那我问题中的主控件 就是Panel了 

#6


Go On!

#7


Up.

#8


顶~~

#9


up

#10


帮顶

#11


帮顶

#12


先up

#13


怎么没人回答呢?!

#14


让他们在不同的层上
然后控制层的前后位置
上面的会罩住后面的把

#15


To:
virusplayer 

你好,请问 Winform 中有层的概念吗?
有些什么相关 类或资料吗?

#16


别用form了,实现很困难。
用容器,应该简单些。

#17


qiyousyc 

你好!我是针对类似问题提问。
这只是一个例子,
我需要在主控件(UserControl或Form)内指定一个区域容纳子控件(UserControl和ScrollBar)

#18


先UP

#19


问题: 
1:用更改子控件窗口区域属性的方法怎么能让它不闪烁或尽量少闪烁。

要他不闪烁.试试,把控件挂起,更改他的属性后再重新ResumeLayout

#20


19楼

哎 不行啊 刚去试了

SuspendLayout();
更改后...
ResumeLayout();
是这样吧! 还比之前闪得厉害!



谁告诉我:
有没有在控件(UserControl或Form)内指定一个容纳子控件区域的方法?

#21


呵呵,如果是website,用div可能做到,如果是windows application先帮顶一下,对这方面不熟

#22


          用directX试试。

#23


另外定义一个Form,作为当前Form的子控件,使其区域为该矩形以外部分
如不能控制此Form在最前,可调用BringToFront方法

#24


To:
dancingbit 

方法不错啊!

不过不合适解决上面两个问题!
因为用到多的控件,这个和4楼一个道理,反而有点饶了!

谢谢大家关心

#25


我想你没有完全理解我的意思
Button仍然是原来的Form的子控件
我所说的Form不过是遮掉原来的Form的一部分罢了

#26


我理解是
第二个Form 的中间是空的对吧??它盖住第一个Form除矩形位置的所有其他位置

#27


#28


对,如果我和4楼说的方法你都不能满意的话,那很抱歉,我也想不出什么好办法了。

#29


定义一个区域,然后判断控件是否进入该区域,如果是,就更改控件大小,需要的话还要调整位置.

#30


应该是绘制窗口的问题,区域内的直接绘制,区域外的处理后绘制btn以外的部分。

#31


采用控件做,这样做效果基本都不会好。因为控件资源消耗比较大,当数量多的时候停滞回比较严重

最好的方法是所有的都自己绘图。

如果非要这样做可以考虑以下方法:

控件闪烁是因为图片绘制太频繁,系统响应不够及时所致。
可以采用双缓存技术解决。
也可以在后台自己创建子控件,创建好后再添加桌面显示。

#32


up

#33


该回复于2008-03-19 13:36:48被版主删除

#34


To楼主,
那你试试.把他的容器= 也一起挂起.

具体写法可以看一下 winform程序自动生成的代码.InitializeComponent

#35


像楼主这种需求一般是用两个窗体实现的,中间那一块叫Client,是有Handle(窗体)的,MDI窗体就是这样实现的。
但是楼主拒绝这种做法,我就不多说了。。。

#36


up

#37


继续!
看来问题很难很严重

#38


帮顶有份耶

#39


提上去!

#40


再提

#41


#42


你好楼主,我以前用Padding调整个,不显示子控件部分是有特别用处,也是自己画的,不过好像是不适合你,你说的这个我现在也正想实现,加我QQ吧122281069