我起初用getpixles和setpixles的方法实现,但是处理太太太慢了。
后来用floodfill,可是函数返回值为1,说明运行成功,但是不知道为什么图像没有反应。
求高手给段实现代码。。我实在没办法了--!!
分不够再加.
后来用floodfill,可是函数返回值为1,说明运行成功,但是不知道为什么图像没有反应。
求高手给段实现代码。。我实在没办法了--!!
分不够再加.
解决方案 »
- 在事务中向数据库提交更新,为什么报错
- (C# 对WORD图片的操作)如何将图片的字节流添加到WORD中
- winform如何判断窗体上的值是否被修改过
- 急!!** c# 调用 DLL 的问题***
- 100分 .net framework精简版的 resx 资源文件生成问题 忘高人指教
- 混淆器如何使用?
- 关于使用datagrid 向数据库中插入记录的问题
- c#加入进度条速度变慢
- 使用Socket模拟Http请求,如何提升性能?
- 哪位大哥帮小弟一把吧?明天就要交了,我还不知道应该怎么做呢?
- 請問錯誤當前上下文中不存在名稱“ScriptManager”如何解決?
- 求Lucene.Net.Analysis.Cn的源码?
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
Graphics g = this.CreateGraphics();
FloodFill(g.GetHdc(), e.X,e.Y, 0x000000FF);
g.ReleaseHdc();
g.Dispose();
}
注意设置current brush
GDI+有几种不同类型的画笔,本章不准备详细介绍它们,这里仅解释几个比较简单的画笔,让您掌握其要领即可。每种画笔都由一个派生自System.Drawing.Brush的类的实例来表示。最简单的画笔System.Drawing.SolidBrush仅指定了区域用纯色来填充:Brush solidBeigeBrush = new SolidBrush(Color.Beige);Brush solidFunnyOrangyBrownBrush = new SolidBrush(Color.FromArgb(255,155,100));另外,如果画笔是一种Web安全颜色,就可以用另外一个类System.Drawing.Brushes构造出画笔。Brushes是永远不能实例化的一个类(它有一个私有构造函数,禁止实例化)。它有许多静态属性,每个属性都返回指定颜色的画笔。您可以象下面一样使用画笔:Brush solidAzureBrush = Brushes.Azure;Brush solidChocolateBrush = Brushes.Chocolate;比较复杂的一种画笔是影线画笔(hatch brush),它通过绘制一种模式填充区域,这种类型的画笔比较高级,所以在Drawing2D命名空间中,用System.Drawing.Drawing2D.HatchBrush类表示。Brushes类不能帮助我们使用影线画笔,而需通过提供一个影线型式和两种颜色(前景色和背景色,背景色可以忽略,此时将使用默认的黑色),来显式构造一个影线画笔。影线型式可以取自于枚举System.Drawing.Drawing2D.HatchStyle,其中有许多HatchStyle值,其完整列表参阅MSDN文档说明。为了让用户掌握这个概念,一般的型式包括ForwardDiagonal、Cross、DiagonalCross、SmallConfetti和ZigZag。构造影线画笔的示例如下所示。Brush crossBrush = new HatchBrush(HatchStyle.Cross, Color.Azure); // background color of CrossBrush is black Brush brickBrush = new HatchBrush(HatchStyle.DiagonalBrick, Color.DarkGoldenrod, Color.Cyan);GDI只能使用实线和影线画笔,GDI+添加了两种新画笔:● System.Drawing.Drawing2D.LinearGradientBrush用一种在屏幕上可变的颜色填充区域。● System.Drawing.Drawing2D.PathGradientBrush与此类似,但其颜色沿着要填充的区域的路径而变化。如果细心使用,这些画笔会得到一些惊人的效果。
{
Graphics vGraphics = Graphics.FromHwnd(Handle);
vGraphics.DrawRectangle(Pens.Blue, new Rectangle(0, 0, 300, 300));
vGraphics.DrawRectangle(Pens.Blue, new Rectangle(50, 70, 300, 300));
FloodFillHelper.FloodFill(vGraphics, new Point(10, 10),
FloodFillHelper.GetPixel(vGraphics, 10, 10), Color.Red);
}public class FloodFillHelper
{
[DllImport("Gdi32.dll")]
private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
[DllImport("Gdi32.dll")]
private static extern IntPtr CreateSolidBrush(int crColor);
[DllImport("gdi32", CharSet = CharSet.Auto)]
private static extern bool ExtFloodFill(IntPtr hDC, int x, int y, int сolorRefColor, FillType fillType);
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool DeleteObject(IntPtr hObject);
[DllImport("GDI32", CharSet = CharSet.Auto)]
private static extern int GetPixel(IntPtr hdc, int x, int y);
private enum FillType
{
FLOODFILLBORDER = 0,
FLOODFILLSURFACE = 1
}
public static void FloodFill(Graphics g, Point p, Color src, Color trg)
{
FloodFill(g, p.X, p.Y, src, trg);
}
public static void FloodFill(Graphics g, int x, int y, Color src, Color trg)
{
IntPtr hdc = g.GetHdc();
IntPtr hBrush = CreateSolidBrush(ColorTranslator.ToWin32(trg));
IntPtr hPreviouseBrush = SelectObject(hdc, hBrush);
System.Diagnostics.Trace.WriteLine(ExtFloodFill(hdc, x, y, ColorTranslator.ToWin32(src), FillType.FLOODFILLSURFACE));
SelectObject(hdc, hPreviouseBrush);
DeleteObject(hBrush);
g.ReleaseHdc(hdc);
}
public static Color GetPixel(Graphics g, int x, int y)
{
IntPtr hdc = g.GetHdc();
int cr = GetPixel(hdc, x, y);
g.ReleaseHdc(hdc);
return ColorTranslator.FromWin32(cr);
}
public static Color GetPixel(Image img, int x, int y)
{
using (Graphics g = Graphics.FromImage(img))
{
IntPtr hdc = g.GetHdc();
int cr = GetPixel(hdc, x, y);
g.ReleaseHdc(hdc);
return ColorTranslator.FromWin32(cr);
}
}
}
我想你不仅是在解决我这个问题,你把我上次问的问题也一并解决了。真的很感谢
WebForm中只显示两个兰框,没有填充效果。