gpt4 book ai didi

wpf - WinForms - 像绘画一样的 WPF

转载 作者:行者123 更新时间:2023-12-03 14:30:36 25 4
gpt4 key购买 nike

我们非常清楚创建一个 WPF 应用程序是多么容易,用户可以在其中使用鼠标绘制一个矩形。为此,您只需创建一个 Rectangle 控件并设置其坐标,您不必担心 DoubleBuffering、重绘和诸如此类的事情。好吧,我很高兴您将 WPF 用于用户可以绘制不同形状的应用程序,但客户坚持要使用 WinForms 应用程序。所以这里的解决方案是使用 XOR 或 ROP 操作,就像在古老的 WinAPI 年代一样,我不太喜欢这样。在 XOR 模式下,这并没有给我移动文本的好选择。

所以我在想如何才能在 WinForms 应用程序中获得与在 WPF 中一样流畅的绘画体验。将这样的代码放在一起,我想在其中创建一个单独的图层,我将在其中绘制当前形状,同时保持其余对象完好无损。我在 iPad 应用程序中使用了相同的技术并且效果很好。

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace TestPainting
{
public partial class Form1 : Form
{
private bool _isMouseDown;
private Graphics _bufferGraphics;
private Point _startPos;
private TransparentPanel _paintBuffer;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
_isMouseDown = true;
_paintBuffer = new TransparentPanel
{
Size = Size,
};
Controls.Add(_paintBuffer);
_paintBuffer.BringToFront();

_bufferGraphics = Graphics.FromHwnd(_paintBuffer.Handle);
_startPos = e.Location;
Capture = true;
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (!_isMouseDown)
return;

_bufferGraphics.Clear(Color.Transparent);
_bufferGraphics.DrawRectangle(Pens.Green, _startPos.X, _startPos.Y, e.X - _startPos.X, e.Y - _startPos.Y);

}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
_isMouseDown = false;
Capture = false;
_bufferGraphics.Dispose();
Controls.Remove(_paintBuffer);
_paintBuffer.Dispose();
}
}

public class TransparentPanel : Panel
{
public TransparentPanel()
{
DoubleBuffered = true;
}

[Browsable(false)]
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}

protected override void OnPaintBackground(PaintEventArgs e)
{
// Do Nothing
}
}
}

如果类(class)没有按需要工作。按下鼠标时出现黑色面板,而不是透明面板。加上绘制时的矩形闪烁很多,即使我确实设置了 DoubleBuffering 东西。

有人可以提供一些关于此类实现的更好想法,或者可能有其他一些开源项目,我可以在其中了解其他人的工作情况。我需要拥有与 Paint.NET 相同的经验,可惜不再开源了。 (我知道我可以使用 Reflector,我确实做到了,但是伙计,那里有很多代码 :) )

感谢任何想法。

最佳答案

试试这个(参见 FIX #1 和 FIX #2):

    private void Form1_MouseDown( object sender, MouseEventArgs e )
{
_isMouseDown = true;
_paintBuffer = new TransparentPanel
{
Size = Size,
};
Controls.Add( _paintBuffer );
_paintBuffer.BringToFront();

// FIX #1:
//
this.Refresh();

_bufferGraphics = Graphics.FromHwnd( _paintBuffer.Handle );

_startPos = e.Location;
Capture = true;
}

private void Form1_MouseMove( object sender, MouseEventArgs e )
{
if ( !_isMouseDown )
return;

//FIX #2:
// _bufferGraphics.Clear( Color.Transparent );
_bufferGraphics.Clear( this.BackColor );

_bufferGraphics.DrawRectangle( Pens.Green, _startPos.X, _startPos.Y, e.X - _startPos.X, e.Y - _startPos.Y );

}

关于wpf - WinForms - 像绘画一样的 WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10828371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com