BizHawk/BizHawk.Client.EmuHawk/tools/TAStudio/ScreenshotForm.cs

121 lines
2.7 KiB
C#

using System.Drawing;
using System.Windows.Forms;
using BizHawk.Client.Common;
// We pretend it's a tooltip kind of thing, so show only the actual contents
// and avoid stealing forcus, while still being topmost
// http://stackoverflow.com/a/25219399/2792852
// This is not an actual tooltip, because they can't reliably fade in and out with trasparency
namespace BizHawk.Client.EmuHawk
{
public partial class ScreenshotForm : Form
{
private const int WS_EX_TOPMOST = 0x00000008;
private const int Interval = 40;
private const double AlphaStep = 0.125;
private readonly Timer _showTimer = new Timer();
private readonly Timer _hideTimer = new Timer();
private TasBranch _branch;
private int _drawingHeight;
new public Font Font;
new public int Padding;
new public string Text;
public ScreenshotForm()
{
InitializeComponent();
var fontSize = 10;
var fontStyle = FontStyle.Regular;
Font = new Font(FontFamily.GenericMonospace, fontSize, fontStyle);
_drawingHeight = 0;
Padding = 0;
Opacity = 0;
_showTimer.Interval = Interval;
_showTimer.Tick += (sender, e) =>
{
if ((Opacity += AlphaStep) >= 1)
{
_showTimer.Stop();
}
};
_hideTimer.Interval = Interval;
_hideTimer.Tick += (sender, e) =>
{
if ((Opacity -= AlphaStep) <= 0)
{
_hideTimer.Stop();
Hide();
}
};
}
public void UpdateValues(TasBranch branch, Point location , int width, int height, int padding)
{
_branch = branch;
Width = width;
Padding = padding;
_drawingHeight = height;
Text = _branch.UserText;
Location = location;
if (Padding > 0)
{
Padding += 2;
}
Height = _drawingHeight + Padding;
Refresh();
}
protected override void OnPaint(PaintEventArgs e)
{
_branch.OSDFrameBuffer.DiscardAlpha();
var bitmap = _branch.OSDFrameBuffer.ToSysdrawingBitmap();
e.Graphics.DrawImage(bitmap, new Rectangle(0, 0, Width, _drawingHeight));
if (Padding > 0)
{
e.Graphics.DrawRectangle(new Pen(Brushes.Black), new Rectangle(new Point(0, _drawingHeight), new Size(Width - 1, Padding - 1)));
e.Graphics.DrawString(Text, Font, Brushes.Black, new Rectangle(2, _drawingHeight, Width - 2, Height));
}
base.OnPaint(e);
}
public void FadeIn()
{
_showTimer.Stop();
_hideTimer.Stop();
_showTimer.Start();
Show();
}
public void FadeOut()
{
_showTimer.Stop();
_hideTimer.Stop();
_hideTimer.Start();
}
// avoid stealing focus
protected override bool ShowWithoutActivation => true;
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= WS_EX_TOPMOST;
return createParams;
}
}
}
}