[API] ListBox

simpled 2013.06.23 15:54 조회 수 : 7150

2011.06.06 ListBox(2).exe


/*

리스트 박스는 선택 가능한 여러개의 항목들을 나열해 놓고 그 중 하나(또는 여러 개)를 선택하는 컨트롤이며 여기서 항목이란 주로 문자열이다.

리스트도 물론 일종의 윈도우이며 "listbox"라는 윈도우 클래스로 생성한다.

 

차일드 컨트롤로 생성하는 것이 보통이므로 WS_CHILD | WS_VISIBLE 스타일은 기본적으로 지정해야 하며

이 외에 다음과 같은 여러가지 고유의 스타일을 지정할 수 있다.

LBS_MULTIPLESEL 여러개의 항목을 선택할 수 있다. 이 스타일을 적용하지 않으면 디폴트로 하나만 선택할 수 있다.

LBS_NOTIFY 사용자가 목록 중 하나를 선택했을 때 부모 윈도우로 통지 메시지를 보낸다.

LBS_SORT 추가된 항목들을 자동 정렬한다.

LBS_OWNERDRAW 문자열이 아닌 비트맵이나 그림을 넣을 수 있다.

LBS_STANDARD   LBS_NOTIFY | LBS_SORT | WS_BORDER를 한번에 선택

 

리스트박스가 부모윈도우에 보내는 통지메시지는 여러가지 중 다음과 같은 중요한 것들이 있다.

LB_ADDSTRING 리스트박스에 항목을 추가한다. lParam으로 추가하고자 하는 문자열의 번지를 넘겨준다.

LB_DELETESTRING 항목을 삭제한다. wParam으로 항목의 번호를 넘겨주며 남은 항목 수를 리턴한다.

LB_GETCURSEL 현재 선택된 항목의 번호(Index)를 조사한다.

LB_GETTEXT 지정한 항목의 문자열을 읽는다. wParam에 항목 번호, lParam에 문자열 버퍼의 번지를 넘기면 버퍼에 문자열을 채워준다.

LB_GETCOUNT 항목의 개수를 조사한다.

LB_SETCURSEL wParam이 지정한 항목을 선택한다.

*/

 

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

{

        int wmId, wmEvent;

        PAINTSTRUCT ps;

        HDC hdc;

       

        static TCHAR *ListBox[LISTMAX]={TEXT("133"), TEXT("332"), TEXT("322"), TEXT("114"), TEXT("5555")};

        static TCHAR str[128];

        static INT iSelectList1;

 

 

        switch (message)

        {

        case WM_CREATE:

               CreateWindow(TEXT("listbox"), NULL,

                       WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_NOTIFY,

                       0, 0, 100, 100, hWnd, (HMENU)LIST1, hInst, NULL);

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

               {

                       SendMessage(GetDlgItem(hWnd, LIST1), LB_ADDSTRING, 0, (LPARAM)ListBox[iPoint]);

               }

               break;

        case WM_COMMAND:

               wmId    = LOWORD(wParam);

               wmEvent = HIWORD(wParam);

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

               switch (wmId)

               {

               case LIST1:

                       switch(wmEvent)

                       {

                              case LBN_SELCHANGE:

                                     iSelectList1=SendMessage(GetDlgItem(hWnd, LIST1), LB_GETCURSEL, 0, 0);

                                      SendMessage(GetDlgItem(hWnd, LIST1), LB_GETTEXT, iSelectList1, (LPARAM)str);

                                      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;

}