폼의 좌측 시스템 메뉴를 열었을때 임의로 메뉴를 추가하는 방법이다.
※ 폼 좌측에서 열리는 메뉴를 시스템 메뉴(System menu) 또는 컨트롤 메뉴(Control menu) 라고 한다.
Source
public const Int32 WM_SYSCOMMAND = 0x112;
public const Int32 MF_SEPARATOR = 0x800;
public const Int32 MF_STRING = 0x0;
public const Int32 IDM_ABOUT = 1000;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
IntPtr sysMenuHandle = GetSystemMenu(Handle, false);
AppendMenu(sysMenuHandle, MF_SEPARATOR, 0, string.Empty);
AppendMenu(sysMenuHandle, MF_STRING, IDM_ABOUT, "About...");
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SYSCOMMAND)
{
switch (m.WParam.ToInt32())
{
case IDM_ABOUT:
MessageBox.Show("This is About dialog");
return;
default:
break;
}
}
base.WndProc(ref m);
}
[DllImport("user32.dll")]
private static extern bool AppendMenu(IntPtr hMenu, Int32 wFlags, Int32 wIdNewItem, string lpNewItem);
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
GetSystemMenu, AppendMenu
GetSystemMenu 와 AppendMenu Win32API를 사용한다.
GetSystemMenu
- 응용프로그램에서 시스템 메뉴에 접근하기 위한 함수.
- 첫 번째 인수로 시스템 메뉴를 얻고자 하는 윈도우의 핸들을,
두 번째 인수로 시스템 메뉴를 얻어오는 설정을 지정해 준다.
false 값을 지정하면 시스템 메뉴를 수정할 수 있고, true값을 주면 시스템 메뉴를 기본값으로 설정한다.
- cf) GetSystemMenu function
AppendMenu
- 지정한 메뉴에 새로운 항목을 추가할 때 사용
- 두 번째 인자로 추가할 아이템의 모양과 행동을 플래그값으로 지정한다.
MF_SEPARATOR 는 분할선을, MF_STRING 은 텍스트 항목을 추가한다고 지정했다.
- 세 번째 인자는 추가하려는 항목의 ID
- 네 번째 인자는 추가하려는 항목의 내용이다.
- cf) AppendMenu function
WndProc
- 새로 추가한 메뉴의 메시지를 처리하기 위해 윈도우 프로시저를 재정의 한다.
Sample
참조
Windows Forms FAQ