如何在WPF中尽可能有效地绘制图形
我正在创建一个依赖图形树的工具.当前的实现是在Java中完成的,我将其移植到C#上的通用代码基础上,因此可以通过各种渲染实现来使用它,也可以使用WPF的功率来用于用户友好的界面./p> 浏览了一天后,我遇到了各种方法来通过WPF绘制矢量图. 我遇到了这样的事情: drackvisual , geometryDrawing , frameworkElement / uielement /shopes 所以,我对最终以完全不同的方式做得相同的所有不同实现感到不知所措. 图形节点库已通过其所有逻辑(包括碰撞检测和与鼠标拖动)已将其移植到C#.正如它是用图形渲染器(例如XNA,Slimdx,Opentk等)制成的,在实现WPF渲染器方面,最好的方法是最好的方法(如所示,它将绘制图形库告诉它画? 基本上,由此产生的WPF控制充当画布,但是它必须非常轻巧,除了为我提供一种绘制圆圈,线条和其他形状的方法外,没有任何整洁的WPF功能:) 编辑: 我基本上想知道:要走
0 2024-04-17
编程技术问答社区
C#: 将一个位图绘制到另一个位图上,并具有透明度
我有两个位图,名为bamebmp和smallBMP.我想将SmallBMP绘制到大型BMP上,然后将结果绘制到屏幕上. SmallBMP的白色像素应该是透明的.这是我正在使用的代码: public Bitmap Superimpose(Bitmap largeBmp, Bitmap smallBmp) { Graphics g = Graphics.FromImage(largeBmp); g.CompositingMode = CompositingMode.SourceCopy; smallBmp.MakeTransparent(); int margin = 5; int x = largeBmp.Width - smallBmp.Width - margin; int y = largeBmp.Height - smallBmp.Height - margin; g.DrawImage(smallBmp, new Po
0 2024-04-17
编程技术问答社区
如何在WPF的窗口上作画(最佳实践)?
我正在尝试编写一个类似互动游戏的应用程序,其中我需要在屏幕上绘制Draw方法,但无法弄清楚如何构建WPF的方法. 如果是Winforms,我可以使用: public void Draw (Graphics g) { } 但是,对于WPF Window,我在XAML中应该有什么(目前只有Grid),此Draw应该将其作为参数收到什么? 首先,我想这样做才能使它正常工作,然后我可以考虑如何使其更WPF等.但是现在我更感兴趣地让它起作用. 解决方案 通常,您以完全不同的方式在WPF中"绘制". 在Windows表单/GDI中,图形API是直接模式图形API.每次刷新/无效窗口时,都可以使用图形明确绘制内容. 在WPF中,事情的工作方式不同.您很少直接绘制 - 而是保留模式图形API.您告诉wpf您想要的对象,它为您照顾图纸. 思考它的最佳方法是,在Windows表单中,您会说"从X1到Y1绘制一条线.然后从X2到Y2绘制一条线.然后...".并
0 2024-04-17
编程技术问答社区
将Graphics.DrawString()输出的文本居中。
我正在使用.netcf(Windows Mobile)Graphics类和DrawString()方法来渲染一个字符到屏幕. 问题是我似乎无法正确地将其居中.不管我设置了字符串渲染位置的y坐标,它总是低于y级,并且文本大小越大,y偏移越大. 例如,在文本尺寸12时,偏移量约为4,但在32时,偏移量约为10. 我希望角色能够垂直占据其被绘制并水平居中的大部分矩形.这是我的基本代码. this正在引用正在绘制的用户控件. Graphics g = this.CreateGraphics(); float padx = ((float)this.Size.Width) * (0.05F); float pady = ((float)this.Size.Height) * (0.05F); float width = ((float)this.Size.Width) - 2 * padx; float height = ((float)this.Size.Height
0 2024-04-17
编程技术问答社区
CreateGraphics和Paint事件的图形对象之间有什么区别?
有人可以解释以pevent.Graphics的Graphics对象与通过调用this.CreateGraphics()> this.CreateGraphics()返回的对象之间的区别. 解决方案 每当提出Paint事件时,就会给您一个Graphics对象.这将通过pevent.Graphics.绘制此Graphics对象是您绘制元素的方式. CreateGraphics基本上不应使用.它可以从窗口句柄上直接创建一个新的Graphics对象.您可以将其返回的Graphics对象提取到Graphics对象中,但是下次提出Paint事件时,您绘制的任何内容都将被淘汰. 您唯一可能要使用CreateGraphics的时间是特殊效果,例如在阻力过程中显示实时反馈.您想要下次重新启动元素时要删除,因此您继续使用CreateGraphics在进行拖放事件时要绘制临时帆布. 您将在Paint事件处理程序方法内部使用从不使用使用CreateGraphics.没有意义 - 您被给
0 2024-04-17
编程技术问答社区
如何用颜色梯度填充椭圆形的圆形扇形?
我想做的是创建这种旋转的锥体视觉效果. 我以前曾使用过DirectX. 我到目前为止尝试过的是: 即使我将厚度更改为50或更多,弧仍未填充. public partial class Form1 : Form { private void pictureBox1_Paint(object sender, PaintEventArgs e) { var g = e.Graphics; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; var center = new Point(pictureBox1.Width / 2, pictureBox1.Height / 2); var innerR = 30; var thickness = 20; var startAngle
0 2024-04-17
编程技术问答社区
Bitmap.Maketransparent函数的不同结果
我的问题是我想使图像背景透明.而且以下功能对我来说很好,但是在另一台机器上测试时,我发现有很多人工制品颜色,透明度并不像我的机器和其他机器上的那样清晰. 我正在使用调试构建,并在发布版本上进行了测试.但是,即使有发布构建,我们也会在不同的机器上看到不同的结果. Image CreateTransparentBackgroundImage(Image image) { using (Bitmap tempBitmap = new Bitmap(image.Width, image.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb)) { var g = Graphics.FromImage(tempBitmap); Rectangle rec = new Rectangle(0 ,0,im
0 2024-04-17
编程技术问答社区
如何在同一面板上绘制多个椭圆
我试图在同一面板中绘制一些椭圆,并通过鼠标单击确定协调器.这是我的代码,此代码只能绘制一个圆圈.较新的圆圈总是在面板上更新较旧的圆圈.所以总会只有一个圆. private void panel1_MouseDown(object sender, MouseEventArgs e) { x = e.X; y = e.Y; panel1.Invalidate(); } Graphics g; private void panel1_Paint(object sender, PaintEventArgs e) { g = panel1.CreateGraphics(); g.FillEllipse(Brushes.Red, x,y, 10, 10); } 解决方案
0 2024-04-17
编程技术问答社区
在C#中做一个SlideButton时的闪烁(DoubleBuffer显然不起作用)。
我在c#winforms proyect中闪烁时遇到了问题. 我只是做了一个slidebutton控件:这是代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; using System.ComponentModel.Design; namespace DELTA.UI.Search { [Designer("System.Windows.Forms.Design.ParentControlDesigner,System.Design",
0 2024-04-17
编程技术问答社区
移除一个位图的黑色背景颜色
我需要在C#VS2013中删除位图的黑色背景颜色. 就像我在画布上提取一些要点一样. 帆布是黑色的,我只需要更改画布透明同时,在没有任何更改的情况下将五颜六色的点保持在上面. 我得到了解决方案: 如何从bitmap 中删除白色背景颜色 Bitmap capcha = new Bitmap(@"C:/image.png"); capcha.MakeTransparent(Color.Black); 但是,背景仍然具有灰色,例如覆盖图像上点的雾. 如何删除它? 更新 我使用了代码: ImageAttribute imageAttribute = new ImageAttribute(); imageAttribute.SetGamma(0.5f, ColorAdjustType.Bitmap); gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0,
0 2024-04-17
编程技术问答社区
在c#中,当在picturebox中绘制trains时出现内存不足的异常
我正在尝试创建一个显示在 picturebox 的在线火车的应用程序 为了实现此目的,我创建了一个worker thread来获得在线火车位置.因此,我可以在此处看到该线程: private Thread workerThread = null; private delegate void UpdateListBoxDelegate(); private UpdateListBoxDelegate UpdateListBox = null; in Form_load我称之为这些: UpdateListBox = new UpdateListBoxDelegate(this.UpdateStatus); // Initialise and start worker thread workerThread = new Thread(new ThreadStart(this.GetOnlineTrain
0 2024-04-17
编程技术问答社区
在OwnerDrawFixed模式下,ListBox项目不显示。
请,我非常感谢任何人都可以帮助我解决以下问题. 我有一个访问数据库,我想将其加载到 listbox 中. 我将ListBox DrawMode设置为 OwnerDrawFixed ,但是当我运行应用程序时,它显示(System.Data.DataRowView)而不是所有数据库记录. 我必须说它在普通绘制模式中正常工作. 这是我的代码: private void Form1_Load(object sender, EventArgs e) { ListBox1.DataSource = GetData(); ListBox1.DisplayMember = "empName"; } DataTable dt; private DataTable GetData() { dt = new DataTable(); using (OleDbConnection myConn
0 2024-04-17
编程技术问答社区
提取彩色梯度像素信息
我正在尝试使用ARTNET来控制240个长的RGB像素(WS2812B),以DMX控制器进行ARTNET,并需要在Pixels线的长度下生成颜色梯度. 我的想法是使用C#内置图形库来生成颜色梯度,然后提取单个像素值并将其发送到DMX控制器. 是否可以从施加到形状的线性牙布或线性牙刷(线/矩形等)中提取单个插值值? ? 解决方案 您可以做的是让刷子在位图上绘制一条线并从中提取像素,但我相信那将是不必要的昂贵且复杂的.更好的是简单地 lerping "> lerping 您想要的颜色. 这可以通过编写类似的LERP方法来实现: float Lerp(float from, float to, float amount) { return from + amount * (to - from); } 并将其用于您要在之间要LERP的颜色的R G和B值.例如: Color Lerp(Color from, Color to, float amo
0 2024-04-17
编程技术问答社区
根据标签尺寸调整标签文本的比例
寻找一种根据Label大小的变化来调整Labels文本大小的方法. (即. 有很多文章会调整文本以完全适合A Label>不适合我想要的. 我已经有一个工作版本. 以某种方式我需要能够参考A Label的先前大小,以确定要调整文本大小的比率. . 解决方案 也许您可以做的就是获得带有内部内容的标签的实际尺寸,然后使用一个因子获得新的大小. 您可以使用; 获得标签的渲染尺寸 System.Drawing.Size TextRenderer.MeasureText (string text, System.Drawing.Font font); 获得标签的渲染尺寸后,您可以重新设置标签.宽度和标签.通过将返回的大小乘以一个因子(ex:size *0.5),将其乘以所需尺寸的一半. 您可以在标签的Sizechanged事件处理程序中使用相同的方法来确定是否测量sillsize; 小于当前标签大小:增加字体尺寸直到达到〜= labelsize 大于当前
0 2024-04-17
编程技术问答社区
.FillRectangle没有绘制任何东西
我很难弄清楚为什么.Fillectangle对我不起作用. 此外,由于没有任何例外,我没有想法,所以我在这里需要一些帮助:/ 受影响的代码的一部分是此 try { using (FileStream fileStream = File.OpenRead(filePath)) { using (StreamReader streamReader = new StreamReader(fileStream, Encoding.UTF8, true, 1024)) { String line; int mW = Convert.ToInt32(Math.Round(this.Size.Width / 2d)); int mH = Convert.ToInt32(Math.Round(this.Size.Height / 2d)); S
0 2024-04-17
编程技术问答社区
如何在C#中刷新图形
我在面板中有一个计时器,当计时器勾选时,它会更改矩形的坐标. 我尝试了两种方法: 1.内部paint方法, 2.计时器调用一个函数来创建图形并绘制移动矩形 第一个不起作用,但是当我切换窗户时,它移动了一次. 第二个解决问题.它在移动,但留下了先前的位置充满颜色,这意味着图形没有刷新. 我只使用g.FillRectangles()来做到这一点. 任何人可以帮我吗? P.S. the panel is using a transparent background. 添加: 这是一个system.windows.form.timer timer = new Timer(); timer.Enabled = false; timer.Interval = 100; /* 100 millisec */ timer.Tick += new EventHandler(TimerCallback); private void TimerCallbac
0 2024-04-17
编程技术问答社区
在C#窗口形式中的好看的图形
我需要使用C#在Windows表单中创建一些简单的图形.简单地说,我的意思是线,圆等.但是,当我绘制例如一个填充的圆圈,边缘不是光滑的(使用方形像素绘制圆圈时预期的是预期的),但是当绘制相同数量的矢量图像中的圆圈时,它看起来很完美.我一直在为这个示例绘制inkscape. 也许矢量软件使用某种渲染功能来平滑颜色,但是在C#中可以使用太多代码,这是否可以在C#中进行?这是代码的示例,它使用Graphics创建一个画布来绘制. private void StatGraphicsPanel_Paint(object sender, PaintEventArgs e) { Graphics canvas = e.Graphics; Brush brush = Brushes.Aqua; canvas.FillEllipse(brush, 0, 0, 10, 10); } 解决方案 此代码可以解决问题: private void StatGraphicsPa
0 2024-04-17
编程技术问答社区
在柱头上画矩形
我正在DataGridView的列标题上绘制矩形,但是在向右滚动时,它像图片(scroll.png)中消失了(scroll.png) 这是我的代码 Rectangle r1; void dataGridView1_Paint(object sender, PaintEventArgs e) { string[] monthes = { "APPLE", "MANGO", "CHERRY", "GRAPES", "PINEAPPLE" }; for (int j = 0; j
0 2024-04-17
编程技术问答社区
Graphics.DrawString在打印文档宽度中的中心位置
我正在尝试将字符串置于printDocument上. 我已经使用图像完成了以下操作,但它似乎与字符串相同. 这是我用来集中图像的代码 e.Graphics.DrawImage(logo, (e.MarginBounds.Width / 2) - (logo.Width / 2), height); 我要居中的文本是从tabcontrol中的一个选项卡中供应的 using (var sf = new StringFormat()) { height = logo.Height + 15; sf.LineAlignment = StringAlignment.Center; sf.Alignment = StringAlignment.Center; e.Graphics.DrawString(tabData.Text, new Font(this.Font.Name, 10), new
0 2024-04-17
编程技术问答社区
我怎样才能强制执行我想要的任何显示分辨率/时间?
我很难找到一种方法来强制我想要的C#程序中的任何显示分辨率/时机.我正在使用GEFORCE 210图形卡运行Windows 7.我当前实现这些自定义分辨率的方法是使用驱动程序GUI手动添加自定义分辨率,然后使用Windows调用来更改这些分辨率,但我需要一种实时添加新的自定义分辨率的方法.我已经研究了NVAPI,但我无法找到这样做的方法.我还研究了图形驱动程序的命令行工具,但我无法使其工作.我的最后一项手段是重写注册表中的值,但我真的很想避免.我愿意使用其他编程语言或第三方工具,只要我可以通过我的程序从命令行调用它.谁能向我指向正确的方向? 预先感谢. 更新(8/16/2011): 我一直在解决NVIDIA问题,他们为我提供了一个高级的NVAPI,这将使我能够重新创建驾驶员的功能.他们还确认,他们提供的NVAPI的基本版本不会执行此操作. 解决方案 我能够使用NDA版本的NVAPI解决此问题.它仍然并不小,但所有工具都在那里. 其他解决方案 您可以尝试使用我不
0 2024-04-17
编程技术问答社区