как я могу изменить форму формы в vb.net - PullRequest
0 голосов
/ 28 марта 2009

Я использовал для изменения формы в VB 6.0, используя следующий код:

Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 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 Sub MakeRoundObject(objObject As Object, Value As Long)
  Static lngHeight, lngLong, lngReturn, lngWidth As Long
  lngWidth = objObject.Width / Screen.TwipsPerPixelX
  lngHeight = objObject.Height / Screen.TwipsPerPixelY
  SetWindowRgn objObject.hWnd, CreateRoundRectRgn(10, 50, lngWidth, lngHeight, Value + 10, Value), True
End Sub

Private Sub Form_Load()
   Call MakeRoundObject(Form1, 50)
End Sub

Таким же образом я использовал код VB.NET следующим образом:

Imports Microsoft.VisualBasic.Compatibility

Public Class Form1
  Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer, ByVal X3 As Integer, ByVal Y3 As Integer) As Integer
  Private Declare Function ReleaseCapture Lib "user32" () As Integer
  Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Integer, ByVal hRgn As Integer, ByVal bRedraw As Boolean) As Integer

  Private Sub MakeRoundObject(ByRef objObject As Object, ByRef Value As Integer)
    Static lngLong, lngHeight, lngReturn As Object
    Static lngWidth As Integer
    lngWidth = objObject.Width / VB6.TwipsPerPixelX
    lngHeight = objObject.Height / VB6.TwipsPerPixelY
    SetWindowRgn(objObject.hWnd, CreateRoundRectRgn(0, 0, lngWidth, lngHeight, Value, Value), True)

  End Sub

  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    MakeRoundObject(Me, 20)
  End Sub

End Class

Но в последнем случае я получаю сообщение об ошибке - «Открытый член« hWnd »типа« Form1 »не найден».

Что я делаю?

Ответы [ 4 ]

4 голосов
/ 28 марта 2009

Вам не нужно использовать P / Invoke для этого. Для этого было разработано свойство Form.Region. Простой пример:

Public Class Form1
  Public Sub New()
    InitializeComponent()
    Dim path As New Drawing2D.GraphicsPath()
    path.AddEllipse(0, 0, Me.Width, Me.Height)
    Me.Region = New Region(path)
  End Sub
End Class
0 голосов
/ 22 июня 2009

Другой способ - установить для TransparencyKey такой цвет, как пурпурный или любой другой, не используемый в форме. Затем установите свойство BackgroundImage для некоторого изображения, на котором пурпурный цвет будет представлять прозрачные области. С помощью этой процедуры вы можете получить любую форму с минимальными усилиями.

0 голосов
/ 28 марта 2009

Может быть, другой способ получить форму непрямоугольной формы, о которой вы могли и не задумываться: установить прозрачный цвет фона для формы и работать с этим.

Я часто делаю следующее для таких вещей, как Об экранах в .NET: устанавливаю цвет фона на то, что не используется в реальной форме (например, темно-фиолетовый), и использую GDI +, чтобы нарисовать заполненную форму внутри границ формы нужным цветом это иметь.

На самом деле не изменяет область формы с прямоугольника на что-то другое, но это работает. И часто легче с «разобщенными формами» для формы.

0 голосов
/ 28 марта 2009

Свойство Handle сейчас, а не hWnd.

Если вы включили опцию строго, то компилятор сказал бы, что hWnd больше не существует. Также в .NET вы должны использовать ByVal, а не ByRef, если вам НЕ нужна способность вызывающего пользователя видеть изменения, внесенные в этот параметр, больше нет потери производительности для передачи ByVal. Вы также должны изменить типы ваших параметров для SubRu MakeRoundObject Sub, чтобы они были правильными типами данных вместо Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...