FormBorderStyleの外観

.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=None
fbs-none

FormBorderStyle=SizableToolWindow
fbs-sizabletoolwindow

FormBorderStyle=FixedToolWindow
fbs-fixedtoolwindow

FormBorderStyle=Sizable
fbs-sizable

FormBorderStyle=FixedDialog
fbs-fixeddialog

FormBorderStyle=Fixed3D
fbs-fixed3d

FormBorderStyle=FixedSingle
fbs-fixedsingle

None、SizableToolWindow、Sizable以外は微妙に端が切れてキャプチャされている。
FormのBoundsと異なる形状で表示されていることがわかるだろう。

やはりこれはバグなのか?
.Net APIが返却するFormのBoundsと外観の違いは、VisualStudioのデザイン画面との食い違いを見ても明らかである。
とは言え、この現象はWindows10に於いても改善されていない。
何らかの意味のある「仕様」なのか?

わからないのである…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です