Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

  Вопрос: WinAPI ExtFloodFill Добавлено: 14.03.09 13:39  

Автор вопроса:  diplay

Ответить

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

Номер ответа: 16
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #16 Добавлено: 15.03.09 17:51
у меня есть битмап с прозрачным фоном, который я отрисовываю на контроле черного цвета(цвет фона контрола в моей проге можно менять)прикол в том что я вначале на контроле рисую координтную сетку а потом сверху еще битмап с прозрачным фоном. А после заливки прозрачный фон превращается в серый и за ним не видно координатной сетки и цвет фона контрола

Ответить

Номер ответа: 17
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #17 Добавлено: 15.03.09 18:21
diplay пишет:
А после заливки прозрачный фон превращается в серый

не знаю я что ты там накосячил.. у меня нет никакого серого.. картинка как была прозрачная так и осталась.. только что проверил.

Ответить

Номер ответа: 18
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #18 Добавлено: 15.03.09 18:34
я уже сумел обойти это - после заливки в битмапе вызвал метод MakeTransparent(Color.FromArgb(255, 211, 211, 211))
211.211.211 - это тот самый серый цвет

Ответить

Номер ответа: 19
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #19 Добавлено: 15.03.09 23:46
diplay пишет:
после заливки в битмапе вызвал метод MakeTransparent

:-D достойный ответ чемберлену..

Ответить

Номер ответа: 20
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #20 Добавлено: 16.03.09 19:13
достойный ответ чемберлену..

чё такое чемберлен?
кстати я сёдня отнес в школу свою прогу а там на школьных компах вместо серого он синим(0.0.211) цветом заливает. у меня виста а там xp.

Ответить

Номер ответа: 21
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #21
Добавлено: 16.03.09 22:20
Надо использовать системные цвета.

Ответить

Номер ответа: 22
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #22 Добавлено: 18.03.09 15:38
достойный ответ чемберлену..

ru.wikipedia.org/wiki/Наш_ответ_Чемберлену
узнал, что такое чемберлен )

Ответить

Номер ответа: 23
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #23 Добавлено: 18.03.09 16:20
Написав фразу достойный ответ чемберлену.. я хотел сказать, что ты использовал весьма нестандартный подход к решению проблемы..

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #24 Добавлено: 18.03.09 19:33
а это хорошо или плохо?
PS
а какой тогда стандартный?

Ответить

Номер ответа: 25
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #25 Добавлено: 18.03.09 19:36
это плохо.. потому что то,что ты сделал называется кривой костыль и никак иначе..

Ответить

Номер ответа: 26
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #26 Добавлено: 18.03.09 19:36
а стандартный - это надо тебе разобраться во всем, выяснить причину почему у тебя все закрашивается девым цветом и устранить этот косяк

Ответить

Номер ответа: 27
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #27 Добавлено: 19.03.09 09:57
а как бы я его нашел? я плохо разбираюсь в дескрипторах, WinAPI и тп., так что найти косяк в заливке я бы не смог.

Ответить

Номер ответа: 28
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #28 Добавлено: 19.03.09 10:01
вот мой заливочный код, все почти как у тебя
  1. Public Class gdi
  2. #Region "Win32API"
  3.     Public Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As IntPtr, ByVal hGdiObj As IntPtr) As IntPtr
  4.     Public Declare Function CreateSolidBrush Lib "gdi32.dll" (ByVal crColor As Integer) As IntPtr
  5.     Public Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdx As IntPtr) As IntPtr
  6.     Public Declare Function ExtFloodFill Lib "gdi32.dll" (ByVal hdc As IntPtr, ByVal xStart As Integer, ByVal yStart As Integer, ByVal crColor As Integer, ByVal fuFillType As UInteger) As Boolean
  7.     Public Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As IntPtr) As Boolean
  8. #End Region
  9.  
  10.     Public Shared Function FloodFill(ByVal bitmap As Bitmap, ByVal newColor As Color, ByVal borderColor As Color, ByVal pt As Point) As Bitmap
  11.         Using Graphics As Graphics = Graphics.FromImage(bitmap)
  12.             Dim hdc As IntPtr = Graphics.GetHdc()
  13.             Dim memDC As IntPtr = gdi.CreateCompatibleDC(hdc)
  14.             Dim Brush As IntPtr = gdi.CreateSolidBrush(ColorTranslator.ToWin32(newColor))
  15.             Dim intBorderColor As Integer = ColorTranslator.ToWin32(borderColor)
  16.             Dim oldBr As IntPtr = gdi.SelectObject(memDC, Brush)
  17.             Dim hBitmap As IntPtr = bitmap.GetHbitmap()
  18.             Dim oldhBitmap As IntPtr = gdi.SelectObject(memDC, hBitmap)
  19.             ExtFloodFill(memDC, pt.X, pt.Y, intBorderColor, 0)
  20.             bitmap.Dispose()
  21.             bitmap = bitmap.FromHbitmap(hBitmap)
  22.             SelectObject(memDC, oldBr)
  23.             SelectObject(memDC, oldhBitmap)
  24.             DeleteObject(hBitmap)
  25.             DeleteObject(Brush)
  26.             DeleteObject(memDC)
  27.             Graphics.ReleaseHdc(hdc)
  28.         End Using
  29.         Return bitmap
  30.     End Function
  31. End Class

Ответить

Номер ответа: 29
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #29 Добавлено: 19.03.09 10:04
а вот вызов заливки
  1. Public Sub FloodPaint(ByVal colorToUse As Color, ByVal borderColor As Color, ByVal startPoint As Point)
  2.         NextAction()
  3.         mapa = gdi.FloodFill(mapa, colorToUse, borderColor, startPoint).Clone()
  4.         If Not gdiTransparent = Nothing Then
  5.             mapa.MakeTransparent(gdiTransparent)
  6.         End If
  7.         a.Dispose()
  8.         a = Graphics.FromImage(mapa)
  9.         Me.Refresh()
  10.     End Sub

Ответить

Номер ответа: 30
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #30 Добавлено: 19.03.09 11:52
diplay пишет:
вот мой заливочный код, все почти как у тебя

А кто говорил, что я не мог ошибиться? У меня тоже не семь пядей во лбу..
Случайно наткнулся на вот такую интересную инфу для VB6:
http://www.visual.2000.ru/develop/ms-vb/tips/0109.htm#tip396
Следует обратить внимание на один момент, не отмеченный в документации и обнаруженный нами в ходе эксперимента. Оказалось, что функция ExtFloodFill срабатывает, только если перед обращением к ней выполнено обращение к свойству object.Point (x, y).

Видимо, у этой функции есть какая то особенность, о которой мы не подозреваем.

Ответить

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

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



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