Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заливка произвольной области, ... если я заранее не знаю этой области 
:(
    Опции темы
Xonxt
Дата 12.4.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: 1
Всего: 1



Итак, я ранее уже писал, что пишу курсовую - простенький графический редактор.

Вот сейчас я дошел до самого интересного - инструмент заливки.

Так вот, как мне залить одним цветом какую-нибудь произовальную область, если я зарянее не знаю, какая область это будет.

Ведь во всех редакторах, даже в Пейнте, есть заливка, а я очень сомневаюсь, что этот редактор запомниает где-то в каком-то массиве координаты ВСЕХ точек )


Если я не ошибаюсь, то в Паскале была такая функция, которая заливает цветом произвольную замкнутую область. Требовалось только указать координаты одной точки внутри этой области.  Допустим, координаты я буду получать по клику мыши, а вот как быть с самой заливкой?

Я думал, можно написать каку-нибудь рекурсивную функцию, которая попиксельно закрашивала область... но это геморройно.

Может в C# такая функция есть стандратная?
PM MAIL ICQ Skype   Вверх
enginer
Дата 13.4.2007, 15:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.1.2007

Репутация: 1
Всего: 1



Думаю это поможет:

Код

// Copyright   Grigoriy Konovalov
// Partial (C) SLoW
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace FloodFill
{

    // Класс, в котором импортированы некоторые функции GDI

    public class GDI
    {
        public IntPtr CreateSolidBRUSH(uint color)
        {
            return CreateSolidBrush(color);
        }

        public bool ExtFloodFILL(IntPtr hdcSourse, int x, int y, uint сolorRefColor, uint nFillType)
        {
            return ExtFloodFill(hdcSourse, x, y, сolorRefColor, nFillType);
        }

        public IntPtr SelectOBJECT(IntPtr hDCSourse, IntPtr hBitmap)
        {
            return SelectObject(hDCSourse, hBitmap);
        }

        public IntPtr CreateCOMPATIBLEDC(IntPtr hdcSourse)
        {
            return CreateCompatibleDC(hdcSourse);
        }

        public bool DeleteOBJECT(IntPtr hObject)
        {
            return DeleteObject(hObject);
        }


        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern IntPtr CreateSolidBrush(uint crColor);

        [DllImport("gdi32", CharSet = CharSet.Auto)]
        private static extern bool ExtFloodFill(IntPtr hDC, int x, int y, uint сolorRefColor, uint nFillType);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);

        [DllImport("gdi32.dll")]
        private static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern bool DeleteObject(IntPtr hObject);
    }

    public class MapFill
    {
        public MapFill()
        {
        }
        /// <summary>
        /// Заливка области
        /// </summary>
        /// <param name="g">Графикс отображаемого объекта (например, панели)</param>
        /// <param name="pos">Точка, в которой начинается заливка</param>    
        /// <param name="colorFill">Цвет заливки</param>
        /// <param name="img">Битмап, который отображается на нашем объекте</param>
        public void Fill(Graphics g, Point pos, Color colorFill, ref Bitmap img)
        {
            GDI d = new GDI();

            // Цвет в точке, с которой начинается заливка
        

           Color colorBegin = img.GetPixel(pos.X, pos.Y);

            // DC панели
            IntPtr panelDC = g.GetHdc();

            // DC в памяти, совместимый с панелью
            IntPtr memDC = d.CreateCOMPATIBLEDC(panelDC);

            // Создаем и подсовываем свою кисть
            IntPtr hBrush = d.CreateSolidBRUSH((uint)ColorTranslator.ToWin32(colorFill));
            IntPtr hOldBr = d.SelectOBJECT(memDC, hBrush);

            // Подсовываем свой битмап
            IntPtr hBMP = img.GetHbitmap();
            IntPtr hOldBmp = d.SelectOBJECT(memDC, hBMP);

            // Заливаем (заливается благодаря совместимости с панелью, в противном случае 
            // заливки на битмапе не произойдет)
            d.ExtFloodFILL(memDC, pos.X, pos.Y, (uint)ColorTranslator.ToWin32(colorBegin), 1);

            // Записываем полученный залитый битмап в наш битмап
            img.Dispose();
            img = Bitmap.FromHbitmap(hBMP);

            // Возвращаем на место предыдущие кисть и битмап
            d.SelectOBJECT(memDC, hOldBr);
            d.SelectOBJECT(memDC, hOldBmp);

            // Освобождаем использованные ресурсы
            d.DeleteOBJECT(hBMP);
            d.DeleteOBJECT(hBrush);
            d.DeleteOBJECT(memDC);
            g.ReleaseHdc(panelDC);
        }
    }
}

PM MAIL   Вверх
Naum
Дата 13.4.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



enginer, прикольно. Держи +1. Только различие методов класса за счет регистра является далеко не лучшим способом.


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Xonxt
Дата 15.4.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 24.1.2006
Где: Украина / Одесса

Репутация: 1
Всего: 1



Всё, разобрался, большое спасибо. 
жаль не могу дать +1, т.к. недостаточно постов  smile 

Это сообщение отредактировал(а) Xonxt - 15.4.2007, 14:25
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.