Центрированный ColorDialog
Мне нужно показать закрепленный ColorDialog слева от моей формы.
Я знаю, как расположить локализуемый объект слева от моей формы, но как я могу изменить начальную позицию ColorDialog?
Я думаю, что мне нужно разделить на подклассы, как известные классы "CenteredMessageBox", но не знаю, как это сделать...
Любая помощь?
Это мой плохой код:
Private Sub GlobalHotkey_CTRL_X_Press(ByVal s As Object, ByVal e As Shortcut.HotKeyEventArgs) Handles GlobalHotkey_CTRL_X.Press
ColorDialog1.Color = RGB
ColorDialog1.ShowDialog()
End Sub
Возможно, было бы намного лучше, если бы я мог добавить свойство "position" и "startposition" к элементу управления Colordialog по умолчанию, но, как я уже сказал, не знаю, как и, может быть, кто-то еще сделал этот класс раньше и может опубликовать его здесь...
Спасибо.
ОБНОВИТЬ:
вот что я получаю, используя решение Mzn:
1 ответ
Я написал этот образец во время экспериментов для достижения ваших целей.
Класс X - это класс, который наследуется от ColorDialog и перемещает главное окно, как только оно создается.
DllImport
атрибут - это механизм.NET P/Invoke. Он сообщает компилятору, что мы вызываем нативную функцию. Нужна подпись, тело должно оставаться пустым.
RECT
структура кода котельной пластины от pinvoke.net
Скажите, имеет ли это для вас смысл, и если у вас есть какие-либо вопросы.:)
Imports System.Runtime.InteropServices
Public Class Form1
Dim cd As New X
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Text = Handle.ToString()
End Sub
Private Sub Form1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDoubleClick
cd.ShowDialog(Me)
End Sub
'import' a native function from user32.dll
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function MoveWindow(hwnd As IntPtr, x As Integer, y As Integer, cx As Integer, cy As Integer, _
rpt As Boolean) As Boolean
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function GetClientRect(ByVal hWnd As System.IntPtr, ByRef lpRECT As RECT) As Integer
End Function
End Class
Public Class X
Inherits ColorDialog
Protected Overrides Function HookProc(hWnd As IntPtr, msg As Integer, wparam As IntPtr, lparam As IntPtr) As IntPtr
System.Diagnostics.Debug.Print(hWnd)
'this call messes up things, like the border style
'i don't know how to fix it for now, but there should
'be a way to tell it to move without changing border style
Form1.MoveWindow(hWnd, 50, 110, 333, 333, True)
Return MyBase.HookProc(hWnd, msg, wparam, lparam)
End Function
End Class
'I got this class from http://www.pinvoke.net/ very useful! use as is.
<StructLayout(LayoutKind.Sequential)> _
Public Structure RECT
Private _Left As Integer, _Top As Integer, _Right As Integer, _Bottom As Integer
Public Sub New(ByVal Rectangle As Rectangle)
Me.New(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom)
End Sub
Public Sub New(ByVal Left As Integer, ByVal Top As Integer, ByVal Right As Integer, _
ByVal Bottom As Integer)
_Left = Left
_Top = Top
_Right = Right
_Bottom = Bottom
End Sub
Public Property X As Integer
Get
Return _Left
End Get
Set(ByVal value As Integer)
_Right = _Right - _Left + value
_Left = value
End Set
End Property
Public Property Y As Integer
Get
Return _Top
End Get
Set(ByVal value As Integer)
_Bottom = _Bottom - _Top + value
_Top = value
End Set
End Property
Public Property Left As Integer
Get
Return _Left
End Get
Set(ByVal value As Integer)
_Left = value
End Set
End Property
Public Property Top As Integer
Get
Return _Top
End Get
Set(ByVal value As Integer)
_Top = value
End Set
End Property
Public Property Right As Integer
Get
Return _Right
End Get
Set(ByVal value As Integer)
_Right = value
End Set
End Property
Public Property Bottom As Integer
Get
Return _Bottom
End Get
Set(ByVal value As Integer)
_Bottom = value
End Set
End Property
Public Property Height() As Integer
Get
Return _Bottom - _Top
End Get
Set(ByVal value As Integer)
_Bottom = value + _Top
End Set
End Property
Public Property Width() As Integer
Get
Return _Right - _Left
End Get
Set(ByVal value As Integer)
_Right = value + _Left
End Set
End Property
Public Property Location() As Point
Get
Return New Point(Left, Top)
End Get
Set(ByVal value As Point)
_Right = _Right - _Left + value.X
_Bottom = _Bottom - _Top + value.Y
_Left = value.X
_Top = value.Y
End Set
End Property
Public Property Size() As Size
Get
Return New Size(Width, Height)
End Get
Set(ByVal value As Size)
_Right = value.Width + _Left
_Bottom = value.Height + _Top
End Set
End Property
Public Shared Widening Operator CType(ByVal Rectangle As RECT) As Rectangle
Return New Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height)
End Operator
Public Shared Widening Operator CType(ByVal Rectangle As Rectangle) As RECT
Return New RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom)
End Operator
Public Shared Operator =(ByVal Rectangle1 As RECT, ByVal Rectangle2 As RECT) As Boolean
Return Rectangle1.Equals(Rectangle2)
End Operator
Public Shared Operator <>(ByVal Rectangle1 As RECT, ByVal Rectangle2 As RECT) As Boolean
Return Not Rectangle1.Equals(Rectangle2)
End Operator
Public Overrides Function ToString() As String
Return "{Left: " & _Left & "; " & "Top: " & _Top & "; Right: " & _Right & "; Bottom: " & _Bottom & "}"
End Function
Public Overloads Function Equals(ByVal Rectangle As RECT) As Boolean
Return Rectangle.Left = _Left AndAlso Rectangle.Top = _Top AndAlso Rectangle.Right = _Right AndAlso Rectangle.Bottom = _Bottom
End Function
Public Overloads Overrides Function Equals(ByVal [Object] As Object) As Boolean
If TypeOf [Object] Is RECT Then
Return Equals(DirectCast([Object], RECT))
ElseIf TypeOf [Object] Is Rectangle Then
Return Equals(New RECT(DirectCast([Object], Rectangle)))
End If
Return False
End Function
End Structure