Попробуйте это, сначала создайте структуру с переменной действия, а когда вы создаете объект структуры, задайте параметр действия для требуемого действия. напр.,
struct testStruct {
var action: (()->())?
var variable: String? {
didSet {
self.action?()
}
}
}
А внутри вашего основного кода - главный класс
var testS = testStruct()
testS.action = {
print("Hello")
}
testS.variable = "Hi"
Когда вы установите testS.variabe = "Hi", он вызовет print ("Hello" )
Существует ли причина, Вы не можете только максимизировать форму? Это было бы моим первым впечатлением.
Если это не бегун, Вы могли бы попытаться получить высоту панели задач следующим образом:
Private Const ABM_GETTASKBARPOS = &H5
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type APPBARDATA
cbSize As Long
hwnd As Long
uCallbackMessage As Long
uEdge As Long
rc As RECT
lParam As Long
End Type
Private Declare Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage As Long, pData As APPBARDATA) As Long
Function GetTaskBarSize()
Dim ABD As APPBARDATA
SHAppBarMessage ABM_GETTASKBARPOS, ABD
MsgBox "Width:" & ABD.rc.Right - ABD.rc.Left
MsgBox " Height:" & ABD.rc.Bottom - ABD.rc.Top
End Sub
и затем устанавливая высоту Вашей формы на высоту экрана меньше высота панели задач.
Только минус панель задач? Это не могло бы действительно быть тем, что Вы хотите. Могут быть другие окна на краях экрана, которые предназначены для "вырезания" регионов рабочего стола. Кроме того, обратите внимание, что иногда высота панели задач не важна, такой как тогда, когда она прикрепляется с левой или правой стороной экрана.
Galwegian показал, как получить высоту панели задач, но если Вы действительно ищете применимую область рабочего стола, используйте SystemParametersInfo
функция с spi_GetWorkArea
флаг вместо этого. Это скажет Вам область рабочего стола, исключая все настольные панели инструментов. MSDN советует, если Вы интересуетесь пространством, доступным на чем-то другом, чем основной монитор, звонить GetMonitorInfo
вместо этого; это заполняет запись, и одно из полей для рабочей области монитора.
Я иду во второй идея, что Вы могли бы действительно просто хотеть максимизировать свое окно. Если Вы уже сделали это, и Вы хотите знать, сколько пространства Вы поднимаете, то получаете текущий размер своего окна и затем вычитаете размеры кадра своего окна (который "подвернут под краями" рабочего стола, когда окно максимизируется). Можно использовать GetSystemMetrics
с sm_CXFrame
и sm_CYFrame
флаги для этого.
Я собираюсь согласиться, что Вы, вероятно, хотите максимизировать свое окно.
Но если Вы действительно хотите знать область рабочего стола, исключая все настольные панели инструментов (панель задач, панель инструментов Microsoft Office, и т.д.), вот некоторые объявления VB6 для вызова SystemParametersInfo и демонстрационной функции, которая центрирует формы на экране, допуская панели инструментов. Это одолжено от 101 технической подсказки (PDF) из старого Журнала Программистов Visual Basic.
Private Const SPI_GETWORKAREA = 48
Private Declare Function SystemParametersInfo& Lib "User32" Alias "SystemParametersInfoA" ( _
ByVal uAction As Long, _
ByVal uParam As Long, lpvParam As Any, _
ByVal fuWinIni As Long)
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Function CenterForm32 (frm As Form)
Dim ScreenWidth&, ScreenHeight&, ScreenLeft&, ScreenTop&
Dim DesktopArea As RECT
Call SystemParametersInfo (SPI_GETWORKAREA, 0, DesktopArea, 0)
ScreenHeight = (DesktopArea.Bottom - DesktopArea.Top) * Screen.TwipsPerPixelY
ScreenWidth = (DesktopArea.Right - DesktopArea.Left) * Screen.TwipsPerPixelX
ScreenLeft = DesktopArea.Left * Screen.TwipsPerPixelX
ScreenTop = DesktopArea.Top * Screen.TwipsPerPixelY
frm.Move (ScreenWidth - frm.Width) / 2 + ScreenLeft, _
(ScreenHeight - frm.Height) / 2 + ScreenTop
End Function