c#做画板时怎样调用系统的函数去实现填充功能。
首先我们需要引用命名空间:using System.Runtime.InteropServices;
然后我们需要引用系统的扩展方法语句如下:
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr
hgdiobj);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateSolidBrush(int crColor);
[DllImport("gdi32.dll")]
public static extern bool ExtFloodFill(IntPtr hdc, int
nXStart, int nYStart, int crColor, uint fuFillType);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll")]
public static extern int GetPixel(IntPtr hdc, int x, int y);
public static uint FLOODFILLBORDER = 0;
public static uint FLOODFILLSURFACE = 1;
然后我们需要去调用上面的方法去实现填充功能。
IntPtr vDC = graphics.GetHdc();
IntPtr vBrush = CreateSolidBrush
(ColorTranslator.ToWin32(pp.Color));//(ColorTranslator.ToWin32
(Color.Red));
IntPtr vPreviouseBrush = SelectObject(vDC,
vBrush);
ExtFloodFill(vDC, e.X, e.Y, GetPixel(vDC, 5, 5),
FLOODFILLSURFACE);
SelectObject(vDC, vPreviouseBrush);
DeleteObject(vBrush);
graphics.ReleaseHdc(vDC);
我们需要注意的就是ExtFloodFill(vDC, e.X, e.Y, GetPixel(vDC, 5, 5),
FLOODFILLSURFACE)这个方法的使用。这才是我们真正需要的做些改变来实现
我们需要的功能。e.x,e.y获取当前的鼠标的位置,以这个点为圆心向它的四
面八方进行扩展去实现填充。
下面谈谈我们做画板时需要注意的一些事项:
using System.Drawing.Imaging;
//画椭圆
private void drawellipse()
{
button1.Image = new Bitmap(20, 20);
Graphics gra = Graphics.FromImage(button1.Image);
gra.SmoothingMode =
System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
gra.DrawEllipse(Pens.Black, 0, 0, 19, 19);
gra.Dispose();
}
SmoothingMode 平滑模式指定直线、曲线和已填充区域的边缘是否采用平滑处
理(又称锯齿消除功能)。我们在窗口初始化时调用这个方法实现在按钮上面
填充图片。
在初始化时我们初始化当前窗口的背景图片。
this.BackgroundImage = new Bitmap(this.ClientSize.Width,
this.ClientSize.Height);
///画图
private void drawp_w_picpath(Graphics gra)
{
gra.SmoothingMode =
System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
switch (number)
{
case 1:
gra.DrawEllipse(new Pen(pencolor), new
Rectangle(start, new Size(end.X - start.X, end.Y - start.Y)));
break;
case 2:
gra.DrawRectangle(new Pen(pencolor), new
Rectangle(start, new Size(end.X - start.X, end.Y - start.Y)));
break;
case 3:
gra.DrawLine(new Pen(pencolor), start, end);
break;
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
//mark = false;
Graphics gra = Graphics.FromImage(this.BackgroundImage);
drawp_w_picpath(gra);
gra.Dispose();
}
在窗口的mouseup事件时就在按钮上面画椭圆。
转载于:https://blog.51cto.com/zhjjzhjj/381839