#excel #vba
Вопрос:
Используя несколько вызовов API, я размещаю форму пользователя по центру экрана.
Во время навигации по этой форме пользователя (пользовательский эквивалент «MsgBox») я пытаюсь показать пользователю кнопку, расположенную на листе за формой пользователя.
В зависимости от разрешения и размера монитора лист за формой имеет различные коэффициенты масштабирования, и большую часть времени кнопка, выделяемая на листе, видна.
Иногда форма пользователя полностью закрывает кнопку.
Я добился некоторого успеха в определении того, закрывает ли форма кнопку, но я сталкиваюсь с проблемами, которые, как я предполагаю, связаны с масштабированием.
Dim button as Shape
'helpBtnTop is used ByRef to provide the converted measurement
Dim helpBtnTop as Single
Set button = ThisWorkbook.Sheets("MySheet").Shapes("HelpButton")
'API Call in the following sub uses ConvertPixelsToPoints API to find the top using a conditional string arg
'"Pos" to look at only the Top measurement of the UserForm (left and Right won't matter for this use case).
ReturnPosition button.Top, sngTop:=helpBtnTop, Pos:="Top"
With UserForm
'My problem is right here - the code itself does not _fail to execute_ but UserForm.Top,
'button.Top, NOR helpBtnTop match up in any context. I know some of this
'has to do with Points vs Pixels, but I'm trying to determine which way I need to go for the
'proper conversion. Do I convert the UserForm.Top property to Points? Are they already in
'Points and thus need to be converted back to Pixels? Or should I be converting the button.Top
'Property instead, and then calculating from there?
'
If .Top >= button.top Then
.Top = button.top - .Height
End If
'For example - I have the top of my UserForm lined up directly in line
'(as close to pixel perfect as I can get) with the button - the various .Top properties are as follows:
'UserForm.Top = 379.5
'button.top = 386.25
'helpBtnTop = 357.75.
End With
В конечном итоге я включу .Height
свойство формы пользователя в свои расчеты, так как хочу убедиться, что общее значение всей области формы пользователя не будет блокировать вид кнопки, но сначала я хотел бы понять, что мне нужно сделать, чтобы сравнить яблоки с яблоками, а не с апельсинами.
Если я возьму верхнюю часть каждого объекта и преобразую, используя ActiveWindow.PointsToPixelsY
для измерения, я получу в пределах 6 единиц (в данном случае предполагая пиксели) друг к другу, поэтому мне придется выполнить некоторое преобразование для каждого и основывать математику на этом. Это моя единственная альтернатива?
Комментарии:
1. Я не знаю, чего вы пытаетесь достичь, и у вас, вероятно, есть свои причины хотеть этого, но, честно говоря, с точки зрения пользователя это звучит как плохая практика. Если форма пользователя открыта, то, имхо, любые кнопки, на которые будет направлен пользователь, должны быть в самой форме. Если только это не какое-то анимированное руководство пользователя или что-то в этом роде, и в этом случае вы, вероятно, сможете скрыть, а затем снова показать форму пользователя, когда это необходимо
2. Итак, у меня есть набор кнопок на главном листе книги, которую мы разработали для сравнения наборов данных. Одна из этих кнопок-кнопка справки «?». В начале запуска, когда пользователь впервые регистрирует инструмент, есть ряд справочных диаграмм, указывающих на новые функции и т. Д. В конце есть пользовательское окно сообщения с благодарностью пользователям за регистрацию. При нажатии «ДАЛЕЕ», чтобы продолжить сообщение, оно сообщает пользователю о кнопке на главной странице, чтобы он снова увидел анимацию/диаграммы. . . Проблема в том, что иногда эта кнопка закрывается в зависимости от используемого разрешения.