Как закрасить область?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Как закрасить область?

Сообщение Matew » 22.07.2004 (Чт) 11:21

Как мне закрасить область(она замыкается), описанную набором точек? Вот так я ее рисую:
Код: Выделить всё
for x1=1 to KolvoTochek
y1=f(x1)
h = frmD.hdc
hPen = CreatePen(PS_SOLID, 5 , 0)
hOldPen = SelectObject(h, hPen)
retval = MoveToEx(h, x1, y1, pt)
retval = LineTo(h, p, r)
retval = SelectObject(h, hOldPen)
retval = DeleteObject(hPen)
x1 = p
y1 = r
next x1
[quote]
F(x) это Function.
Я знаю, что область замыкается, но не знаю как ее закрасить!
В QBasic-е был оператор Paint, а VB6 его нет!
Подскажиет что-нибудь! Плиз![/quote]

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 22.07.2004 (Чт) 12:20

<Microsoft Visual Basic 5.0 (четвертое издание)> Джон Кларк Крейг, Джефф Уебб писал(а):Дорогой Джон, как...
Быстро нарисовать многоугольник?

Метод Line позволяет соединить последовательность точек прямыми линиями и вернутся в начальную точку, в результате чего образуется замкнутый многоугольник. Но API-функция Polygon работает быстрее и обладает тем преимуществом, что умеет эффективно закрышивать внутреннюю область многоугольника. Класс Poligon значительно упрощает рисование многоугольников, инкапсулируя эту API-функцию и необходимые ей данные.
Код: Выделить всё
' POLYGON.CLS
Option Explicit

Private Type POINTAPI
  x As Long
  y As Long
End Type

Private Declare Function Polygon _
Lib "gdi32" ( _
  ByVal hdc As Long, _
  lpPoint As POINTAPI, _
  ByVal nCount As Long _
) As Long

' закрытые переменные уровня модуля
Private mobjDevice As Object
Private mfSX1 As Single
Private mfSY1 As Single
Private mfXRatio As Single
Private mfYRatio As Single
Private mPointArray() As POINTAPI

' ~~~ Device (свойство)
Property Set Device(objDevice As Object)
  Dim fSX2 As Single
  Dim fSY2 As Single
  Dim fPX2 As Single
  Dim fPY2 As Single
  Dim nScaleMode As Integer
  Set mobjDevice = objDevice

  With mobjDevice
    ' получаем параметры, определяющие текущий масштаб
    nScaleMode = .ScaleMode
    mfSX1 = .ScaleLeft
    mfSY1 = .ScaleTop
    fSX2 = mfSX1 + .ScaleWidth
    fSY2 = mfSY1 + .ScaleHeight
    ' временно устанавливаем пиксельный режим
    .ScaleMode = vbPixels
    ' получаем параметры, определяющие текущий масштаб
    ' для пиксельного режима
    fPX2 = .ScaleMode
    fPY2 = .ScaleHeight
    ' восстанавливаем исходный масштаб
    If nScaleMode = 0 Then
      mobjDevase.Scale (mfSX1, mfSY1)-(fSX2, fSY2)
    Else
      mobjDevice.ScaleMode = nScaleMode
    End If
    ' вычисляем масштабные коэффициенты
    mfXRatio = fPX2 / (fSX2 - mfSX1)
    mfYRatio = fPY2 / (fSY2 - mfSY1)
  End With
End Property

' ~~~Point X, Y (метод)
Public Sub Point (fX As Single, fY As Single)
  Dim lN As Long
  lN = UBound(mPointArray) +1
  ReDim Preserve mPointArray(lN)
  mPointArray(lN).x = XtoP(fX)
  mPointArray(lN).y = YtoP(fY)
End Sub

' ~~~Draw (метод)
Public Sub Draw()
  Polygon mobjDevice.hdc, mPointArray(1), UBound(mPointArray)
  ReDim mPointArray(0)
End Sub

' выражает X-координату в пикселях
Private Function XtoP(fX As Single) As Long
  XtoP = (fX - mfSX1) * mfXRatio
End Function

' выражает Y-координату в пикселях
Private Function YtoP(fY As Single) As Long
  YtoP = (fY - mfSY1) * mfRatio
End Function

' инициализация
Private Sub Class_Initialize()
  ReDim mPointArray(0)
End Sub
Следующий код демонстрирует работу с объектом Polygon в программе. В данном примере создается многоугольник случайной формы с 17 вершинами; он закрашивается цветом, выбираемым тоже случайно. Чтобы проверить это на практике, введите показанный ниже код в модуль новой формы и добавьте на нее элемент управления PictureBox с именем picTest. (У модуля класса должно быть имя Polygon.) Запустите программу и щелкните окно рисунка.
Код: Выделить всё
' POLYTEST.FRM
Option Explicit

Dim polyTest As New Polygon

Private Sub Form_Load()
  ' каждый раз создаем уникальный многоугольник
  Randomize
  ' можно использовать любые единицы и параметры GDC
  With picTest
    .Move 0, 0, ScaleWidth, ScaleHeight
    .SclaeMode = vbInches
    .FillStyle = vbSolid
  End With
End Sub

Private Sub picTest_Click()
  Dim nI As Integer
  ' указываем элемент PictureBox как устройство,
  ' на которое выводится многоугольник
  Set polyTest.Device = picTest
  With picTest
    ' при каждом щелчке очищаем окно рисунка
    .Cls
    ' формируем случайный многоугольник с 17 вершинами
    For nI = 1 To 17
      polyTest.Point Rnd * .ScaleWidth, Rnd * .ScaleHeight
    Next nI
    ' выбираем цвет по случайному закону
    .FillColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
    ' рисуем многоугольник и закрашиваем его
    polyTest.Draw
  End With
End Sub

Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 22.07.2004 (Чт) 14:55

Если не ошибаюсь то
Код: Выделить всё
Declare Function FloodFill Lib "gdi32" Alias "FloodFill" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
الفيجوال بيسك الرابح

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 22.07.2004 (Чт) 22:57

Абсолютно правильно! А еще лучше, ExtFloodFill - там поддерживаются разные кисти :)
Код: Выделить всё
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function ExtFloodFill Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As Long
Const FLOODFILLBORDER = 0 ' Fill until crColor& color encountered.
Const FLOODFILLSURFACE = 1 ' Fill surface until crColor& color not encountered.
Const crNewColor = vbRed
Dim mBrush As Long
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Create a solid brush
    mBrush = CreateSolidBrush(crNewColor)
    'Select the brush into the PictureBox' device context
    SelectObject Picture1.hdc, mBrush
    'API uses pixels
    Picture1.ScaleMode = vbPixels
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'Delete our new brush
    DeleteObject mBrush
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'Floodfill...
    ExtFloodFill Picture1.hdc, X, Y, GetPixel(Picture1.hdc, X, Y), FLOODFILLSURFACE
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then Picture1.PSet (X, Y)
End Sub

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 24.07.2004 (Сб) 17:02

Спасибо! Я сделал через Екстфлуфид! :D


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 25

    TopList