Показать полную графическую версию : Окно произволной формы в VB.NET
ProgrammerPC
28-11-2009, 14:18
Здравствуйте!)))Подскажите пожалуйста,можно ли в Visual Studio на VB.NEt сделать программу произвольной формы.Я похожий вопрос задавал в этой тема http://forum.oszone.net/nextoldesttothread-132109.html .Там я хотел сделать окно произвольной формы(КПК Сталкера) для Autorun.А теперь этот же КПК сталкера хочу сделать для программы в Visual Studio.Помогите пожалуйста,как это можно сделать,и возможно ли вообще.)))
Доброго времени суток ProgrammerPC
Да это возможно.
На похожий вопрос был ответ в 130 посте темы Visual Basic 2008 (http://forum.oszone.net/post-825044.html#post825044)
Там был вопрос про появляющийся фиолетовый цвет, при проектировки окна по изображению с альфа каналом (в последнем как раз и задаётся - что будет прозрачным).
На основе тех трёх строчек уже можно получить форму с произвольной формой, заданную в картинке с альфа каналом. Остаётся правда заголовок окна, его можно убрать задав регион отсекающий последний. Но после убирание заголовка формой затруднительно управлять, не говорю про команды свернуть, на весь экран и закрыть это и так надеюсь понятно, а элементарно передвинуть на экране. Для решение этого вопроса поможет вставка двух Win32 функции.
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Class Form1
Inherits Form
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Const WM_NCLBUTTONDOWN = &HA1, HTCAPTION = 2, HTLEFT = 10
Const HTTOPRIGHT = 14, HTRIGHT = 11, HTTOP = 12, HTTOPLEFT = 13
Const HTBOTTOM = 15, HTBOTTOMLEFT = 16, HTBOTTOMRIGHT = 17
Shared Sub Main()
Application.Run(New Form1)
End Sub
Sub New()
Me.TransparencyKey = BackColor
Dim Img As Bitmap = Bitmap.FromFile("Используемое изображение.gif")
Me.BackgroundImage = Img
Dim rect As New Rectangle(0, 0, Me.ClientSize.Width - 1, Me.ClientSize.Height - 1)
Dim sz As New Size(Me.ClientSize.Width \ 5, Me.ClientSize.Height \ 5)
Dim path As New Drawing2D.GraphicsPath()
path.AddLine(rect.Right, rect.Top + 22, _
rect.Right, rect.Bottom)
path.AddLine(rect.Left + 5, rect.Bottom, _
rect.Left + 5, rect.Top + 22)
Dim winreg As New Region(path)
Me.Region = winreg
End Sub
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
ReleaseCapture()
SendMessage(Me.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0)
End Sub
End Class
taravasya
26-02-2010, 02:00
Привет! Не подскажите, как можно(и возможно ли вообще), воспользоваться функциями SendMessage, и ReleaseCapture в VB.NET 2008?
При добавлении их в начале модуля, ошибок нет. А вот потом в коде
Me.hwnd
Пишет hwnd - не является членом...(моей формы).
taravasya, код выше подходит и для VB.NET 2008.
Для VB.NET ... позволительно использовать и Handle, вместо hwnd, объекта Me ... >> (http://forum.oszone.net/post-1307388.html#post1307388)
для этого случая, в отличии к примеру от Managed C++ (C++/CLI), который тоже использует .NET
taravasya
27-02-2010, 16:37
М-м-м... Сразу не заметил. То-есть в декларации пишется по-прежнему hwnd, а в коде
me.Handle
Я правильно понял?
taravasya, да.
В декларации "SendMessageA" (ByVal hwnd As IntPtr, ... hwnd всего лишь имя переменной (может быть любым) типа IntPtr, которая передаётся по значению (ByVal) в функцию SendMessageA.
Me.Handle в данном случаи дескриптор объекта форма.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.