请教一下关于透明控件和右键弹出菜单的问题。

supergold 2004-12-29 03:02:11
先说透明控件:
我做了一个透明的窗体,然后在上面放了一个PICTUREBOX和一个LABEL,要怎么样才能把这两个控件设置成透明的啊?窗体我是用GETWINDOWSLONG函数来改变它的样式的。用什么函数才可以得到控件得样式并改变它?
关于右键弹出菜单的问题:
因为这个窗体我想做成没有边框的,也就是我把FORM的borderstyle属性要设成NONE,在不放置菜单的时候是没有边框的,可是在我设置了菜单后,边框又出现了。我把菜单设置成不可见,改为用右键弹出菜单,可是右键弹出是没有问题,可是窗体的边框还在,要怎么样才能把边框除去?

请大家给点指导!谢谢。
...全文
129 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
supergold 2004-12-31
  • 打赏
  • 举报
回复
为什么按照我上面那个透明窗体的程序,在上面放置的控件都显示不出来啊?
eastwolf 2004-12-31
  • 打赏
  • 举报
回复
你可以直接使用透明控件, 不用把控件特意改为透明, 添加部件 Microsoft forms2.0 object library
透明控件把Backstyle改为0-你试试
supergold 2004-12-30
  • 打赏
  • 举报
回复
还有个问题,透明是解决了,可是上面的picturebox和label都看不到了,该怎么办阿?
'透明的窗体

Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd _
As Long, lpRECT As rect) As Long
Private Declare Function GetClientRect Lib "user32" (ByVal hWnd _
As Long, lpRECT As rect) As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn _
As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _
ByVal nCombineMode As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As _
Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) _
As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd _
As Long, lpPoint As POINTAPI) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As _
Long, ByVal hrgn As Long, ByVal bRedraw As Boolean) As Long

Const RGN_XOR = 3

Private Type POINTAPI
X As Long
Y As Long
End Type

Private Type rect
left As Long
top As Long
right As Long
bottom As Long
End Type

Private rctClient As rect, rctFrame As rect
Private hClient As Long, hFrame As Long

Private Sub MakeTransparent(frm As Form)
GetFrameClientRgn frm
SetWindowRgn frm.hWnd, hFrame, True
End Sub

Private Sub GetFrameClientRgn(frm As Form)
GetWindowRect frm.hWnd, rctFrame
GetClientRect frm.hWnd, rctClient

'将窗口矩形坐标转换为屏幕坐标
Dim lpTL As POINTAPI, lpBR As POINTAPI
lpTL.X = rctFrame.left
lpTL.Y = rctFrame.top
lpBR.X = rctFrame.right
lpBR.Y = rctFrame.bottom
ScreenToClient frm.hWnd, lpTL
ScreenToClient frm.hWnd, lpBR
rctFrame.left = lpTL.X
rctFrame.top = lpTL.Y
rctFrame.right = lpBR.X
rctFrame.bottom = lpBR.Y
rctClient.left = Abs(rctFrame.left)
rctClient.top = Abs(rctFrame.top)
rctClient.right = rctClient.right + Abs(rctFrame.left)
rctClient.bottom = rctClient.bottom + Abs(rctFrame.top)
rctFrame.right = rctFrame.right + Abs(rctFrame.left)
rctFrame.bottom = rctFrame.bottom + Abs(rctFrame.top)
rctFrame.top = 0
rctFrame.left = 0

hClient = CreateRectRgn(rctClient.left, rctClient.top, _
rctClient.right, rctClient.bottom)
hFrame = CreateRectRgn(rctFrame.left, rctFrame.top, _
rctFrame.right, rctFrame.bottom)

CombineRgn hFrame, hClient, hFrame, RGN_XOR
End Sub

Private Sub Form_Resize()
MakeTransparent Me
End Sub
这个是做出透明窗体的代码(社区里别人的),可是我觉得这个好像不是窗体了,只是在原来的窗体周围画了一条线。原来窗体上的控件什么的一个都看不到。感觉是窗体整个都没有了,只剩下个边框一样。哪个兄弟有好的解决办法阿!

5653325兄弟的代码倒是解决了我关于菜单的问题。谢谢!
踏平扶桑 2004-12-29
  • 打赏
  • 举报
回复
//别人的代码

'模块
Public Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long ''以下2个切除窗口的边框
Public Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Public Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hrgn As Long, ByVal bRedraw As Boolean) As Long


Public Type POINTAPI
X As Long
Y As Long
End Type


Public Type rect
left As Long
top As Long
right As Long
bottom As Long
End Type



Public Sub MakeNoBorderForm(frm As Form)
'切除窗口的边框
Dim rctClient As rect, rctFrame As rect
Dim hrgn As Long
Dim lRes As Long
ReDim XY(3) As POINTAPI
Dim lpTL As POINTAPI, lpBR As POINTAPI
'获得窗口矩形区域
'将窗口矩形坐标转换为屏幕坐标
lpTL.X = frm.left / 15
lpTL.Y = frm.top / 15
ScreenToClient frm.hWnd, lpTL
rctClient.left = Abs(lpTL.X)
rctClient.top = Abs(lpTL.Y)
frm.ScaleMode = 1 'Twip
rctClient.right = frm.ScaleWidth / 15 + Abs(lpTL.X)
rctClient.bottom = frm.ScaleHeight / 15 + Abs(lpTL.Y)
'建立要切割的数组
XY(0).X = rctClient.left
XY(0).Y = rctClient.top
XY(1).X = rctClient.right
XY(1).Y = rctClient.top
XY(2).X = rctClient.right
XY(2).Y = rctClient.bottom
XY(3).X = rctClient.left
XY(3).Y = rctClient.bottom
hrgn = CreatePolygonRgn(XY(0), 4, 2)
lRes = SetWindowRgn(frm.hWnd, hrgn, True)
End Sub



'窗体
Private Sub Form_Initialize()
MakeNoBorderForm Me '创建没有任务栏的窗体
End Sub
laviewpbt 2004-12-29
  • 打赏
  • 举报
回复
无边框窗体的右键菜单
设计无边框窗体时,如果使用菜单编辑器,就会自动改变成有边框的窗体,此时,可以在另外一个窗体中(一般情况下你的程序应该不止一个窗体的吧,如果真的只有一个,可以利用其他人写的类,添加右键)编辑菜单(VISIBLE属性设为FALSE),然后在本窗体中调用。调用形式如下:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu Form2.mymenu
End If
End Sub
cindytsai 2004-12-29
  • 打赏
  • 举报
回复
label的透明可以这样做:label.backstyle=1

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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