Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Как переместить начало координат в другой угол? Добавлено: 06.08.06 14:47  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su
Точнее не просто переместить(а даже не переместить, а сделать так, чтобы отсчет координат велся в другую сторону... ), скорее поменять напрвление отсчета.

Если кто-нибудь видел такое, помогите, pls.

Заранее спасибо

Ответить

  Ответы Всего ответов: 17  

Номер ответа: 1
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #1 Добавлено: 06.08.06 16:38
Me.Scale

Ответить

Номер ответа: 2
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 06.08.06 16:56
Me.Scale
- фуфло.
Зырь - если, к примеру, надо по оси Y штоб ноль был не вверху, а внизу - делаешь так:

Private Sub Form_MouseDown(X as Integer, Y as Integer, Button as Integer, Shift as Integer)
MsgBox ScaleHeight - Y
End Sub


Ну тут понятно - из скалыхеигхта вычитай Y, и получаешь наоборот кординату.

Тоже самое с X

Ответить

Номер ответа: 3
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #3
Добавлено: 06.08.06 16:57
p. s. Me.Scale, конечно фуфло, в некоторых случаях :)

Ответить

Номер ответа: 4
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #4
Добавлено: 06.08.06 17:58
ScaleHeight - Y

Ну здесь всё правильно, конечно. Я до этого так и делал... До поры до времени, пока не пришлось решать такую задачу:
[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, и соответственно менять начало координат формы.

Me.Scale

А она по-моему для масштабирования по X и Y

Ответить

Номер ответа: 5
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #5
Добавлено: 06.08.06 18:15
А она по-моему для масштабирования по X и Y

Правда, сразу не додумался, что можно писать типа
Me.Scale(-10,10)-(10,-10)

Так он вроде б должен поменять начало координат, но пока не получилось.
Не понял я как им пользоваться. Помогите

Ответить

Номер ответа: 6
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #6 Добавлено: 06.08.06 18:29
Не понял я как им пользоваться. Помогите

Me.Scale(0, Me.ScaleHeight)-(Me.ScaleWidth, 0)

Ответить

Номер ответа: 7
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #7
Добавлено: 06.08.06 19:33
Me.Scale(0, Me.ScaleHeight)-(Me.ScaleWidth, 0)

Мда... Но он только меняет положение точки, ну то е начала отсчёта координат, но не направление отсчета.

Ответить

Номер ответа: 8
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #8 Добавлено: 06.08.06 20:03
2 АлександР: да что ты говоришь? проверь, а?

Ответить

Номер ответа: 9
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #9
Добавлено: 06.08.06 21:32
Проверил.
Простой пример для проверки: устанавливаем на форму две кнопки и фигуру 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/

Ответить

Номер ответа: 10
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #10 Добавлено: 06.08.06 22:28
а теперь сделай так:

Private Sub Form_Load()
   Me.AutoRedraw = True
   Me.Scale (0, Me.ScaleHeight)-(Me.ScaleWidth, 0)
   Me.Circle(0, 0), 300, vbRed
   Me.Circle(1200, 1200), 300, vbGreen

Направление поменялось. Когда я писал про Me.Scale, я имел в виду это

Ответить

Номер ответа: 11
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #11
Добавлено: 06.08.06 22:37
А давайте внесем немного АПИ :)))
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

Ответить

Номер ответа: 12
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #12
Добавлено: 07.08.06 00:10
Направление поменялось. Когда я писал про Me.Scale, я имел в виду это

Да, действительно работает! Но только для методов, но не для элементов управления.
Во всяком случае спасибо, Sacred Phoenix, за помощь в поиске решений.

Впрочем я тоже здесь кумекал-накумекал, и нашёл решение своей проблемы через ActiveX Control из четырех объектов line, которые делают прямоугольник в любую сторону. Но это неуниверсально. (для каждого случая Control'ы делать - не получится)

А вот Серёга молодец!

А давайте внесем немного АПИ :)))

Вот это то, что надо! Только не понятно чуть-чуть (как всегда при работе с API).

Например, не могу понять, какое значение присваивается переменной client и где. Разъясните пожалуйста, очень интересно

Ответить

Номер ответа: 13
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #13 Добавлено: 07.08.06 12:26
Во всяком случае спасибо, Sacred Phoenix, за помощь в поиске решений.
ну, всегда пожалуйста))

Ответить

Номер ответа: 14
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #14 Добавлено: 07.08.06 12:43
SetWindowOrgEx etc ;)

Ответить

Номер ответа: 15
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #15
Добавлено: 07.08.06 19:18
GetClientRect Parent.hWnd, client

- определяем прямоугольник клиентской области на форме
upperleft.x = client.left
upperleft.y = client.top

- определяем координаты левого верхнего угла клиентской области на форме
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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам