Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› FloodFill в Visual Basic 6.0
Посл.ответ Сообщение

Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 22 апреля 2007 01:16
· Личное сообщение · #1

Кто знает как правильно пользоваться функцией FloodFill? Она вроде всё заливает нормально только вот почему когда сохраняешь залитый рисунок на нём заливки не видно?
Я пишу так:
Private Declare Function FloodFill Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
а потом так :
FloodFill Picture1.hdc, X, Y, vbRed




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 22 апреля 2007 13:37
· Личное сообщение · #2

Потому что в VB есть Picture и есть Image. Это два разных свойства PictureBox. Ты видимо сохраняешь нето.

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 22 апреля 2007 14:57
· Личное сообщение · #3

Вобщем дело такое: когда в объекте Picture свойство AutoRedraw=true то рисунок сохраняется нормально а заливка не работает. Когда AutoRedraw=false то заливка работает нормально но рисунок сохраняется как белый лист.
Может это глюк в самом VB?




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 22 апреля 2007 17:45
· Личное сообщение · #4

vitalya2903

А что мешает делать заливку средствами VB? Например:

Picture1.DrawWidth = 10000
Picture1.PSet (100, 100)

Перед этим сделай AutoRedraw=True

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 22 апреля 2007 21:53
· Личное сообщение · #5

GPcH пишет:
А что мешает делать заливку средствами VB? Например:

Picture1.DrawWidth = 10000
Picture1.PSet (100, 100)

Да нет, этож совсем другое. То что ты написал это просто жирная точка на всю Picture. А FloodFill используется для заливки области ограниченной определенным цветом, так сказать корявой области. Ну прям как в Paint, нарисовал какой-то корявый круг и залил его.




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 22 апреля 2007 22:35
· Личное сообщение · #6

Вот ответ:

forum.codenet.ru/showthread.php?t=11046

Если же нужно заполнить стандартный объект то используй код:

loc_404862: Me.ForeColor = RGB(CInt((Rnd(Date) * CDbl(255))), CInt((Rnd(Date) * CDbl(255))), CInt((Rnd(Date) * CDbl(255))))
loc_4048C4: Me.FillColor = RGB(CInt((Rnd(Date) * CDbl(255))), CInt((Rnd(Date) * CDbl(255))), CInt((Rnd(Date) * CDbl(255))))
loc_4048D5: Me.FillStyle = &H0
loc_404953: Me.Circle ((Rnd(Date) * CDbl(&H64)), (Rnd(Date) * CDbl(&H64))), (Rnd(Date) * CDbl(&H1E)), &H0

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 23 апреля 2007 01:02
· Личное сообщение · #7

vitalya2903
Когда AutoRedraw=false то заливка работает нормально но рисунок сохраняется как белый лист.

Если ты сохраняешь рисунок через SavePicture, то нужно поставить AutoRedraw=true и передавать Image:
SavePicture pictureBox.Image, "c:\file.bmp"

когда в объекте Picture свойство AutoRedraw=true то рисунок сохраняется нормально а заливка не работает

У меня работает, попробуй вызвать после рисования Refresh на PictureBox. Если не поможет, покажи код.



Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 23 апреля 2007 16:02
· Личное сообщение · #8

Stiver пишет:
попробуй вызвать после рисования Refresh на PictureBox

Ух ты... Большое спасибо, реально помогло, теперь всё нормально заливается и сохраняется.



Ранг: 15.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 23 апреля 2007 18:52
· Личное сообщение · #9

GPcH пишет:
loc_404862: Me.ForeColor = RGB(CInt((Rnd(Date) * CDbl(255))), CInt((Rnd(Date) * CDbl(255))), CInt((Rnd(Date) * CDbl(255))))
loc_4048C4: Me.FillColor = RGB(CInt((Rnd(Date) * CDbl(255))), CInt((Rnd(Date) * CDbl(255))), CInt((Rnd(Date) * CDbl(255))))
loc_4048D5: Me.FillStyle = &H0
loc_404953: Me.Circle ((Rnd(Date) * CDbl(&H64)), (Rnd(Date) * CDbl(&H64))), (Rnd(Date) * CDbl(&H1E)), &H0


Спасибо, в быту пригодится

Закрываю тему


 eXeL@B —› Программирование —› FloodFill в Visual Basic 6.0
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати