2011년 10월 25일 화요일

[RadioButton] RadioButton 컨트롤이 Focus를 받는다면


 RadioButton 컨트롤 인스턴스의 Focus() 메소드를 호출하면 RadioButton 컨트롤 인스턴스의 Checked 속성이 true가 되는군요. 원래 MFC때부터 그래왔었나 모르겠네요. MSDN을 잘 못 읽었는지 그런 내용은 못찾았는데..




*) .NET Framework 3.5 SP1
*) Visual Studio 2010






2011년 10월 20일 목요일

폼의 시스템 메뉴에 항목을 추가하는 방법




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



2011년 10월 19일 수요일

폼을 활성화 하지 않고 표시


폼을 활성화 하지 않고 표시
음 그러니까 메인폼에서 새로운 폼을 호출 하 되, 포커스는 메인폼에 유지하고 싶을 때를 말한다.


Utility Class

user32.dll 을 임포트하여 Win32API를 이용하는 유틸리티 클래스를 정의한다.
SetVisibleNoActivate 메소드에서 SetWindowPos Win32API를 호출한다. 윈도우 스타일로 SWP_NOACTIVATE 플래그를
지정함으로 구현하는 것 같다.



public static class UtilFuncs

{

        [DllImport("user32.dll")]

        extern public static bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
                                                                 int x, int y, int cx, int cy, int uFlags);



        public const int HWND_TOPMOST = -1;     // 0xffff 

        public const int SWP_NOSIZE = 1;            // 0x0001 

        public const int SWP_NOMOVE = 2;          // 0x0002 

        public const int SWP_NOACTIVATE = 16;   // 0x0010 

        public const int SWP_SHOWWINDOW = 64; // 0x0040 



        public static void ShowWindowTopMost(IntPtr handle)

        {

            SetWindowPos(handle, (IntPtr)HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |
                                                                                                 SWP_NOMOVE |
                                                                                                 SWP_NOACTIVATE |
                                                                                                 SWP_SHOWWINDOW );

        } 

        

        public static void SetVisibleNoActivate(Control control, bool visible )

        {

            if (visible) 

                ShowWindowTopMost(control.Handle);

            

            control.Visible = visible;

        }






폼 비활성화 / 숨기기

위에서 정의한 클래스의 SetVisibleNoActivate 메소드를 호출한다.

폼을 활성화 하지않고 표시
- SetVisibleNoActivate(form, true);

폼을 숨김
- SetVisibleNoActivate(form, false);



private void btnCall_Click(object sender, EventArgs e)

{

            Form2 obj = new Form2();

            //obj.Show();



            //UtilFuncs.SetVisibleNoActivate(obj, false);

            UtilFuncs.SetVisibleNoActivate(obj, true);

 }







Sample :  FormActivateDemo.zip

참조 페이지 : MSDN - Windows Forms FAQ


2011년 10월 17일 월요일

Form.ControlBox 속성을 이용한 Boarder만 있는 폼



Form.ControlBox 속성

폼의 캡션 표시줄에 컨트롤 상자가 표시되는지 여뷰를 나타내는 값을 가져오거나 설정
cf) MSDN - Form.ControlBox

컨트롤 상자가 무엇을 말하는 걸까?


MSDN을 읽어보니 위에 폼에서 왼쪽 상단 부분을 말하는 것 같다. 즉, 마우스로 클릭하였을 때 시스템 메뉴가 나오는 부분!


ControlBox 의 기본값은 true 이며 이 값을 false 로 하면 컨트롤 메뉴가 사라진다.
이 대, 폼 오른쪽에 있는 창 최소화, 최대화, 닫기 버튼들도 같이 사라진다.


폼의 속성에서 ControlBox가 false, Text = string.Empty 값을 넣어주면 폼에 테두리만 나온다. (FormBoarderStyle = Sizable)
this.ControlBox = false;
this.Text = string.Empty;


폼 리사이징이 되므로 이 상태에서 적절하게 폼을 디자인 하는 것도 나쁘지 않을 듯 하다.



this.ControlBox = false;
만 설정한다면 최대화, 최소화, 닫기 버튼이 없는 타이틀바를 만들 수 있다.