Вопрос: Как переместить начало координат в другой угол?
Добавлено: 06.08.06 14:47
Автор вопроса: -АлександР- | Web-сайт:sham.clan.su
Точнее не просто переместить(а даже не переместить, а сделать так, чтобы отсчет координат велся в другую сторону... ), скорее поменять напрвление отсчета.
Ну здесь всё правильно, конечно. Я до этого так и делал... До поры до времени, пока не пришлось решать такую задачу:
[B align=center]Необходимо начертить фигуру Shape.
Рисую:
dim X2,Y2 As Single
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
with Form1.Shape1
.left = X
.top = Y
End with
X2 = X:Y2 = Y
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Form1.Shape1.Width = Abs(X2 - x)
Form1.Shape1.Height = Abs(Y2 - y)
'А ниче больше не сделать, width и height
'не хотят быть отрицательными, поэтому модуль
End Sub
Я хотел задать условие If на каждый случай положения X2 и Y2 относительно X и Y, и соответственно менять начало координат формы.
Проверил.
Простой пример для проверки: устанавливаем на форму две кнопки и фигуру shape, далее
Option Explicit
Private Sub Command1_Click()
Me.Scale (0, Me.ScaleHeight)-(Me.ScaleWidth, 0)
End Sub
Private Sub Command2_Click()
Form1.Shape1.Left = 0
Form1.Shape1.Top = 0
Form1.Shape1.Width = 500
Form1.Shape1.Height = 500
End Sub
- ну это например. Теперь смотри:
-Жмем command2 - в левом верхнем углу появляется маленький четырёхугольник, один его угол - в начале координат. Противоположный - отстоит на 500 твипов по X и Y.
-Жмем сommand1 и затем снова command2, shape изчезает с экрана(те с формы), если её развернуть, то увидим, что он просто взял начало координат в левом нижнем углу.
-НО cвойства width и height снова откложились - на 500 - вниз и вправо.
Вот о чём я говорю. Для них отсчет берется опять в тех же направлениях.
Прошу прощения, если я не корректно вначале сформулировал вопрос:
Точнее не просто переместить(а даже не переместить, а сделать так, чтобы отсчет координат велся в другую сторону... ), скорее поменять напрвление отсчета.
Бог с ней, с этим положением начала отсчёта - самое главное поменять направление отсчёта, чтобы width и height отсчитывались, например, вверх и влево от начальной точки, заданной свойствами left и top/
Private Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type
Private Type POINT
x As Long
y As Long
End Type
Private Declare Sub GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT)
Private Declare Sub ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINT)
Private Declare Sub OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long)
Private Sub Command1_Click()
InvertObjectScale Me, Me.Shape1
End Sub
Private Sub Command2_Click()
Form1.Shape1.left = 0
Form1.Shape1.top = 0
Form1.Shape1.Width = 500
Form1.Shape1.Height = 500
End Sub
Private Sub InvertObjectScale(Parent As Form, Obj As Control)
Dim OldSM As Integer
OldSM = Parent.ScaleMode
If OldSM <> 3 Then Parent.ScaleMode = 3
Dim client As RECT
Dim upperleft As POINT
GetClientRect Parent.hWnd, client
upperleft.x = client.left
upperleft.y = client.top
ClientToScreen Parent.hWnd, upperleft
OffsetRect client, upperleft.x, upperleft.y
Obj.top = client.bottom - client.top - Obj.top - Obj.Height
Obj.left = client.right - client.left - Obj.left - Obj.Width
If OldSM <> 3 Then Parent.ScaleMode = OldSM
End Sub
Направление поменялось. Когда я писал про Me.Scale, я имел в виду это
Да, действительно работает! Но только для методов, но не для элементов управления.
Во всяком случае спасибо, Sacred Phoenix, за помощь в поиске решений.
Впрочем я тоже здесь кумекал-накумекал, и нашёл решение своей проблемы через ActiveX Control из четырех объектов line, которые делают прямоугольник в любую сторону. Но это неуниверсально. (для каждого случая Control'ы делать - не получится)
А вот Серёга молодец!
А давайте внесем немного АПИ ))
Вот это то, что надо! Только не понятно чуть-чуть (как всегда при работе с API).
Например, не могу понять, какое значение присваивается переменной client и где. Разъясните пожалуйста, очень интересно
- определяем координаты левого верхнего угла клиентской области на форме
ClientToScreen Parent.hWnd, upperleft
- конвертируем эти относительные координаты в абсолютные (относительно верхнего левого угла экрана)
OffsetRect client, upperleft.x, upperleft.y
- пересчитываем прямоугольник клиентской области с учетом абсолютных координат...
НО!!!, я как всегда, немного перестарался ))
Зачем вообще получать абсолютные координаты, когда все действия происходят в рамках одной единственной формы??? Правильно! Это нам на фиг не надо
Так что:
Private Sub InvertObjectScale(Parent As Form, Obj As Control)
Dim OldSM As Integer
OldSM = Parent.ScaleMode
If OldSM <> 3 Then Parent.ScaleMode = 3
Dim client As RECT
GetClientRect Parent.hWnd, client
Obj.top = client.bottom - client.top - Obj.top - Obj.Height
Obj.left = client.right - client.left - Obj.left - Obj.Width
If OldSM <> 3 Then Parent.ScaleMode = OldSM
End Sub