Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15
1

GDI+ и заливка с помощью методов библиотеки GDI32.dll

19.01.2012, 14:01. Показов 2313. Ответов 4
Метки нет (Все метки)

Делаю аналог Paint, возникла проблема: необходимо залить область цветом или штрихованной кистью. Заливаю при помощи методов из gdi32.dll,
все ок, а затем, при перерисовке, все залитое пропадает, собсно я так думаю, что нужно делать битмап залитой области, а затем помещать его в Graphics при перерисовке формы. При попытке сохранить битмап из панели, сохраняетс только контуры фигуры, а заливка - нет.
Прошу помощи: как можно получить битмап области, которая залита с помощью FillSurface? Заранее спасибо!
Вот кусок кода:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// В случае, еси была нажата кнопка заливки, заливаем область и выход из функции
02.if*(this.IsFilledClicked)
03.{
04.           Graphics g = Graphics.FromHwnd(this.PaintPanel.Handle);
05.           IntPtr hdc = g.GetHdc();
06.         // Получаем индекс текущей кисти
07.          HatchNum =*this.Bcp.brushNum;
08.            // Заливка штриховой кистью
09.           if*(HatchNum < 6)
10.          {
11.               int*num =*this.MainColor.ToArgb();
12.               num=-num;
13.               IntPtr hBrush = CreateHatchBrush(HatchNum,num);
14.               SelectObject(hdc, hBrush);
15.               FillSurface(hdc, e.X, e.Y, GetPixel(hdc, e.X, e.Y), 1);
16.               g.ReleaseHdc(hdc);
17.              DeleteObject(hBrush);
18.          }
19.          // СОхраняет все, кроме заливки
20.         this.PaintPanel.DrawToBitmap(bmp,*new*Rectangle(0, 0, bmp.Width, bmp.Height));
21.         bmp.Save(@"NewBmp1.bmp");
22.         g.Dispose();
23.         return;
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2012, 14:01
Ответы с готовыми решениями:

Получение данных о шрифте с помощью gdi32.dll
Задача состоит в том, чтобы определить, какие символы не прорисовываются при использовании данного...

Алгоритм замещения страниц LRU с помощью методов библиотеки STL
Здравствуйте! Мне нужно реализовать алгоритм замещения страниц LRU с помощью методов библиотеки...

Где найти описание команд, свойств, методов библиотеки vtools.dll
Вот встретил в программе ЗагрузитьВнешнююКомпоненту(&quot;VTools.dll&quot;);...

Получить названия всех функций, классов, методов и т.д. с параметрами из библиотеки .dll
Здравствуйте. Появилась задача, уже написанная в заголовке. Пытался гуглить, нашел только что-то на...

4
Почетный модератор
Эксперт .NET
8699 / 3651 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.01.2012, 14:31 2
Charlie, зачем такое извращение с gdi32 напрямую? когда Graphics это и так обертка над gdi32, в нём уже есть то что Вы хотите:
C#
1
2
3
using ( var brush = new HatchBrush( HatchStyle.DottedGrid, Color.Red, Color.Black ) )
    // e - экземпляр Graphics
    e.FillRectangle( brush, rect );
Цитата Сообщение от Charlie Посмотреть сообщение
при перерисовке, все залитое пропадает
Потому что рисовать надо в событии Paint нужного компонента.

Пример: Заливка всей клиентской области формы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
 
namespace WindowsFormsApplication34
{
    public partial class frmMain : Form
    {
        public frmMain ( )
        {
            InitializeComponent();
            this.Paint += new PaintEventHandler( frmMain_Paint );
        }
 
        void frmMain_Paint ( object sender, PaintEventArgs e )
        {
            using ( var brush = new HatchBrush( HatchStyle.DottedGrid, Color.Red, Color.Black ) )
                e.Graphics.FillRectangle( brush, this.ClientRectangle );
        }
    }
}
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15
19.01.2012, 15:03  [ТС] 3
Нет, тут мне нужна именно заливка области, например я нарисовал квадрат, щелкунул заливкой, и заливается область, которая в квадрате...
Заливка, пока не будет встречен пиксел другого цвета
Все другие инструменты (карандаш, решинка, кисть, круги, квадраты и т.д., реализованы и перерисовываются в Paint, а вот с этой заливкой, млин, никак((((( Хотябы битмап ее получить((((
0
Почетный модератор
Эксперт .NET
8699 / 3651 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.01.2012, 16:38 4
Посмотрите пример во вложении, там реализовано заполнение выбранной области.
1
Вложения
Тип файла: rar FloodFill.rar (17.6 Кб, 90 просмотров)
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 15
19.01.2012, 17:06  [ТС] 5
Спасибо большое за пример!)
Самая проблема для меня теперь - как реализовать перерисовку уже залитой таким образом области? А то при перерисовке все стирается, а при попытке сохранить битмап - сохраняется белый фон
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2012, 17:06

Подключение библиотеки gdi32 на visual studio
Помогите, пожалуйста, подключить библиотеку gdi32 на visual studio 2015. Все перепробовала и...

"Can't find DLL entry point createPolygonRgn in gdi32.dll"
Рисую семи-сегментный индикатор... Нарисовал 1 сегмент Line-ом, потом осознал, что мне потом...

Синий экран, gdi32.dll поврежден!
При включении выдаёт синий экран с ошибкой: STOP: c0000221 {Bad Image Checksum} The image...

Заливка сектора GDI+
Доброго времени, коллеги! Что-то запутался совсем. Не получается сделать заливку области GDI+....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.