본문 바로가기

API

컨트롤(리스트,콤보 박스)

1. 리스트 박스


리스트박스는 선택 가능한 여러 개의 항목들을 나열해 놓고 그 중 하나(또는 여러개를 선택하는 컨트롤이며 여기서 항목이란 주로 문자열이다.
"listbox"라는 윈도우 클래스로 생성한다.

스타일

설     명

LBS_MULTIPLESEL

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

LBS_NOTIFY

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

LBS_SORT

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

LBS_OWNERDRAW

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

LBS_STANDARD

LBS_NOTIFY|LBS_SORT|WS_BORDER


LBS_NOTIFY 스타일은 거의 필수적으로 선택하는 것이 좋으며, 그 외 스타일은 필요시에 선택하면 된다.
부모 윈도우가 리스트 박스를 조작하고자 할 때는 리스트 박스 메시지를 사용한다.

부모윈도우  -메세지-> 리스트 박스 

메시지

설     명

LB_ADDSTRING

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

LB_DELETESTRING

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

LB_GETCURSEL

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

LB_GETTEXT

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

LB_GETCOUNT

항목의 개수를 조사한다.

LB_SETCURSEL

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


리스트 박스에 선택한 항목들을 채울 때는 LB_ADDSTRING을 사용하며 현재 선택된 항목의 인덱스는 LB_GETCURSEL로 구하고 특정 인덱스의 문자열을 읽을 때는  LB_GETTEXT메시지를 사용한다.

이 메시지들은 부모 윈도우가 리스트 박스에게 명령을 내리기 위해 사용하며 반대로 리스트 박스에서 어떤 사건이 발생했을 때 부모 윈도우로 다음과 같은 통지 메시지를 보낸다.


#define ID_LISTBOX 100
HWND hList;
TCHAR *Items[] = {TEXT("Apple"),TEXT("Orange"),TEXT("Melon"),TEXT("Grape"),TEXT("Strawberry")};
int i;
TCHAR str[128];

LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  hList = CreateWindow(TEXT("listbox"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|LBS_NOTIFY,
    10,10,100,200,hWnd,(HMENU)ID_LISTBOX,g_hInst,NULL);
  
  for(i=0;i<5;i++)
  {
    SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Items[i]);
  }
  return 0;
}

LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  switch(LOWORD(wParam))
  {
    case ID_LISTBOX:
      switch(HIWORD(wParam))
      {
        case LBN_SELCHANGE:
          i=SendMessage(hList,LB_GETCURSEL,0,0);
          SendMessage(hList,LB_GETTEXT,i,(LPARAM)str);
          SetWindowText(hWnd,str);
          break;
      }
  }
  return 0;
}

LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  hdc=BeginPaint(hWnd, &ps);
  EndPaint(hWnd, &ps);
  
  return 0;
}

LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  PostQuitMessage(0);
  return 0;
}






2. 콤보 박스

콤보박스는 에디트 컨트롤과 리스트 박스를 결합해 놓은 컨트롤이다. "combobox" 윈도우 클래스를 사용하며 세가지 종류가 있는데 스타일로 원하는 종료를 선택한다.
 

스타일

설     명

CBS_SIMPLE

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

CBS_DROPDOWN

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

CBS_DROPDOWNLIST

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



#define ID_COMBOBOX 100
HWND hCombo;
TCHAR *Items[] = {TEXT("Apple"),TEXT("Orange"),TEXT("Melon"),TEXT("Grape"),TEXT("Strawberry")};
int i;
TCHAR str[128];

LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  hCombo = CreateWindow(TEXT("combobox"),NULL,WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,
    10,10,100,200,hWnd,(HMENU)ID_COMBOBOX,g_hInst,NULL);
  
  for(i=0;i<5;i++)
  {
    SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)Items[i]);
  }
  return 0;
}

LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  switch(LOWORD(wParam))
  {
    case ID_COMBOBOX:
      switch(HIWORD(wParam))
      {
        case CBN_SELCHANGE:
          i=SendMessage(hCombo,CB_GETCURSEL,0,0);
          SendMessage(hCombo,CB_GETLBTEXT,i,(LPARAM)str);
          SetWindowText(hWnd,str);
          break;
        case CBN_EDITCHANGE:
          GetWindowText(hCombo,str,128);
          SetWindowText(hWnd,str);
          break;
      }
  }
  return 0;
}

LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  hdc=BeginPaint(hWnd, &ps);
  EndPaint(hWnd, &ps);
  
  return 0;
}

LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  PostQuitMessage(0);
  return 0;


WM_COMMAND가 처리하는 통지 메시지를 보면 LBN_SELCHANGE에 대응되는 CBN_SELCHANGE와 EN_CHANGE에 대응되는 CBN_EDITCHANGE메시지 뿐이다. 두메시지는 리스트 박스, 에디트의 메시지와 동일한 의미를 가진다.


 

'API' 카테고리의 다른 글

컨트롤과의 통신  (0) 2011.09.28
컨트롤(에디트)  (0) 2011.09.23
컨트롤(라디오)  (0) 2011.09.21
컨트롤(체크박스)  (0) 2011.09.20
컨트롤(버튼)  (0) 2011.09.19