/// <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; }