Example #1
0
        /// <summary>
        /// Заливка области
        /// </summary>
        /// <param name="g">Графикс отображаемого объекта (например, панели)</param>
        /// <param name="pos">Точка, в которой начинается заливка</param>
        /// <param name="colorFill">Цвет заливки</param>
        /// <param name="possibleColors">Список серых цветов, которые можно закрашивать</param>
        private void Fill(Graphics g, Point pos, Color colorFill, IEnumerable <int> possibleColors)
        {
            // Цвет в точке, с которой начинается заливка
            Color colorBegin = _picture.GetPixel(pos.X, pos.Y);

            bool isColorBeginPossible = false;

            foreach (int colorValue in possibleColors)
            {
                if (colorBegin.R == colorBegin.B &&
                    colorBegin.R == colorBegin.G && colorBegin.R == colorValue)
                {
                    isColorBeginPossible = true;
                    break;
                }
            }

            if (!isColorBeginPossible)
            {
                return;
            }

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

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

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

            // Подсовываем свой битмап
            IntPtr hBmp    = _picture.GetHbitmap();
            IntPtr hOldBmp = Win32Engine.SelectObject(memDC, hBmp);

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

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

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

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

            buttonUndo.Visible         = true;
            checkBoxWordExport.Checked = true;
        }