BizHawk/BizHawk.Util/ViewportPanel.cs

115 lines
3.1 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
namespace BizHawk.Core
{
/// <summary>
/// A programmatic PictureBox, really, which will paint itself using the last bitmap that was provided
/// </summary>
public class RetainedViewportPanel : Control
{
public RetainedViewportPanel()
{
CreateHandle();
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.UserMouse, true);
}
//Size logicalSize;
////int pitch;
//public void SetLogicalSize(int w, int h)
//{
// if (bmp != null) bmp.Dispose();
// bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb);
// logicalSize = new Size(w, h);
//}
/// <summary>
/// Takes ownership of the provided bitmap and will use it for future painting
/// </summary>
public void SetBitmap(Bitmap newbmp)
{
if (bmp != null) bmp.Dispose();
bmp = newbmp;
Refresh();
}
Bitmap bmp;
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if(bmp != null)
e.Graphics.DrawImage(bmp, 0, 0, Width, Height);
}
}
/// <summary>
/// A dumb panel which functions as a placeholder for framebuffer painting
/// </summary>
public class ViewportPanel : Control
{
public ViewportPanel()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.UserMouse, true);
}
}
/// <summary>
/// A ViewportPanel with a vertical scroll bar
/// </summary>
public class ScrollableViewportPanel : UserControl
{
TableLayoutPanel table;
ViewportPanel view;
VScrollBar scroll;
public ViewportPanel View { get { return view; } }
public VScrollBar Scrollbar { get { return scroll; } }
public int ScrollMax { get { return Scrollbar.Maximum; } set { Scrollbar.Maximum = value; } }
public int ScrollLargeChange { get { return Scrollbar.LargeChange; } set { Scrollbar.LargeChange = value; } }
public ScrollableViewportPanel()
{
InitializeComponent();
}
public void InitializeComponent()
{
table = new TableLayoutPanel();
view = new ViewportPanel();
scroll = new VScrollBar();
scroll.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom;
view.Dock = DockStyle.Fill;
table.Dock = DockStyle.Fill;
table.RowStyles.Add(new RowStyle(SizeType.Percent, 100));
table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100));
table.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, 0));
table.RowCount = 1;
table.ColumnCount = 2;
table.Controls.Add(view);
table.Controls.Add(scroll);
table.SetColumn(view, 0);
table.SetColumn(scroll, 1);
scroll.Scroll += (sender, e) => OnScroll(e);
view.Paint += (sender, e) => OnPaint(e);
Controls.Add(table);
}
}
}