0

我正在为 Windows Embedded Compact 7 开发一个应用程序。我的要求之一是编写一个位于其他控件顶部的圆形按钮(例如 aGrid或 a List)。

在我看来,这在 .Net 框架中是不可能的,但桌面图标提供了非常好的透明度,在其他图标之上也是如此。

为什么会这样,无论如何我可以在 C# 中使用这种透明度吗?

很抱歉遗漏了这么多信息:我使用 c#、.net 3.5 为两个 500 MHz、1 GHz 的 ARM 处理器开发,我使用 Resco 组件,它们只支持背景透明度。他们还说,System.Windows.Forms.Control 不支持透明度。

4

1 回答 1

0

只需复制以下代码,然后粘贴即可。只需制作一个命令按钮或标签或其他任何东西。背景将透明,仅显示命令按钮。

   Option Explicit
   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 CombineRgn Lib _
   "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, _
   ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
   Private Declare Function SetWindowRgn Lib _
   "user32" (ByVal hWnd As Long, ByVal hRgn As Long, _
   ByVal bRedraw As Boolean) As Long
   Private Declare Function DeleteObject Lib _
   "gdi32" (ByVal hObject As Long) As Long

   ' Constants used by the CombineRgn function
   Private Const RGN_AND = 1
   Private Const RGN_OR = 2
   Private Const RGN_XOR = 3
   Private Const RGN_DIFF = 4
   Private Const RGN_COPY = 5

   Private Sub Form_Activate()
   Dim rgnForm As Long, rgnCombined As Long
   Dim rgnControl As Long, x As Long
   Dim formWidth As Single, formHeight As Single
   Dim borderWidth As Single, titleHeight As Single
   Dim ctlLeft As Single, ctlTop As Single
   Dim ctlWidth As Single, ctlHeight As Single
   Dim ctl As Control

   ' Calculate the form area
   borderWidth = (Me.Width - Me.ScaleWidth) / 2
   titleHeight = Me.Height - Me.ScaleHeight - borderWidth
   ' Convert to Pixels
   borderWidth = ScaleX(borderWidth, vbTwips, vbPixels)
   titleHeight = ScaleY(titleHeight, vbTwips, vbPixels)
   formWidth = ScaleX(Me.Width, vbTwips, vbPixels)
   formHeight = ScaleY(Me.Height, vbTwips, vbPixels)

   ' Create a region for the whole form
   rgnForm = CreateRectRgn(0, 0, formWidth, formHeight)

   rgnCombined = CreateRectRgn(0, 0, 0, 0)
   ' Make the graphical area transparent by combining the two regions
   x = CombineRgn(rgnCombined, rgnForm, rgnForm, RGN_DIFF)

   ' Make the controls visible
   For Each ctl In Controls
   ' Make the regions of controls whose container is the form visible
   If TypeOf ctl.Container Is Form Then
   ctlLeft = ScaleX(ctl.Left, vbTwips, vbPixels) + borderWidth
   ctlTop = ScaleX(ctl.Top, vbTwips, vbPixels) + titleHeight
   ctlWidth = ScaleX(ctl.Width, vbTwips, vbPixels) + ctlLeft
   ctlHeight = ScaleX(ctl.Height, vbTwips, vbPixels) + ctlTop
   rgnControl = CreateRectRgn(ctlLeft, ctlTop, ctlWidth, ctlHeight)
   x = CombineRgn(rgnCombined, rgnCombined, rgnControl, RGN_OR)
   End If
   Next ctl


   ' Set the clipping area of the window using the resulting region
   SetWindowRgn hWnd, rgnCombined, True
   ' Tidy up
   x = DeleteObject(rgnCombined)
   x = DeleteObject(rgnControl)
   x = DeleteObject(rgnForm)
  End Sub
于 2013-10-07T12:06:25.763 回答