폼의 좌측 시스템 메뉴를 열었을때 임의로 메뉴를 추가하는 방법이다.
※ 폼 좌측에서 열리는 메뉴를 시스템 메뉴(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



Posted by six605
,