Четырмя, это по углам, но кроме того он естче выделяется по серединам сторон, примерно так
А ну да точно, не досмотрел.
Распознать движение мышки можно апишкой и таймером, токо вот какой апишкой, не помню , помню токо, что она координаты курсора возвращает...
Да дело не в том, чтобы распознать координаты курсора на форме. А надо б их распознать на той линии, которую мы из клаасса начертим средствами АПИ на форме и которая даже не является контролом( и неизвестно чем она вообще являеися, просто линией) -> а вот теперь надо определить когда координаты курсора мыши совпадают с координатами этой линии. Я только так себе это представляю: составить математический алгоритм, в котором.... Ой даже думать об этом не хочу, представь себе только: определить через уравнение начерченной линии координаты каждой её точки, и сверяться с ними при каждом движении курсора до тех пор, пока
кординаты не совпадут. Боюсь это будет мартышкин труд: представляешь если на форме сто таких линий и для каждой всё это проделывать. Я думаю программа такая просто обязано тормозить...
Примерно так, формулой 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 гавкнет про деление на ноль
Я думаю программа такая просто обязано тормозить...
Торможение можно сильно уменьшить: зыришь, не так, чтоб координаты курсора совпадали с точкой на прямой, а чтоб расстояние между курсором и точкой было меньше какого-нибудь N, а шаг в цикле делаешь Shag * N.
Мне нравится твой энтузиазм, вот только я обнаружил одну прЕнеприятную вещь. Эти АПИ ни чем не лучше метода line: окно свернёшь и они стираются. Развернешь - уже их нет. В памти-то они не остаются...
Придётся всё как-то объявить в form_paint/ Подумать надо... Сложно всё как-то... Искусственно слишком...
Если ты хорошо представляешь, как это сделать и если что подскажешь, то я возьмусь, а то что-то сам неуверенно себя чувствую
Кстати, что сразу беремся за классы? Юзай контролы! Форму у них можно менять теми же апишками, что и формы!
Я просмотрел возможности изменения формы через АПИ. И точно - в виде линии форму сделать нельзя. Максимум - в виде треугольника. Можно конечно выкрутиться оооооочень узким прямоугольником, чтобы он на линию походил. Но по-моему это извращение. Если есть возможность
Наверное глупость сказал - точнне, как сделать чтобы эта форма вообще изчезла, а всё, что на ней видимо осталось и с этим можно было бы работать? Типа того - наверно это легче...
Если это вообще реально.
P.S/ А это не в полной мере, но возможно с помощью windowless.
Да оно и без него всё ещё лучше работает( когда Windowless = false).Главное backstyle = 0.
Здесь я ошибся. Он всё таки влияет. Но чтобы его можно было нормально использовать, надо б его программно менять. А оно не делается.
Если б кто-то знал, как это через АПИ?..
Я просмотрел возможности изменения формы через АПИ. И точно - в виде линии форму сделать нельзя. Максимум - в виде треугольника. Можно конечно выкрутиться оооооочень узким прямоугольником, чтобы он на линию походил. Но по-моему это извращение. Если есть возможность
Неправда, можно форме задать абсолютно любую форму, ну т.е. любую, начиная с обычного прямоугольника и заканчивая каким-нибудь кренделем с дырками.
Линией, разумеется, тоже можно. Горизонтальной, вертикальной, наклонной - любой можно.
Я только так себе это представляю: составить математический алгоритм, в котором.... Ой даже думать об этом не хочу, представь себе только: определить через уравнение начерченной линии координаты каждой её точки, и сверяться с ними при каждом движении курсора до тех пор, пока
кординаты не совпадут.
- А я это так себе представляю:
создать массив переменных типа RECT и при создании новой линии заносить её RECT в этот массив. Далее, при движении мыши мы сначала выбираем те линии в RECT которых вписываются координаты мыши, а за тем проверяем координаты мыши на принадлежность выбраным линиям по уравнению линии (по такому же уравнению, по которому она будет рисоваться). Мне кажется, что это будет рациональнее чем перебирать все линии.
представляешь если на форме сто таких линий и для каждой всё это проделывать. Я думаю программа такая просто обязано тормозить...
- CorelPhotoPaint тоже начинает тормозить если нарисовать очень много объектов и что? ИМХО, это нормальное явление
Это реально, где то видел контрол, который кидаешь на форму, и она прозрачной становится, а все что на ней остается... Не помню точно(((, вроде какой то Transparent Control, что ли...
CorelPhotoPaint тоже начинает тормозить если нарисовать очень много объектов и что?
Но он же не на VB написан, прога на VB раньше тормозить начнет )\(
Это реально, где то видел контрол, который кидаешь на форму, и она прозрачной становится, а все что на ней остается... Не помню точно(((, вроде какой то 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, контрол исчезает?
(если всё это сделать для формы - то она превращается в линию)