[API] ComboBox

simpled 2013.06.23 15:54 조회 수 : 6623

2011.06.06 ComboBox.exe


/*

콤보박스는 에디트 컨트롤과 리스트 박스를 결합해 놓은 컨트롤이다.

그래서 목록에 있는 항목 중의 하나를 선택할 수도 있고 원하는 항목이 없을 경우 에디트에 직접 입력해 넣을 수도 있다.

선택하는 것에 있어서 리스트를 끌어내려야 하기 때문에 리스트보다 실행 속도가 번거롭지만, 공간을 더 효율적으로 사용할 수 있는 장점도 있다.

 

콤보박스의 스타일은 다음과 같다.

CBS_SIMPLE 에디트와 리스트 박스를 가지되 리스트 박스가 항상 펼쳐져 있다.

CBS_DROPDOWN 에디트와 리스트 박스를 가진다.

CBS_DROPDOWNLIST 리스트 박스만 가지며 에디트에 항목을 입력할 수는 없다.

 

선언은 콤보박스 스타일대로 하되, 리스트에 항목을 저장한다든가, 칸에 텍스트를 넣을 수 있는 등은 listbox 및 edit와 같다.

CreateWindow(TEXT("combobox"), NULL, 
   WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
   10, 10, 100, 200, hWnd, (HMENU)COMBO1, hInst, NULL);

*/

 

enum {COMBO1=400};

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

        int wmId, wmEvent;

        PAINTSTRUCT ps;

        HDC hdc;

 

        static TCHAR *ComboBox1[]={TEXT("AA"),TEXT("BB"),TEXT("CC"),TEXT("DD"),TEXT("EE")};

        static TCHAR str[128];

        static INT iList;

       

        switch (message)

        {

        case WM_CREATE:

               CreateWindow(TEXT("combobox"), NULL,

                       WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,

                       10, 10, 100, 200, hWnd, (HMENU)COMBO1, hInst, NULL);

               for(int iPoint=0; iPoint<5; iPoint++)

               {

                       SendMessage(GetDlgItem(hWnd, COMBO1), CB_ADDSTRING, 0, (LPARAM)ComboBox1[iPoint]);

               }

               break;

        case WM_COMMAND:

               wmId    = LOWORD(wParam);

               wmEvent = HIWORD(wParam);

               // 메뉴의선택영역을구문분석합니다.

               switch (wmId)

               {

               case COMBO1:

                       switch(wmEvent)

                       {

                              case CBN_SELCHANGE:

                                      iList=SendMessage(GetDlgItem(hWnd, COMBO1), CB_GETCURSEL, 0, 0);

                                      SendMessage(GetDlgItem(hWnd, COMBO1), CB_GETLBTEXT, iList, (LPARAM)str);

                                      MessageBox(hWnd, str, TEXT("@_@"), NULL);

                                      break;

                              case CBN_EDITCHANGE:

                                      GetWindowText(GetDlgItem(hWnd, COMBO1), str, 128);

                                      SetWindowText(hWnd, str);

                                      break;

                       }

                       break;

               case IDM_ABOUT:

                       DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

                       break;

               case IDM_EXIT:

                       DestroyWindow(hWnd);

                       break;

               default:

                       return DefWindowProc(hWnd, message, wParam, lParam);

               }

               break;

        case WM_PAINT:

               hdc = BeginPaint(hWnd, &ps);

               // TODO: 여기에그리기코드를추가합니다.

               EndPaint(hWnd, &ps);

               break;

        case WM_DESTROY:

               PostQuitMessage(0);

               break;

        default:

               return DefWindowProc(hWnd, message, wParam, lParam);

        }

        return 0;

}