.NetのFormはFormBorderStyleによりResizeの動作や枠の外観を変更できる。
確かにVisualStudioのデザイン画面上ではFormBorderStyleの変更で外観も追随する。
ところが実行してみるとWindows7上では枠の外観がデザイン画面のそれと一致しない。
少しおかしい…、バグなのか?
確かめてみよう。
以下のコード(DPI仮想化非対応)を用意した。
private void MainForm_Load(object sender, EventArgs e) { labelMessage.Text = "FormBorderStyle = " + this.FormBorderStyle.ToString(); } private void buttonCopy_Click(object sender, EventArgs e) { //Rectangle r = new Rectangle(Left, Top, Width, Height); Rectangle r = Bounds; Bitmap bmp = new Bitmap(r.Width, r.Height, PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(bmp); Point sOrg = new Point(r.Left, r.Top); Point dOrg = new Point(0, 0); g.CopyFromScreen(sOrg, dOrg, new Size(r.Width, r.Height), CopyPixelOperation.SourceCopy); Clipboard.SetImage(bmp); bmp.Dispose(); MessageBox.Show("画面キャプチャをClipboardに転送しました。", "確認", MessageBoxButtons.OK, MessageBoxIcon.Information); }
ボタンを押すと自身のFormをキャプチャする仕組みだ。
キャプチャの範囲はFormのBoundsを使う。
BoundsとはFormのLeft、Top、Width、Heightを保持するプロパティだ。
これできっちりキャプチャが取れるはずだ。
以下は全てのFormBorderStyleでキャプチャした結果である。
画面上にFormBorderStyleを表示している。
FormBorderStyle=SizableToolWindow
FormBorderStyle=FixedToolWindow
None、SizableToolWindow、Sizable以外は微妙に端が切れてキャプチャされている。
FormのBoundsと異なる形状で表示されていることがわかるだろう。
やはりこれはバグなのか?
.Net APIが返却するFormのBoundsと外観の違いは、VisualStudioのデザイン画面との食い違いを見ても明らかである。
とは言え、この現象はWindows10に於いても改善されていない。
何らかの意味のある「仕様」なのか?
わからないのである…。