Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

 

  Вопрос: Создать ActiveX, подобный объекту line Добавлено: 22.08.06 19:44  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su

Ответить

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

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



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #16
Добавлено: 24.08.06 13:05
Распознать движение мышки можно апишкой и таймером, токо вот какой апишкой, не помню :(, помню токо, что она координаты курсора возвращает...

p.s.
Только не восьмью, а четырьмя


Четырмя, это по углам, но кроме того он естче выделяется по серединам сторон, примерно так:

1 2 3

8 4

7 6 5

Ответить

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



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #17
Добавлено: 24.08.06 15:09
Четырмя, это по углам, но кроме того он естче выделяется по серединам сторон, примерно так
А ну да точно, не досмотрел.
Распознать движение мышки можно апишкой и таймером, токо вот какой апишкой, не помню :(, помню токо, что она координаты курсора возвращает...
Да дело не в том, чтобы распознать координаты курсора на форме. А надо б их распознать на той линии, которую мы из клаасса начертим средствами АПИ на форме и которая даже не является контролом( и неизвестно чем она вообще являеися, просто линией) -> а вот теперь надо определить когда координаты курсора мыши совпадают с координатами этой линии. Я только так себе это представляю: составить математический алгоритм, в котором.... Ой даже думать об этом не хочу, представь себе только: определить через уравнение начерченной линии координаты каждой её точки, и сверяться с ними при каждом движении курсора до тех пор, пока
кординаты не совпадут. Боюсь это будет мартышкин труд: представляешь если на форме сто таких линий и для каждой всё это проделывать. Я думаю программа такая просто обязано тормозить...

Ответить

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



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #18
Добавлено: 24.08.06 16:48
Ничего подобново!

Примерно так, формулой k = (X1 - X2) / (Y1 - Y2) узнаеш отношение икса к игрэку, затем пробегаешся циклом по иксам:

Shag% = (X1 - X2) / Abs(Y1 - Y2) 'Шаг цикла 1 или -1
Dim Y as Integer
For X% = X1 To X2 Step Shag
Y = X/k
'Все, тепер X и Y - все точки, которые лежат на прямой
Next i

'p.s. Если Y1 = Y2, то код отдельный нужен, а то VB гавкнет про деление на ноль

Ответить

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



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #19
Добавлено: 24.08.06 16:51
Я думаю программа такая просто обязано тормозить...
Торможение можно сильно уменьшить: зыришь, не так, чтоб координаты курсора совпадали с точкой на прямой, а чтоб расстояние между курсором и точкой было меньше какого-нибудь N, а шаг в цикле делаешь Shag * N.

Ответить

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



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #20
Добавлено: 24.08.06 19:11
Мне нравится твой энтузиазм, вот только я обнаружил одну прЕнеприятную вещь. Эти АПИ ни чем не лучше метода line: окно свернёшь и они стираются. Развернешь - уже их нет. В памти-то они не остаются...
Придётся всё как-то объявить в form_paint/ Подумать надо... Сложно всё как-то... Искусственно слишком...

Если ты хорошо представляешь, как это сделать и если что подскажешь, то я возьмусь, а то что-то сам неуверенно себя чувствую

Ответить

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



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #21
Добавлено: 24.08.06 19:30
А AutoRedraw у тебя равен True?


Если ты хорошо представляешь, как это сделать и если что подскажешь, то я возьмусь, а то что-то сам неуверенно себя чувствую


Берись спокойно, в случае-чего все вместе с народом поможем!

Ответить

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



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #22
Добавлено: 24.08.06 19:34
Кстати, что сразу беремся за классы? Юзай контролы! Форму у них можно менять теми же апишками, что и формы!

Ответить

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



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #23
Добавлено: 24.08.06 20:25
Кстати, что сразу беремся за классы? Юзай контролы! Форму у них можно менять теми же апишками, что и формы!
Я просмотрел возможности изменения формы через АПИ. И точно - в виде линии форму сделать нельзя. Максимум - в виде треугольника. Можно конечно выкрутиться оооооочень узким прямоугольником, чтобы он на линию походил. Но по-моему это извращение. Если есть возможность
Наверное глупость сказал - точнне, как сделать чтобы эта форма вообще изчезла, а всё, что на ней видимо осталось и с этим можно было бы работать? Типа того - наверно это легче...
Если это вообще реально.

P.S/ А это не в полной мере, но возможно с помощью windowless.
Да оно и без него всё ещё лучше работает( когда Windowless = false).Главное backstyle = 0.
Здесь я ошибся. Он всё таки влияет. Но чтобы его можно было нормально использовать, надо б его программно менять. А оно не делается.
Если б кто-то знал, как это через АПИ?..

Ответить

Номер ответа: 24
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #24 Добавлено: 24.08.06 20:56
Я просмотрел возможности изменения формы через АПИ. И точно - в виде линии форму сделать нельзя. Максимум - в виде треугольника. Можно конечно выкрутиться оооооочень узким прямоугольником, чтобы он на линию походил. Но по-моему это извращение. Если есть возможность

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

Линией, разумеется, тоже можно. Горизонтальной, вертикальной, наклонной - любой можно.

Ответить

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



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #25
Добавлено: 24.08.06 22:15
Я только так себе это представляю: составить математический алгоритм, в котором.... Ой даже думать об этом не хочу, представь себе только: определить через уравнение начерченной линии координаты каждой её точки, и сверяться с ними при каждом движении курсора до тех пор, пока
кординаты не совпадут.

- А я это так себе представляю:
создать массив переменных типа RECT и при создании новой линии заносить её RECT в этот массив. Далее, при движении мыши мы сначала выбираем те линии в RECT которых вписываются координаты мыши, а за тем проверяем координаты мыши на принадлежность выбраным линиям по уравнению линии (по такому же уравнению, по которому она будет рисоваться). Мне кажется, что это будет рациональнее чем перебирать все линии.

представляешь если на форме сто таких линий и для каждой всё это проделывать. Я думаю программа такая просто обязано тормозить...

- CorelPhotoPaint тоже начинает тормозить если нарисовать очень много объектов и что? ИМХО, это нормальное явление :)

Ответить

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



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #26
Добавлено: 25.08.06 07:20
Если это вообще реально.
Это реально, где то видел контрол, который кидаешь на форму, и она прозрачной становится, а все что на ней остается... Не помню точно(((, вроде какой то Transparent Control, что ли...

CorelPhotoPaint тоже начинает тормозить если нарисовать очень много объектов и что?
Но он же не на VB написан, прога на VB раньше тормозить начнет )\(

Ответить

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



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #27
Добавлено: 25.08.06 16:06
Это реально, где то видел контрол, который кидаешь на форму, и она прозрачной становится, а все что на ней остается... Не помню точно(((, вроде какой то Transparent Control, что ли...
да написал я такой уже контрол: http://sobaka710.narod.ru/lineControl1.rar - но его недостаток, для которого я хотел сделать форму невидимой, сам увидишь, там в комментариях прописано. В остальном контрол состоялся - для VB6 я со своей задачей справился.
А вот в VB.net он не пойдёт (из-за gdi-графики). Я уверен в этом. Поэтому сейчас и пытаюсь здесь найти обходные пути.
Но он же не на VB написан, прога на VB раньше тормозить начнет )\(
В точку! Поэтому его и нужно сделать как можно более быстрым при исполнении.
VBD(отв № 19) и Серега (отв. № 25) дали хорошие советы. Если их объединить + та уверенность, с которой они их дали = может неплохо получиться. Ша попробую... большое спасибо!

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

Линией, разумеется, тоже можно. Горизонтальной, вертикальной, наклонной - любой можно.
Тогда помогай. Код внутри контрола:
Option Explicit

Private Type POINTAPI
  x As Long
  y As Long
End Type
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, _
ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _
ByVal hRgn As Long, ByVal bRedraw As Long) As Long

Public Function SetCreateForm(ByVal propHwnd As Long, ByVal propHDC As Long)
      Dim rComb As Long
      Dim dl As Long
      Dim Poi() As POINTAPI
      Dim vDC As Long
      vDC = propHDC
       ReDim Poi(3)
      Poi(0).x = 184: Poi(0).y = 188
      Poi(1).x = 441: Poi(1).y = 385
      Poi(2).x = 443: Poi(2).y = 383
      Poi(3).x = 185: Poi(3).y = 187
      rComb = CreatePolygonRgn(Poi(0), 4, 2)
      dl = SetWindowRgn(propHwnd, rComb, 1)
End Function

'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
'MappingInfo=UserControl,UserControl,-1,hWnd
Public Property Get hWnd() As Long
    hWnd = UserControl.hWnd
End Property

'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
'MappingInfo=UserControl,UserControl,-1,hDC
Public Property Get hDC() As Long
    hDC = UserControl.hDC
End Property


Внутри формы:
Option Explicit

Private Sub Command1_Click()
    Call UserControl11.SetCreateForm(UserControl11.hWnd, UserControl11.hDC)
End Sub
На форме лежит один usercontrol, который я сделал синим, чтобы отличать от фона. Почему при нажатии на command1, контрол исчезает?
(если всё это сделать для формы - то она превращается в линию)

Ответить

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



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #28
Добавлено: 25.08.06 22:31
Почему при нажатии на command1, контрол исчезает?

- А фиг его знает...
Лично у меня всё работает и в линию превращается.

Может у тебя форма маленькая или контрол. Ты сделай форму 443 х 385 и контрол растени на всю форму - должно заработать :)

Ответить

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



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #29
Добавлено: 25.08.06 22:36
443 х 385

Я имел в виду пиксели

Ответить

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



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #30
Добавлено: 26.08.06 09:06
Или сделай автоматически циклом находи максимальные икс и игрек:


Dim maX As Integer, maY As Integer
Dim I As Integer
For i = 0 to 3
If Poi(i).X > max then max = po(i).x
if poi(i).y > may then may = po(i).y
Next i


ЗЫ:
Может, вместо 4 надо поставить 3, ведь массив оканчивается на 3:
rComb = CreatePolygonRgn(Poi(0), 3, 2)

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

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



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