C# winform 控件拖动问题

我想模拟一个简单的操作系统桌面,就是在一个全屏的窗体上实现自定义图标控件的拖动效果我自定义的图标控件用的是透明背景加的图片显示,可以用图标拖动当全屏窗体上没有背景图片事拖... 我想模拟一个简单的操作系统桌面,就是在一个全屏的窗体上实现自定义图标控件的拖动效果

我自定义的图标控件用的是透明背景加的图片显示,可以用图标拖动

当全屏窗体上没有背景图片事拖动很正常
可是窗体上加个背景图片后拖动时仿佛重绘太慢似的总是有闪动

请问怎么解决?

各位高手请指教!!!
展开
 我来答
cmbird
2008-09-19 · TA获得超过576个赞
知道小有建树答主
回答量:211
采纳率:0%
帮助的人:303万
展开全部
自己定义图标控件的拖动时,画图的效率很成问题。
可以有一个简单的方法来实现在背景图片上进行图标拖动的效果,那就是使用ListView控件。
先添加一个ImageList控件,把它的Images属性设成几个图标。
然后添加一个ListView控件,把它的BackgroundImage属性设成背景图片;把LargeImageList设成刚才添加的ImageList控件;把View属性设成LargeIcon;
把AllowDrop设成True;把AutoArrange设成False;然后在它的Items属性中添加几项,把各项的Text值和ImageIndex值(小于ImageList中的图片数)设成不同的值。这样就有点象电脑桌面了。
最后添加拖放事件处理程序就行了:
ItemDrag事件
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
DoDragDrop(e.Item, DragDropEffects.Move);// 开始拖放
}

DragEnter事件
private void listView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.AllowedEffect;// 允许在ListView上拖放
}

DragDrop事件
private void listView1_DragDrop(object sender, DragEventArgs e)
{
// 取得被拖放的项
ListViewItem draggedItem =
(ListViewItem)e.Data.GetData(typeof(ListViewItem));

draggedItem.Position = listView1.PointToClient(new Point(e.X, e.Y)); // 把它放在鼠标放开时的位置
}
1343803
2008-09-20
知道答主
回答量:6
采纳率:0%
帮助的人:0
展开全部
如果认为是重绘太慢,那么建议自己使用一个线程去重绘。
不过这个闪动好像是通病~ MSDN提供有解决方法,见下:

楼上有人说Form 的 DoubleBuffered 属性改为 True
设置成双缓存,我试过,貌似还是闪动!不知道是不是机子问题!嘿嘿~

MSDN上说:
对于大多数应用程序,.NET Framework 提供的默认双缓冲将提供最佳效果。默认情况下,标准 Windows 窗体控件是双缓冲的。可以通过两种方法对窗体和所创作的控件启用默认双缓冲。一种方法是将 DoubleBuffered 属性设置为 true,另一种方法是通过调用 SetStyle 方法将 OptimizedDoubleBuffer 标志设置为 true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用 SetStyle 方法。

对于更多的高级双缓冲情形(如动画或高级内存管理),可以实现自己的双缓冲逻辑。

建议学习这个要多看MSDN

参考资料: MSDN

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tenhou
2008-09-20 · TA获得超过102个赞
知道小有建树答主
回答量:83
采纳率:0%
帮助的人:110万
展开全部
一个非常简单的解决方法,将 Form 的 DoubleBuffered 属性改为 True 应该就好了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
草薙在
2008-09-19 · TA获得超过4795个赞
知道大有可为答主
回答量:6187
采纳率:50%
帮助的人:6322万
展开全部
说明你实现的控件有些问题 如果窗体有背景的时候 他会先重绘背景 然后在上面绘制控件 如果你拖动频繁的话 那么绘制也很频繁 尤其是你说的是全屏绘制 你要知道图形操作是非常昂贵的

我建议你不要操作控件拖动 而是做一个里面可以包含很多可以拖动项的控件 并且自己处理绘制方法(而不是响应绘制事件)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式