GUIのアプリケーション間でデータの受け渡しをする場合、クリップボードを使いコピー&ペーストする方法があります。
個人的に画像を扱うことが多いのでピクチャボックスへ画像の貼り付けと、同じくピクチャボックスの表示画像をコピーするサンプルプログラムを掲載しています。
クリップボードで受け渡しするデータ形式をPNGにすることでアルファチャンネルが保持されることを期待しています。
プロジェクトの作成
.NET CLI
dotnet.exe new winforms -n <プロジェクト名>
cd <プロジェクト名>
ソースコード
ファイル名:Form1.cs
using System.Diagnostics;
namespace GraphicBoard02;
public partial class Form1 : Form
{
// パネル
Panel Panel1 = new()
{
Dock = DockStyle.Fill, // クライアント領域一杯に広げる
AutoScroll = true, // スクロールバー
};
// ピクチャボックス
PictureBox PictureBox1 = new()
{
SizeMode = PictureBoxSizeMode.AutoSize, // 自動サイズ
};
public Form1()
{
InitializeComponent();
// コントロールの登録
Panel1.Controls.Add(PictureBox1);
this.Controls.Add(Panel1);
// キーボードイベントをフォームで受け取る
this.KeyPreview = true;
// キーダウンイベント
this.KeyDown += (sender, e) => Form1_KeyDown(sender, e);
}
// キーダウンイベント
void Form1_KeyDown(object? sender, KeyEventArgs e)
{
// Ctrl+V
if ((e.Modifiers & Keys.Control) == Keys.Control && e.KeyCode == Keys.V)
{
// クリップボードから画像を取り出し
using var ms = Clipboard.GetData("PNG") as MemoryStream;
if (ms is not null)
{
PictureBox1.Image?.Dispose();
PictureBox1.Image = new Bitmap(ms);
}
}
// Ctrl+C
if ((e.Modifiers & Keys.Control) == Keys.Control && e.KeyCode == Keys.C && PictureBox1.Image is not null)
{
if (PictureBox1.Image is not null)
{
// クリップボードへ画像をコピー
using var ms = new MemoryStream();
PictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
Clipboard.SetData("PNG", ms);
}
}
}
}
コメント