Form
最大化せずに最大化したときのクライアントサイズを取得するにはどうすればよいですか?
Bitmap
たとえば、最大化されたクライアントサイズと同じサイズでを作成したいForm
のですが、どうすればよいですか?
試す
Screen.FromControl(this).GetWorkingArea();
サイズを計算するには(タスクバーなし)、Forms ClientSize/Sizeの差を差し引きます。それがうまくいくことを願っています、それをテストしていません。
アップデート:
少しハッキーですが、試してみましたが、うまくいきました。
var frm = new Form();
frm.Opacity = 100;
frm.WindowState = FormWindowState.Maximized;
frm.Show();
while (!frm.IsHandleCreated)
System.Threading.Thread.Sleep(1);
var result = frm.ClientSize;
frm.Close();
return result;
Update2:
これはより良い解決策です。フォームのペイントを無効にして最大化し、クライアント領域を取得して通常に戻し、結果を返します。ちらつきなどがなく、うまく機能します。
private static Size GetMaximizedClientSize(Form form)
{
var original = form.WindowState;
try
{
BeginUpdate(form);
form.WindowState = FormWindowState.Maximized;
return form.ClientSize;
}
finally
{
form.WindowState = original;
EndUpdate(form);
}
}
[DllImport("User32.dll")]
private extern static int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
private enum Message : int
{
WM_SETREDRAW = 0x000B, // int 11
}
/// <summary>
/// Calls user32.dll SendMessage(handle, WM_SETREDRAW, 0, null) native function to disable painting
/// </summary>
/// <param name="c"></param>
public static void BeginUpdate(Control c)
{
SendMessage(c.Handle, (int)Message.WM_SETREDRAW, new IntPtr(0), IntPtr.Zero);
}
/// <summary>
/// Calls user32.dll SendMessage(handle, WM_SETREDRAW, 1, null) native function to enable painting
/// </summary>
/// <param name="c"></param>
public static void EndUpdate(Control c)
{
SendMessage(c.Handle, (int)Message.WM_SETREDRAW, new IntPtr(1), IntPtr.Zero);
}
次のリンクを試してください、
http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.workingarea%28VS.71%29.aspx