各位高手,很有趣的问题...

yghua8 2003-10-24 05:49:21
我建立了一个窗体,设置了透明色(transparenskey)属性,让除控件、标题栏以外的窗体区域都变成了透明。我现在要实现用鼠标任意拖动一个label1控件,在label1的mouseup、mousedown、mouseup中分别写代码实现(我的代码主要是改变label1.left和top属性),存在着以下问题:
1、label1随鼠标移动的效果很不理想,出现重叠阴影等;
2、当移到窗体透明区时,label1显示有问题,而且不能再次进行移动操作了。
...

源码随后帖上,请各位大侠指点迷津。
...全文
104 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yghua8 2003-11-12
  • 打赏
  • 举报
回复
非常感谢sumtec,感谢你让我有了再次研究这个的勇气,没想到的是,解决的方法居然如此简单。
首先,我还是说下我的程序吧:
1、我的标签控件中没有图片,只是赋了TEXT属性而已,背景色设为了红色以防止与窗体transparenskey属性一样。
2、窗体再无其它控件,通过设置窗体的transparenskey属性值为blue,背景色为blue使窗体除标题栏、边框、标签外都透明。也就是说运行后窗体本就透明,标签是在WINDOWS桌面上或其它应用窗体上移动的。

对于移动的脚本、坐标控制楼上所述应该很正确,还未仔细校正。关键的是在透明窗中移动标签所造成的重绘问题:
最终解决方法时:
在mousemove事件中移动标签控件的脚本前设标签visible属性为false,最后再设visible为true即可。

再次感谢各位的热心!
sumtec 2003-11-11
  • 打赏
  • 举报
回复
呵呵,怎么会没人会呢?只是都潜水去了。我不给你代码了,给你几点提示不只可否?

1、你的代码里面有关移动的部分有问题,正确的解决办法应该是:将MouseMove里面获得的位置转换成屏幕位置(PointToScreen),然后减去鼠标按下去时的xy值(Label坐标系,偏移量),最后再转换到Parent的坐标系上面(PointToClient)。

上面有人给你写一个出来,不过那个cx,cy没有必要作为全局变量,甚至不需要出现。
此外,在MouseDown/MouseUp里面完全没有必要iblStart,只要在MouseMove里面判断e.Button就够了。


2、透明区域是吧?
我想如果你指的应该是Label上面有一个图片,其中一部分是Alpha值透明的,而Label本身也是透明的,于是在移动的时候本来应该透明出来的背景就变花了,那么:

对这个问题有两个情况:1、这个背景是一个图片;2、背景是一个别的什么控件,并且没有图片。
对于第一个情况比较好处理:继承这个Label控件,重写其中的OnPaint事件,在MyBase.OnPaint(e)之前,将背后图片切出自身大小的相应一块,画到自己身上。

g = Me.CreateGraphics()
g.DrawImage(...)
MyBase.OnPaint(e)

这种情况效率应该还可以。

对于后面一种情况,那就比较麻烦了。理论上来说,你只要在MouseMove里面写成:
if e.Button ... Then
Sender.Visible = false
Sender.Parent.Update()
Sender.Left = ...
Sender.Right = ...
Sender.Visible = true
end if
就可以了,可是问题是我不清楚者是否会引起MouseUp/MouseDown事件,虽然我估计不会,但是你得试试才知道了。而且就算可以,我可以肯定效率不是非常好。如果你觉得这样效率不好的话,那么就需要通过比较麻烦的双缓冲……算了这个就不罗嗦了。或者可以在MouseUp的时候才进行一下处理,移动的时候花就花吧!

如果你说的是在一个有透明部分的控件上移动出现花了的情况,那么如果是Parent关系,用上面的Visible=false/Parent.Update()/Visible=true的方法是可以的。如果不是,那么就比较麻烦了,效率肯定非常低。(由于太麻烦了,你告诉我时这种情况我再给你说吧!)
yghua8 2003-11-11
  • 打赏
  • 举报
回复
??
yghua8 2003-11-04
  • 打赏
  • 举报
回复
不会吧?居然没人解决?
zhoubomylove 2003-11-01
  • 打赏
  • 举报
回复
up
sunshine5211314 2003-11-01
  • 打赏
  • 举报
回复
ok
yghua8 2003-10-30
  • 打赏
  • 举报
回复
to:良朋
我的label的borderStyle属性已设为FixedSingle,拖动时,在屏幕留下了很多痕迹...,手工最小化一下窗体又没了,说明程序刷新有问题,但不知咋解决...
yghua8 2003-10-30
  • 打赏
  • 举报
回复
谢谢!
代码已发,请收 。
cnhgj 2003-10-29
  • 打赏
  • 举报
回复
我确实不明白你说的,你把你的代码发给我看看吧
cnhgj@21cn.com
yghua8 2003-10-29
  • 打赏
  • 举报
回复
不会吧?没人能解决啦?
良朋 2003-10-29
  • 打赏
  • 举报
回复
我做过类似的程序,用mouse移动Label或小图片,效果很好呀。
有没把BorderStyle 设为single 或3D 试试。
yghua8 2003-10-27
  • 打赏
  • 举报
回复
最关键的问题是:移动标签,透明区域背后屏幕不能自动重绘。
yghua8 2003-10-27
  • 打赏
  • 举报
回复
我说的设置透明,是指通过设置透明色(即设置透明色为窗体背景色而达到的透明效果,而不是设置opacity)。
良朋 2003-10-26
  • 打赏
  • 举报
回复
第一,你把Label的BorderStyle 设为single 或3D 试试,它会选移动边框的,mouseup的再显示Label.
第二
lblLT.Left = e.X
lblLT.Top = e.Y
有点问题,好在Label一般都很小,影响不大,如果是图片控件,问题就出来的。
一般要在MouseDown时定义一个原始位置,再加上mouse移动的距离就很好了。
cnhgj 2003-10-25
  • 打赏
  • 举报
回复
你说透明区域指的是哪里?以上代码,我把窗体透明度设为30%,然后拖动label,不会出现你说的情况
yghua8 2003-10-25
  • 打赏
  • 举报
回复
运行以上代码,当在透明区域透动标签控件时,屏幕重绘就出问题了。
有高手能解决吗?
lang11zi 2003-10-25
  • 打赏
  • 举报
回复
up
yghua8 2003-10-25
  • 打赏
  • 举报
回复
谢谢cnhgj
但您的代码还是没有解决重画的问题
可以按我所建的窗体实际运行一下,
你会发现根本不行。
bigpig 2003-10-24
  • 打赏
  • 举报
回复
up
cnhgj 2003-10-24
  • 打赏
  • 举报
回复
Dim iblStart As Boolean
Dim cx, cy, mx, my As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End Sub

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

End Sub

Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown
If e.Button = MouseButtons.Left Then
iblStart = True
mx = e.X
my = e.Y
End If
End Sub

Private Sub Label1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseUp
iblStart = False
End Sub

Private Sub Label1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseMove
If iblStart = True Then
cx = Label1.Left - mx + e.X
cy = Label1.Top - my + e.Y
Label1.Left = cx
Label1.Top = cy
End If
End Sub
加载更多回复(3)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧