Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: vb.net 2008, ExtFloodFill больше не работает Добавлено: 31.05.09 13:20  

Автор вопроса:  neunmiy
Здравствуйте. Пытаюсь написать программу, в которой нужна заливка произвольной фигуры. Беру многократно советуемую в разных местах ExtFloodFill, но синтаксис vb.net 2008 изменился - в частности подчеркивается и не узнается hdc (PictureBox1.hdc), как результат - ExtFloodFill не работает.
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
    Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Const FLOODFILLBORDER = 0
    Const FLOODFILLSURFACE = 1
    Dim FloodMethod As Long


    Private b As Boolean = False
    Private m_Drawing As Boolean = False
    Private m_LastPoint As Point = Nothing

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


    End Sub

    Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        m_Drawing = True
        m_LastPoint = New Point(e.X, e.Y)
        Dim gr As Graphics = Graphics.FromImage(PictureBox1.Image)
        If b = True Then
            ExtFloodFill([B]PictureBox1.hdc (здесь подчеркивается, что здесь писать - не знаю[/B], e.X, e.Y, RGB(0, 0, 0), FLOODFILLBORDER)
        End If
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        PictureBox1.Cursor = Cursors.Arrow
        If Not m_Drawing Then Exit Sub

        Dim gr As Graphics = Graphics.FromImage(PictureBox1.Image)
        gr.DrawLine(New Pen(Color.Black, 1), m_LastPoint, New Point(e.X, e.Y))
        m_LastPoint = New Point(e.X, e.Y)
        PictureBox1.Refresh()

    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        m_Drawing = False
        Dim gr As Graphics = Graphics.FromImage(PictureBox1.Image)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Bitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        PictureBox1.Image = Bitmap
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        b = True
        
    End Sub

То есть функции, которые работали в прежних версиях, теперь не работают. Информации никакой как правильно залить произвольную фигуру в vb.net 2008 найти не могу уже которую неделю :). Помогите, пожалуйста

Ответить

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

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 31.05.09 17:03
на переводи
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Collections;
  5. using System.Drawing;
  6. using System.Drawing.Imaging;
  7. using System.Runtime.InteropServices;
  8. using System.Drawing.Drawing2D;
  9. using System.Windows.Forms;
  10.  
  11. namespace FloodFill
  12. {
  13.  
  14.     // Класс, в котором импортированы некоторые функции GDI
  15.  
  16.     public class GDI
  17.     {
  18.         public IntPtr CreateSolidBRUSH(uint color)
  19.         {
  20.             return CreateSolidBrush(color);
  21.         }
  22.  
  23.         public bool ExtFloodFILL(IntPtr hdcSourse, int x, int y, uint сolorRefColor, uint nFillType)
  24.         {
  25.             return ExtFloodFill(hdcSourse, x, y, сolorRefColor, nFillType);
  26.         }
  27.  
  28.         public IntPtr SelectOBJECT(IntPtr hDCSourse, IntPtr hBitmap)
  29.         {
  30.             return SelectObject(hDCSourse, hBitmap);
  31.         }
  32.  
  33.         public IntPtr CreateCOMPATIBLEDC(IntPtr hdcSourse)
  34.         {
  35.             return CreateCompatibleDC(hdcSourse);
  36.         }
  37.  
  38.         public bool DeleteOBJECT(IntPtr hObject)
  39.         {
  40.             return DeleteObject(hObject);
  41.         }
  42.  
  43.  
  44.         [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  45.         private static extern IntPtr CreateSolidBrush(uint crColor);
  46.  
  47.         [DllImport("gdi32", CharSet = CharSet.Auto)]
  48.         private static extern bool ExtFloodFill(IntPtr hDC, int x, int y, uint сolorRefColor, uint nFillType);
  49.  
  50.         [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  51.         private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
  52.  
  53.         [DllImport("gdi32.dll")]
  54.         private static extern IntPtr CreateCompatibleDC(IntPtr hdc);
  55.  
  56.         [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
  57.         private static extern bool DeleteObject(IntPtr hObject);
  58.     }
  59.  
  60.     public class MapFill
  61.     {
  62.         public MapFill()
  63.         {
  64.         }
  65.         /// <summary>
  66.         /// Заливка области
  67.         /// </summary>
  68.         /// <param name="g">Графикс отображаемого объекта (например, панели)</param>
  69.         /// <param name="pos">Точка, в которой начинается заливка</param>    
  70.         /// <param name="colorFill">Цвет заливки</param>
  71.         /// <param name="img">Битмап, который отображается на нашем объекте</param>
  72.         public void Fill(Graphics g, Point pos, Color colorFill, ref Bitmap img)
  73.         {
  74.             GDI d = new GDI();
  75.  
  76.             // Цвет в точке, с которой начинается заливка
  77.         
  78.  
  79.            Color colorBegin = img.GetPixel(pos.X, pos.Y);
  80.  
  81.             // DC панели
  82.             IntPtr panelDC = g.GetHdc();
  83.  
  84.             // DC в памяти, совместимый с панелью
  85.             IntPtr memDC = d.CreateCOMPATIBLEDC(panelDC);
  86.  
  87.             // Создаем и подсовываем свою кисть
  88.             IntPtr hBrush = d.CreateSolidBRUSH((uint)ColorTranslator.ToWin32(colorFill));
  89.             IntPtr hOldBr = d.SelectOBJECT(memDC, hBrush);
  90.  
  91.             // Подсовываем свой битмап
  92.             IntPtr hBMP = img.GetHbitmap();
  93.             IntPtr hOldBmp = d.SelectOBJECT(memDC, hBMP);
  94.  
  95.             // Заливаем (заливается благодаря совместимости с панелью, в противном случае
  96.             // заливки на битмапе не произойдет)
  97.             d.ExtFloodFILL(memDC, pos.X, pos.Y, (uint)ColorTranslator.ToWin32(colorBegin), 1);
  98.  
  99.             // Записываем полученный залитый битмап в наш битмап
  100.             img.Dispose();
  101.             img = Bitmap.FromHbitmap(hBMP);
  102.  
  103.             // Возвращаем на место предыдущие кисть и битмап
  104.             d.SelectOBJECT(memDC, hOldBr);
  105.             d.SelectOBJECT(memDC, hOldBmp);
  106.  
  107.             // Освобождаем использованные ресурсы
  108.             d.DeleteOBJECT(hBMP);
  109.             d.DeleteOBJECT(hBrush);
  110.             d.DeleteOBJECT(memDC);
  111.             g.ReleaseHdc(panelDC);
  112.         }
  113.     }
  114. }

Ответить

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



Вопросов: 1
Ответов: 43
 Профиль | | #2 Добавлено: 31.05.09 21:26
MSDN проект на VB - пример для текстурного заполнения кистью - там кисть нужно выбрать в инструменте.

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vbcode/local/sampleexecutables/GDIPens.zip

Ответить

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



Вопросов: 1
Ответов: 2
 Профиль | | #3 Добавлено: 01.06.09 00:44
спасибо. Я даже натыкалась на что-то подобное (в частности с GetHdc()), вообщем походй мне легче начать писать эту задачу на С#, чем переводить :(

Ответить

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



Вопросов: 1
Ответов: 2
 Профиль | | #4 Добавлено: 01.06.09 00:47
MSDN проект на VB - пример для текстурного заполнения кистью - там кисть нужно выбрать в инструменте.

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vbcode/local/sampleexecutables/GDIPens.zip


А как этим пользоваться? Я нашл "it is a link from the 05 msdn library...if you do not have the help library you should be able to go online to msdn and serch for the sample app", иду в http://msdn.microsoft.com/, ввожу туда ту строчку - ничего не может найти. Что делать?

Ответить

Номер ответа: 5
Автор ответа:
 _Serega



Вопросов: 1
Ответов: 43
 Профиль | | #5 Добавлено: 01.06.09 19:31
В браузере MSDN в URL попробуй ввести строчку - должна скачка проекта с примером запустится.

Ответить

Страница: 1 |

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



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