サイズ変更可能なウィンドウ枠の幅と高さを取得するコードを紹介します。
概要
フォームのWidthやHeightプロパティに値を入力した場合、フォームの枠の幅を含めたサイズがWidthやHeightプロパティに入力したサイズとなります。(下図参照)
Width=200 Height=200 とした場合のフォームのサイズ
そのため、内部のサイズを指定したサイズにする場合は、ウィンドウの枠の幅を取得する必要があります。
対処法
今回はサイズ変更可能なウィンドウフォームの枠の幅を取得します。
ウィンドウ枠の幅を取得するには、Windows APIのGetSystemMetrics関数を用います。引数に、SM_CXSIZEFRAMEを与えるとサイズ変更可能なウィンドウ枠の幅(左右:垂直枠の幅)を取得でき、SM_CYSIZEFRAMEを与えるとサイズ変更可能なウィンドウ枠の幅(上下:水平枠くの高さ)を取得できます。
実装例
コード
namespace App
{
public partial class FormMain : Form
{
[DllImport("user32.dll")]
static extern int GetSystemMetrics(SystemMetric smIndex);
public enum SystemMetric : int
{
SM_CXSCREEN = 0,
SM_CYSCREEN = 1,
SM_CYVSCROLL = 2,
SM_CXVSCROLL = 3,
SM_CYCAPTION = 4,
SM_CXBORDER = 5,
SM_CYBORDER = 6,
SM_CXDLGFRAME = 7,
SM_CYDLGFRAME = 8,
SM_CYVTHUMB = 9,
SM_CXHTHUMB = 10,
SM_CXICON = 11,
SM_CYICON = 12,
SM_CXCURSOR = 13,
SM_CYCURSOR = 14,
SM_CYMENU = 15,
SM_CXFULLSCREEN = 16,
SM_CYFULLSCREEN = 17,
SM_CYKANJIWINDOW = 18,
SM_MOUSEWHEELPRESENT = 75,
SM_CYHSCROLL = 20,
SM_CXHSCROLL = 21,
SM_DEBUG = 22,
SM_SWAPBUTTON = 23,
SM_RESERVED1 = 24,
SM_RESERVED2 = 25,
SM_RESERVED3 = 26,
SM_RESERVED4 = 27,
SM_CXMIN = 28,
SM_CYMIN = 29,
SM_CXSIZE = 30,
SM_CYSIZE = 31,
SM_CXFRAME = 32,
SM_CYFRAME = 33,
SM_CXMINTRACK = 34,
SM_CYMINTRACK = 35,
SM_CXDOUBLECLK = 36,
SM_CYDOUBLECLK = 37,
SM_CXICONSPACING = 38,
SM_CYICONSPACING = 39,
SM_MENUDROPALIGNMENT = 40,
SM_PENWINDOWS = 41,
SM_DBCSENABLED = 42,
SM_CMOUSEBUTTONS = 43,
SM_CXFIXEDFRAME = SM_CXDLGFRAME,
SM_CYFIXEDFRAME = SM_CYDLGFRAME,
SM_CXSIZEFRAME = SM_CXFRAME,
SM_CYSIZEFRAME = SM_CYFRAME,
SM_SECURE = 44,
SM_CXEDGE = 45,
SM_CYEDGE = 46,
SM_CXMINSPACING = 47,
SM_CYMINSPACING = 48,
SM_CXSMICON = 49,
SM_CYSMICON = 50,
SM_CYSMCAPTION = 51,
SM_CXSMSIZE = 52,
SM_CYSMSIZE = 53,
SM_CXMENUSIZE = 54,
SM_CYMENUSIZE = 55,
SM_ARRANGE = 56,
SM_CXMINIMIZED = 57,
SM_CYMINIMIZED = 58,
SM_CXMAXTRACK = 59,
SM_CYMAXTRACK = 60,
SM_CXMAXIMIZED = 61,
SM_CYMAXIMIZED = 62,
SM_NETWORK = 63,
SM_CLEANBOOT = 67,
SM_CXDRAG = 68,
SM_CYDRAG = 69,
SM_SHOWSOUNDS = 70,
SM_CXMENUCHECK = 71,
SM_CYMENUCHECK = 72,
SM_SLOWMACHINE = 73,
SM_MIDEASTENABLED = 74,
SM_MOUSEPRESENT = 19,
SM_XVIRTUALSCREEN = 76,
SM_YVIRTUALSCREEN = 77,
SM_CXVIRTUALSCREEN = 78,
SM_CYVIRTUALSCREEN = 79,
SM_CMONITORS = 80,
SM_SAMEDISPLAYFORMAT = 81,
SM_IMMENABLED = 82,
SM_CXFOCUSBORDER = 83,
SM_CYFOCUSBORDER = 84,
SM_TABLETPC = 86,
SM_MEDIACENTER = 87,
SM_CMETRICS_OTHER = 76,
SM_CMETRICS_2000 = 83,
SM_CMETRICS_NT = 88,
SM_REMOTESESSION = 0x1000,
SM_SHUTTINGDOWN = 0x2000,
SM_REMOTECONTROL = 0x2001,
}
const int Inner_Width=200;
const int Inner_Height=180;
private void Form1_Load(object sender, EventArgs e)
{
int cxb = GetSystemMetrics(SystemMetric.SM_CXSIZEFRAME);
int cyb = GetSystemMetrics(SystemMetric.SM_CYSIZEFRAME);
this.Width = Inner_Width + cxb*2;
this.Height = Inner_Height + cyb * 2;
}
}
}
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2010-07-22