Координаты прямоугольника фокуса ввода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tanya
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 03.03.2004 (Ср) 21:41
Откуда: Беларусь, Минск

Координаты прямоугольника фокуса ввода

Сообщение Tanya » 11.04.2006 (Вт) 10:26

На форме есть элемент MSFlexGrid, для редактирования которого я использую TextBox. При редактировании TextBox должен располагаться над редактируемой ячейкой, для этого я использовала свойства MSFlexGrid CellTop, CellLeft, CellHeight и CellWidth, и, в общем-то все было замечательно.

Но как только я изменила Масштаб Экрана с 96 на 115 точек на дюйм TextBox стал "сползать" ниже и правее необходимого положения.

При изменении размеров окна его элементы тоже стали не очень корректно изменять свои размеры. С этим я справилась с помощью GetWindowRect, GetClientRect, MoveWindpw и ClientToScreen
(Во всяком случае при изменении масштаба экрана все нормально)

Теплится надежда, что каким-то образом можно узнать координаты прямоугольника фокуса ввода и переместить в нужное место TextBox.
Возможно ли узнать координаты прямоугольника фокуса ввода?
Последний раз редактировалось Tanya 11.04.2006 (Вт) 11:49, всего редактировалось 1 раз.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.04.2006 (Вт) 11:12

Вообще, не надо двигать контролы так. У них move есть для этого. Это во-первых. И во-вторых - узрим же текущий код позиционирования текстбокса на флексе.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.04.2006 (Вт) 11:57

Ага, старый мерзкий баг (фича?) VB.
При масштабе экрана =96 Screen.TwipsPerPixelX/Y = 15, а при 120 - 12. Если разделить одно на другое, получится коэффициент 1,25. Еще есть api-функция, с помошью которой можно узнать, 96 на экране или 120, но другие значения она не распознает. И названия не помню. При разрешении 120 можно делить координаты на этот коэффициент. Сам так извращаться не пробовал, но по идее должно помочь.
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.04.2006 (Вт) 12:03

А зачем использовать эти 15 и 12? Если есть методы ScaleX и ScaleY?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tanya
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 03.03.2004 (Ср) 21:41
Откуда: Беларусь, Минск

Сообщение Tanya » 11.04.2006 (Вт) 12:05

Вообще, не надо двигать контролы так. У них move есть для этого


Да. Я так и делала, но наверное что-то не так делала. При переходе масштаба от 96 к 115 точкам на дюйм справа и снизу стали оставаться поля. Не очень красиво. Поэтому я изменила код.

Старый был такой:
Код: Выделить всё
Private Sub Form_Resize()
With Me
  If .WindowState <> vbMinimized Then .MSFlexGrid1.Move _
      0, 0, .Width - .MSFlexGrid1.Left * 2, .Height - 500
End With
End Sub


Хорошо, если можно сделать проще. Если подскажете как :)
Если убрать -500 при определении высоты флекса, то пропадают нижние строки. Это видно по прокрутке, если задать количество строк, большее чем может поместиться на экране, я брала для примера 60.

узрим же текущий код позиционирования текстбокса на флексе.

Код: Выделить всё
Private Sub MSFlexGrid1_DblClick()
  With Me.MSFlexGrid1
    If .ColWidth(.Col) Then
      If .MouseCol >= .FixedCols And .MouseRow >= .FixedRows Then
        txtEdit.Move .CellLeft + .Left - 10, .CellTop + .Top - 20, .CellWidth + 30, _
            .CellHeight + 30
        txtEdit.Text = .TextMatrix(.Row, .Col)
        txtEdit.Visible = True
        txtEdit.SetFocus
      End If
    End If
  End With
End Sub


Здесь различные -10, -20 и +30 были подобраны при 96 точках на дюйм.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.04.2006 (Вт) 12:15

А не надо константами никогда. Вообще их убрать.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tanya
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 03.03.2004 (Ср) 21:41
Откуда: Беларусь, Минск

Сообщение Tanya » 11.04.2006 (Вт) 12:21

Тогда хуже получается:
неважно 96 или 115 точек на дюйм,
текстбокс все равно не точно над ячейкой располагается

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.04.2006 (Вт) 12:23

Текстбокс располагается точно над ячейкой, когда этих констант нет.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.04.2006 (Вт) 12:25

А зачем использовать эти 15 и 12? Если есть методы ScaleX и ScaleY?..
А их и не надо использовать. Просто я показал, откуда взялся коэффициент 1,25, на который нужно все делить.

А ScaleX/Y скорее всего окажутся бесполезными, так как используют тот же кривой механизм пересчета, из-за которого контролы расползаются при большом разрешении.

Tanya, все, кто сталкивался с этой проблемой (включая меня), после нескольких геморойных суток бросали ее и адаптировали программы под стандартные 96 dpi.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.04.2006 (Вт) 13:01

А вообще-то нифига не понятно, что там в мозгах у vb происходит. Привожу скриншот двух прог, снятый при разрешении 120. На левой кнопки "Управление", "Реклама" и фрейм с ListView уползли, а на правой FlexGrid c кодом Тани - и все в порядке. :scratch:
Вложения
test.jpg
test.jpg (68.46 Кб) Просмотров: 149
Лучший способ понять что-то самому — объяснить это другому.

Tanya
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 03.03.2004 (Ср) 21:41
Откуда: Беларусь, Минск

Сообщение Tanya » 11.04.2006 (Вт) 13:36

Текстбокс располагается точно над ячейкой, когда этих констант нет.


При 120 у меня точно нет :(

Так что насчет прямоугольника фокуса ввода? Никак нельзя узнать?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.04.2006 (Вт) 13:43

:roll:

.cellleft, .celltop
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tanya
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 03.03.2004 (Ср) 21:41
Откуда: Беларусь, Минск

Сообщение Tanya » 11.04.2006 (Вт) 14:23

т.е.

txtEdit.Move .CellLeft, .CellTop, .CellWidth, .CellHeight ?

тот самый чай, тот самый вкус ... Все тоже самое
Вложения
sc.jpg
Вот как все у меня выглядит
sc.jpg (333.71 Кб) Просмотров: 143

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.04.2006 (Вт) 14:29

А можно таки gif, и не двух мониторов, а одного участочка? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tanya
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 03.03.2004 (Ср) 21:41
Откуда: Беларусь, Минск

Сообщение Tanya » 11.04.2006 (Вт) 15:25

Gif можно, и 2 окошка в нем
Ну если нужно я сделаю только с одним окошком,
если очень нужно ...

Код следующий:
Код: Выделить всё
Private Sub Form_Resize()
With Me
  If .WindowState <> vbMinimized Then
    .MSFlexGrid1.Move 0, 0, .Width - .MSFlexGrid1.Left * 2, .Height
  End If
End With
End Sub

Private Sub MSFlexGrid1_DblClick()
With Me.MSFlexGrid1
  If .ColWidth(.Col) Then
    If .MouseCol >= .FixedCols And .MouseRow >= .FixedRows Then
      txtEdit.Move .CellLeft + .Left, .CellTop + .Top, .CellWidth, .CellHeight
      txtEdit.Text = .TextMatrix(.Row, .Col)
      txtEdit.Visible = True
      txtEdit.SetFocus
    End If
  End If
End With
End Sub


Обратите внимание, что ни на одном окошке не видно
горизонтальной прокрутки :(
Вложения
sc_XP1.gif
2 окна
(67.54 Кб) Скачиваний: 24


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 178

    TopList