Страницы: 1
RSS
Задать положение окна приложения в зависимости от размера экрана
 
Здравствуйте, Имеется файл, при открытии которого, окно приложения должно становиться в правом нижнем углу экрана. Т.к. он открывается на разных компьютерах, нужно определить размер экрана, что бы определить координаты расположения окна приложения.
Нашел на другом форуме код который определяет размер:
Код
Dim x As Variant, a#, b#
With GetObject("winmgmts:\\.\root\cimv2")
    For Each x In .ExecQuery("Select * From Win32_DisplayConfiguration")
        a = x.PelsWidth
        b = x.PelsHeight
    Next
End With

И проверил сперва на большом мониторе, затем на другом компьютере с меньшим монитором, и оказалось что в режиме отладки на меньшем мониторе значения a и b те же что и на большом мониторе. Может этот код не то, что нужно для моей цели? Подскажите как программно определить размер экрана? Файл с неработающим кодом прилагаю.
 
Это работало в XP но уже в vista не работало.

попробуйте Select CurrentVerticalResolution, CurrentHorizontalResolution from Win32_VideoController
ну и CurrentVerticalResolution, CurrentHorizontalResolution соответственно.
Изменено: БМВ - 21.12.2017 18:07:55
По вопросам из тем форума, личку не читаю.
 
Переделал код так:
Код
Sub ChangeWindowSize()
Application.ScreenUpdating = False
Dim x As Variant, a&, b&
With GetObject("winmgmts:\\.\root\cimv2")
    For Each x In .ExecQuery("Select CurrentVerticalResolution, CurrentHorizontalResolution from Win32_VideoController")
        a = x.CurrentVerticalResolution
        b = x.CurrentHorizontalResolution
    Next
End With
With Application
    .WindowState = xlNormal
  If ActiveSheet.Name = "Лист2" Then
    .Left = a - 330
    .Top = b - 1500
    .Width = 700
    .Height = 400
  Else
    .Left = a - 130
    .Top = b - 1400
    .Width = 500
    .Height = 300
  End If
End With
Application.ScreenUpdating = True
End Sub

Настроил требуемое расположение окна на компьютере(в правом нижнем углу), затем открыл в ноутбуке и окно оказалось в правом верхнем углу и частично залезло за пределы рабочего стола. Что не так? Может  вместо "Left " и "Top" нужно другие функции применить, или сделать какой нибудь другой расчет координат?
 
b - 1500 при ширине 700, У меня hd матрица, то есть 1366x756
1366 - 1500 - ух как даже не край левый.
По вопросам из тем форума, личку не читаю.
 
Может быть существует отдельная команда определяющая один из углов экрана?
 
OSA913,  Зачем?
Чтоб приклеить правый нижний угол окнаразмером AxB к правому нижнему экрана разрешением HxV нужно окно указанного размера (AxB) разместить в точке H-A,V-B.
По вопросам из тем форума, личку не читаю.
 
Кажется я перепутал местами a и b
 
ну это я сказать не могу, но предупреждаю сразу, в системе где не один, а несколько мониторов, а также там, где используется масштабирование изображения а не изменение разрешения, могут возникнуть сложности.
По вопросам из тем форума, личку не читаю.
 
Поставил переменные на свои места, выставил "Top" и "Left" так, чтобы окно было в правом нижнем углу раб. стола, стало больше похоже на правду:
Код
Sub ChangeWindowSize()
Application.ScreenUpdating = False
Dim x As Variant, a#, b#
With GetObject("winmgmts:\\.\root\cimv2")
    For Each x In .ExecQuery("Select CurrentVerticalResolution, CurrentHorizontalResolution from Win32_VideoController")
        a = x.CurrentVerticalResolution
        b = x.CurrentHorizontalResolution
    Next
End With
With Application
    .WindowState = xlNormal
  If ActiveSheet.Name = "Лист2" Then
    .Top = a - 670
    .Left = b - 1180
    .Width = 700
    .Height = 400
  Else
    .Top = a - 570
    .Left = b - 980
    .Width = 500
    .Height = 300
  End If
End With
Application.ScreenUpdating = True
End Sub

Но все равно есть несовпадения. По логике размеры окна ("Width" и "Height" ) должны совпадать с вычитаемыми от переменных a и b. Отсюда вывод что размер окна определяется не в пикселях. Возникает дополнительный вопрос как перевести эти "единицы измерения" размера окна в пиксели?
 
Цитата
БМВ написал:
но предупреждаю сразу, в системе где не один, а несколько мониторов, а также там, где используется масштабирование изображения а не изменение разрешения, могут возникнуть сложности.
Спасибо, учту.
 
Application.Top  Left  Height,  Width  in points.
Вам проще максимизировать, снять эти показатели и после рассчитать новые, чем пересчитывать DPI.
По вопросам из тем форума, личку не читаю.
 
Покажите пожалуйста как это записать в коде.
 
Я не знаю что под вашими 670 и прочее подразумевается, но вот так
Код
With Application
    .WindowState = xlMaximized
    ALeft = .Left
    ATop = .Top
    AWidth = .Width
    AHeight = .Height
    .WindowState = xlNormal
 
  If ActiveSheet.Name = "List2" Then
    .Top = AHeight - ATop - 670 * (AHeight - Atop) / a
    .Left = AWidth - ALeft - 1180 * (AWidth - ALeft) / b
    .Width = 700 * (AWidth - ALeft) / b
    .Height = 400 * (AHeight - Atop) / a
  Else
    .Top = AHeight - ATop - 570 * (AHeight - Atop) / a
    .Left = AWidth - ALeft - 980 * (AWidth - ALeft) / b
    .Width = 500 * (AWidth - ALeft) / b
    .Height = 300 * (AHeight - Atop) / a
  End If
End With
я не стал переносить коэффициенты в переменные,
Изменено: БМВ - 22.12.2017 17:21:53
По вопросам из тем форума, личку не читаю.
 
Большое спасибо!
Страницы: 1
Наверх