И снова о программировании окон

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

И снова о программировании окон

Сообщение MiGan » 30.06.2005 (Чт) 13:15

Никак не получается сделать простейший трюк - независимую форму правильно отпозиционировать на другой форме. Идея такая - не прибегая к программированию Ocx загружать модальный диалог в точке формы, где расположен контрол (combobox). Выставление пропертов .left и .top равными пропертам comboboxa сносит форму куда то в ж... Пробовал через API SetParent/SetWindowLong пришпилить ее к другой форме но в итоге форма становится мертвой (не реагирует на клики:()
Наверняка, нужна к-то другая API ф-ция, но я ее не знаю:( Помогите народ!!!

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

Сообщение Antonariy » 30.06.2005 (Чт) 13:24

Если у окна не стоит стиль WS_EX_LEFT, то начало координат находится в верхнем ПРАВОМ углу.

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

Сообщение Antonariy » 30.06.2005 (Чт) 13:31

Пардон, не правильно понял. Форма сносится потому, что координаты комбобокса в твипах, а апишки меряют в пикселях. Кроме того его координаты - это его координаты на форме, а не на экране. И еще не понятен глубинный смысл этих операций с формой.

JohnCR
Обычный пользователь
Обычный пользователь
 
Сообщения: 75
Зарегистрирован: 14.06.2005 (Вт) 19:03

Сообщение JohnCR » 30.06.2005 (Чт) 13:57

Может так...
Вложения
form_pos.rar
SetWindowPos
(1.19 Кб) Скачиваний: 19

MiGan
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 02.05.2005 (Пн) 13:27

Сообщение MiGan » 30.06.2005 (Чт) 14:14

У меня так (процедура Load загрузки диалогового окна, котоорый надо спозиционировать)

Код: Выделить всё

'mvarParentCombo - элемент, относительно которого надо спозиционировать форму
If mvarParentCombo Is Nothing Then Exit Sub
    Dim X As Long
    Dim Y As Long
    X = (mvarParentCombo.Parent.Left / Screen.TwipsPerPixelX) + (mvarParentCombo.Left / Screen.TwipsPerPixelX)
    Y = (mvarParentCombo.Parent.Top / Screen.TwipsPerPixelY) + (mvarParentCombo.Top / Screen.TwipsPerPixelY)
    SetWindowPos Me.hWnd, 0, X, Y, 0, 0, SWP_SHOWWINDOW


В результате вместо формы рисуется мааааленькая такая точка 2x2 мм, причем опять таки где-то в ж....
:cry:

MiGan
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 02.05.2005 (Пн) 13:27

Сообщение MiGan » 30.06.2005 (Чт) 14:24

Насчет глубинного смысла:) Не прибегая к программированию OCX хочу сделать максимально легкую контструкцию для заполнения справочников базы данных, используя для этого простой комбобокс.

В нем последняя строчка - <Добавить новую запись...> Пользователь кликает на нее и на месте комбика грузится диалог для ввода новой строки в базу данных!

Ты скажешь, что это тупоголовая идея, если можно всякими change и validate рулить данными вводимыми прямо в комбик, но представь ситуацию, что юзер раз так 50 введет всякую хрень (это могут быть и ошибки, и опечатки и пр. хр.) Что потом будет в списке комбика? Правильно - ЛАЖА!

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

Сообщение GSerg » 30.06.2005 (Чт) 14:25

Код: Выделить всё
Option Explicit

Private Declare Function ClientToScreen Lib "user32.dll" (ByVal hwnd As Long, ByRef lpPoint As POINT) As Long

Private Type POINT
  x As Long
  y As Long
End Type

Private Sub Command1_Click()
  Dim f As Form1, p As POINT
 
  Set f = New Form1
  p.x = Me.ScaleX(Command1.Left, Me.ScaleMode, vbPixels)
  p.y = Me.ScaleY(Command1.Top, Me.ScaleMode, vbPixels)
 
  ClientToScreen Me.hwnd, p
  f.Move Me.ScaleX(p.x, vbPixels, vbTwips), Me.ScaleY(p.y, vbPixels, vbTwips)
  f.Show
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Antonariy » 30.06.2005 (Чт) 14:36

Ты скажешь, что это тупоголовая идея, если можно всякими change и validate рулить данными вводимыми прямо в комбик, но представь ситуацию, что юзер раз так 50 введет всякую хрень (это могут быть и ошибки, и опечатки и пр. хр.) Что потом будет в списке комбика? Правильно - ЛАЖА!


Не скажу. Идея вполне разумная, сам делал что-то подобное.

MiGan
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 02.05.2005 (Пн) 13:27

Сообщение MiGan » 30.06.2005 (Чт) 15:27

GSerg писал(а):
Код: Выделить всё
Option Explicit

Private Declare Function ClientToScreen Lib "user32.dll" (ByVal hwnd As Long, ByRef lpPoint As POINT) As Long

Private Type POINT
  x As Long
  y As Long
End Type

Private Sub Command1_Click()
  Dim f As Form1, p As POINT
 
  Set f = New Form1
  p.x = Me.ScaleX(Command1.Left, Me.ScaleMode, vbPixels)
  p.y = Me.ScaleY(Command1.Top, Me.ScaleMode, vbPixels)
 
  ClientToScreen Me.hwnd, p
  f.Move Me.ScaleX(p.x, vbPixels, vbTwips), Me.ScaleY(p.y, vbPixels, vbTwips)
  f.Show
End Sub


Отличная идея, я ее врезал в событие Form load чтобы код не писать по сто раз! :wink: Но возникла мля ишо одна трабла - если мой контрол на контейнере (picturebox), то форма по горизонтали неправильно позиционируется. т.е. - у меня предпол. в видимой области два пикчурбокса, один размещен в левом боку формы (и их границы совпадают), другой в правом. Так вот когда нужно это форму вызвать с контрола на правом пикчурбоксе - она почему то смещается влево, т. е.е так, если бы этот комбик был на той высоте но слева:( Что жа жопа???

MiGan
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 02.05.2005 (Пн) 13:27

Сообщение MiGan » 30.06.2005 (Чт) 16:07

Полная бадяга! Относительно элементов в контейнерах форма съезжает в жопу! Че ж делать то?

MiGan
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 02.05.2005 (Пн) 13:27

Сообщение MiGan » 30.06.2005 (Чт) 16:08

Кажеца понял! Форма съезжает как раз на размер контейнера (X,Y)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.07.2005 (Пт) 19:20

Antonariy писал(а):Если у окна не стоит стиль WS_EX_LEFT, то начало координат находится в верхнем ПРАВОМ углу.

И всё-то у этих ***** справа налево...
winuser.h писал(а):#define WS_EX_LEFT 0x00000000L

Расскажи, как этот стиль может не стоять.
Изображение


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 167

    TopList