none
【求助】如何实现在玻璃区的写字? RRS feed

  • 问题

  • 这是我在VB2008的Form1窗体下的代码。Form1上画有几个文本框,Label标签、按钮、复选框、单选按钮。执行后文字也都变透明了,请问要修改哪里的代码?谢谢!

    Public Structure Margins
    
     Public Left As Integer
    
     Public Right As Integer
    
     Public Top As Integer
    
     Public Bottom As Integer
    
    End Structure
    
    
    
    Public Class Form1
    
     Declare Auto Function DwmIsCompositionEnabled Lib "dwmapi.dll" Alias "DwmIsCompositionEnabled" (ByRef pfEnabled As Boolean) As Integer
    
     Declare Auto Function DwmExtendFrameIntoClientArea Lib "dwmapi.dll" Alias "DwmExtendFrameIntoClientArea" (ByVal hWnd As IntPtr, ByRef pMargin As Margins) As Integer
    
     Dim pMargins As Margins
    
    
    
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
      Dim en As Boolean = False
    
      pMargins.Left = 0
    
      pMargins.Right = 0
    
      pMargins.Top = 200
    
      pMargins.Bottom = 0
    
      If System.Environment.OSVersion.Version.Major >= 6 Then
    
       DwmIsCompositionEnabled(en)
    
       If en Then
    
        DwmExtendFrameIntoClientArea(Me.Handle, pMargins)
    
       Else
    
        MessageBox.Show("Desktop Composition is Disabled!")
    
       End If
    
      Else
    
       MessageBox.Show("Please run this on Windows Vista.")
    
      End If
    
      Me.BackColor = Color.FromArgb(0, 0, 0)
    
     End Sub
    
    
    
     Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    
      '此段代码用于重绘窗体不需要透明的那一部分
    
      If System.Environment.OSVersion.Version.Major >= 6 Then
    
       Dim g As Graphics = e.Graphics
    
       Using sBrush = New SolidBrush(SystemColors.Control) '重绘 
    
        g.FillRectangle(sBrush, pMargins.Left, pMargins.Top, Me.ClientRectangle.Width - pMargins.Left - pMargins.Right, Me.ClientRectangle.Height - pMargins.Top - pMargins.Bottom)
    
       End Using
    
      End If
    
     End Sub
    
    
    
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
      End
    
     End Sub
    
    End Class
    
    

    还有2个问题请大家帮忙解决:

    1、在玻璃区有一个label标签,如何才能达到像Windows窗体标题栏一样的文字周围发光的效果?

    2、如何实现在拖动玻璃区的同时窗体同步移动而拖动非玻璃区时不会移动这种效果?

    【非常感谢!】


    胡人
    2010年7月31日 10:07

答案

  • 1.在Aero区域上绘制发光的字体效果实现起来十分复杂,您可以参考一下Windows Forms Aero开源项目(http://windowsformsaero.codeplex.com/)中ThemedLabel和ThemedText控件的实现方式

     

    2.在窗体接受点击时会收到WM_NCHITTEST消息(重载窗体的WndProc),然后通过转换获得鼠标位置

    Dim lparam = m.LParam.ToInt32()
    Dim screenPoint = New Point(lparam And &HFF, lparam >> 16)

    当screenPoint位于玻璃区域上时将m.Result设置为New IntPtr(HTCAPTION)即可

    其中常数的定义为

    public const WM_NCHITTEST  as integer = &H84

    public const HTCLIENT as integer = 1

    public const HTCAPTION as integer = 2


    共同努力,共同提高
    kaedei#live.cn My BLOG
    2010年7月31日 10:39

全部回复

  • 1.在Aero区域上绘制发光的字体效果实现起来十分复杂,您可以参考一下Windows Forms Aero开源项目(http://windowsformsaero.codeplex.com/)中ThemedLabel和ThemedText控件的实现方式

     

    2.在窗体接受点击时会收到WM_NCHITTEST消息(重载窗体的WndProc),然后通过转换获得鼠标位置

    Dim lparam = m.LParam.ToInt32()
    Dim screenPoint = New Point(lparam And &HFF, lparam >> 16)

    当screenPoint位于玻璃区域上时将m.Result设置为New IntPtr(HTCAPTION)即可

    其中常数的定义为

    public const WM_NCHITTEST  as integer = &H84

    public const HTCLIENT as integer = 1

    public const HTCAPTION as integer = 2


    共同努力,共同提高
    kaedei#live.cn My BLOG
    2010年7月31日 10:39
  • 谢谢!那么如何使窗体上的文字不透明呢?
    胡人
    2010年7月31日 12:10
  • 我不懂VC#,呵呵。用VB习惯了。


    胡人
    2010年7月31日 12:20