Калибровка формы для заполнения экранных размеров минус панель задач

Попробуйте это, сначала создайте структуру с переменной действия, а когда вы создаете объект структуры, задайте параметр действия для требуемого действия. напр.,

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" )

6
задан kjack 5 January 2009 в 14:23
поделиться

3 ответа

Существует ли причина, Вы не можете только максимизировать форму? Это было бы моим первым впечатлением.

Если это не бегун, Вы могли бы попытаться получить высоту панели задач следующим образом:

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

и затем устанавливая высоту Вашей формы на высоту экрана меньше высота панели задач.

5
ответ дан 8 December 2019 в 16:12
поделиться

Только минус панель задач? Это не могло бы действительно быть тем, что Вы хотите. Могут быть другие окна на краях экрана, которые предназначены для "вырезания" регионов рабочего стола. Кроме того, обратите внимание, что иногда высота панели задач не важна, такой как тогда, когда она прикрепляется с левой или правой стороной экрана.

Galwegian показал, как получить высоту панели задач, но если Вы действительно ищете применимую область рабочего стола, используйте SystemParametersInfo функция с spi_GetWorkArea флаг вместо этого. Это скажет Вам область рабочего стола, исключая все настольные панели инструментов. MSDN советует, если Вы интересуетесь пространством, доступным на чем-то другом, чем основной монитор, звонить GetMonitorInfo вместо этого; это заполняет запись, и одно из полей для рабочей области монитора.

Я иду во второй идея, что Вы могли бы действительно просто хотеть максимизировать свое окно. Если Вы уже сделали это, и Вы хотите знать, сколько пространства Вы поднимаете, то получаете текущий размер своего окна и затем вычитаете размеры кадра своего окна (который "подвернут под краями" рабочего стола, когда окно максимизируется). Можно использовать GetSystemMetrics с sm_CXFrame и sm_CYFrame флаги для этого.

5
ответ дан 8 December 2019 в 16:12
поделиться

Я собираюсь согласиться, что Вы, вероятно, хотите максимизировать свое окно.

Но если Вы действительно хотите знать область рабочего стола, исключая все настольные панели инструментов (панель задач, панель инструментов 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
5
ответ дан 8 December 2019 в 16:12
поделиться