Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

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

 

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

Автор вопроса:  diplay
BOOL ExtFloodFill(
  HDC hdc, // дескриптор DC
  int nXStart, // начальная x-координата
  int nYStart, // начальная y-координата
  COLORREF crColor, // цвет рамки или закрашиваемой области
  UINT fuFillType // тип заливки
);

В функции нет параметра, каким цветом заливать, есть только цвет границ. Тогда как на VB.NET задать цвет, которым заливать?

Ответить

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

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



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #1
Добавлено: 14.03.09 14:02
В этом случае вместо ExtFloodFill использовал CreateMappedBitmap, тогда закрашивается не только контур, просто заменяется 1 цвет в изображении.

А вообще в VB.NET обычно свои танцы с бубном и использование Win32 API напрямую дотнетовцы не приветствуют.

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #2 Добавлено: 14.03.09 14:06
Мне не надо менять один цвет в изображении на другой, мне просто надо сделать заливку произвольной закрытой фигуры.

использование Win32 API напрямую дотнетовцы не приветствуют


Так хоть сделали бы тогда нормальную дотнетовскую заливку

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #3 Добавлено: 14.03.09 14:07
Нашел в инете как пользоваться ExtFloodFill на vb6, а про vb.net ничего

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #4 Добавлено: 14.03.09 14:12
Еще нашел, что для заливки используется текущий цвет кисти, тока где мне его задать?
function ExtFloodFill(DC: HDC, X, Y: Integer; Color: TColorRef; FillType: Word): Bool;

Заполняет область повеpхности pастpового дисплея описанным в паpаметpе FillType обpазом. Используется текущая кисть.


Ответить

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



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #5
Добавлено: 14.03.09 14:57
текущий цвет кисти.. это надо создать кисть нужного цвета и выделить ее в контексте устройства CreateBrush вроде..

Ответить

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



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #6
Добавлено: 14.03.09 14:57
и SelectObject

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #7 Добавлено: 14.03.09 15:32
выделить ее в контексте устройства

это как?

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #8 Добавлено: 14.03.09 15:32
"устройство" - это объект graphics?

Ответить

Номер ответа: 9
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #9
Добавлено: 14.03.09 16:57
контексте устройства - DC

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 14.03.09 19:25
В функции нет параметра, каким цветом заливать, есть только цвет границ.

кто те такую глупость сказал???

Form1.cs

  1.  
  2. using System;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5.  
  6. namespace WindowsFormsApplication1
  7. {
  8.     public partial class Form1 : Form
  9.     {
  10.  
  11.         public Form1()
  12.         {
  13.             InitializeComponent();
  14.         }
  15.  
  16.         private void button1_Click(object sender, EventArgs e)
  17.         {
  18.             const int size = 200;
  19.             Bitmap bitmap = new Bitmap(size, size);
  20.             using (Graphics graphics = Graphics.FromImage(bitmap))
  21.             {
  22.                 graphics.Clear(Color.White);
  23.                 graphics.DrawEllipse(Pens.Red, 0, 0, size - 1, size - 1);
  24.             }
  25.             bitmap = Win32.Gdi.FloodFill(bitmap, Color.Blue, new Point(100, 100));
  26.  
  27.             /* show result */
  28.             this.BackgroundImage = bitmap;
  29.         }
  30.     }
  31. }



Gdi.cs

  1.  
  2. using System;
  3. using System.Drawing;
  4. using System.Runtime.InteropServices;
  5.  
  6. namespace Win32
  7. {
  8.     public class Gdi
  9.     {
  10.         #region Win32 API
  11.         [DllImport("gdi32.dll")]
  12.         static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
  13.         [DllImport("gdi32.dll")]
  14.         static extern IntPtr CreateSolidBrush(int crColor);
  15.         [DllImport("gdi32.dll", SetLastError = true)]
  16.         static extern IntPtr CreateCompatibleDC(IntPtr hdc);
  17.         [DllImport("gdi32.dll")]
  18.         static extern bool ExtFloodFill(IntPtr hdc, int nXStart, int nYStart, int crColor, uint fuFillType);
  19.         [DllImport("gdi32.dll")]
  20.         static extern bool DeleteObject(IntPtr hObject);
  21.         [DllImport("gdi32.dll")]
  22.         public static extern int GetPixel(IntPtr hdc, int x, int y);
  23.         #endregion
  24.  
  25.         #region constants ...
  26.         static uint FLOODFILLBORDER = 0;
  27.         static uint FLOODFILLSURFACE = 1;
  28.         #endregion
  29.  
  30.         public static Bitmap FloodFill(Bitmap bitmap, Color newColor, Point pt)
  31.         {
  32.             using (Graphics graphics = Graphics.FromImage(bitmap))
  33.             {
  34.                 IntPtr hdc = graphics.GetHdc();
  35.                 IntPtr memDC = Gdi.CreateCompatibleDC(hdc);
  36.                 IntPtr brush = Gdi.CreateSolidBrush(ColorTranslator.ToWin32(newColor));
  37.                 IntPtr oldBr = Gdi.SelectObject(memDC, brush);
  38.                 IntPtr hBitmap = bitmap.GetHbitmap();
  39.                 IntPtr oldhBitmap = Gdi.SelectObject(memDC, hBitmap);
  40.                 ExtFloodFill(memDC, pt.X, pt.Y, GetPixel(memDC, pt.X, pt.Y), FLOODFILLSURFACE);
  41.                 bitmap.Dispose();
  42.                 bitmap = Bitmap.FromHbitmap(hBitmap);
  43.                 SelectObject(memDC, oldBr);
  44.                 SelectObject(memDC, oldhBitmap);
  45.                 DeleteObject(hBitmap);
  46.                 DeleteObject(brush);
  47.                 DeleteObject(memDC);
  48.                 graphics.ReleaseHdc(hdc);
  49.             }
  50.             return bitmap;
  51.         }
  52.     }
  53. }

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #11 Добавлено: 14.03.09 22:33
спасибо, EROS! попробую.

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #12 Добавлено: 14.03.09 22:53
после заливки весь фон покрывается серым и ничего потом нельзя нарисовать

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #13 Добавлено: 14.03.09 22:59
кое-что поправил у себя в проге, теперь рисоваит после заливки можно, но черный фон все равно превращается в серый.

Ответить

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



Вопросов: 4
Ответов: 69
 Профиль | | #14 Добавлено: 14.03.09 23:02
понял, в чем дело. у меня черный фон стоит у контрола, на котором я рисую. а gdi32 возвращает рисунок с серым фоном вместо прозрачного

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #15 Добавлено: 14.03.09 23:09
diplay пишет:
а gdi32 возвращает рисунок с серым фоном вместо прозрачного

Если ты сам не заливал фон, то Gdi ничего тебе сам не закрасит..
Возможно ты отображаешь рисунок в контроле или на форме.. а у них фон сам по себе серый(цвет формы)..
в любом случае это твой косяк..

Ответить

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

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



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