Win32 API 기술문서 (ListBox)

검수자

 

문서번호

2016-55

()

 

보존기간

2026.03.18

 

보고일자

2016.03.17

 

작성자

조범희

LIST BOX(리스트 박스)

 

20016 3

<기술문서>

 

선문 대학교

컴퓨터공학과

비트고급 31

조범희(성명)

 

 

목 차

 

1 LIST BOX(리스트 박스)?

1 LIST BOX(리스트 박스)? 1page

2 LIST BOX(리스트 박스) 생성 2page

3 LIST BOX(리스트 박스) 사용 예 4page

 

 

2 LIST BOX(리스트 박스) 스타일

1 LIST BOX(리스트 박스)스타일 종류와 기능 7page

 

 

3 LIST BOX(리스트 박스) 메시지

1 LIST BOX(리스트 박스)메시지 종류와 기능 8page

 

 

4 LIST BOX(리스트 박스)메시지 예제 10page

 

 

참고문헌 13page

1 LIST BOX(리스트 박스)?

 

 

1 LIST BOX(리스트 박스)?

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

 



위에 빨갛게 표시를 해둔 곳이 리스트 박스 이면서 현재 리스트 박스와 스크롤바가 함께 있는 format입니다.

 

 

 

 

2 LIST BOX(리스트 박스) 생성

cWnds[IDL_MEMBER] = CreateWindow(TEXT("listbox"), TEXT("확인"),

WS_CHILD|WS_VISIBLE|WS_BORDER|LBS_NOTIFY,

10, 30, 100, 300, //부모의Client 영역에서 배치할 상대좌표와 , 너비

hWnd, //부모윈도우핸들

(HMENU)IDL_MEMBER, //컨트롤을 구분 ID

hIns, //컨트롤을 생성하는 모듈의 인스턴스 핸들

0);

 

위에는 리스트 박스를 생성하는 코드입니다. CreateWindow()함수부터 매개변수까지 하나하나 설명을 하도록 하겠습니다.

 

CreateWindow 함수의원형 =

HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID lpParam); 이렇게 이루어져 있습니다. CreateWindow 함수는 실제 윈도우를 생성하게끔 해주는 함수입니다.

 

매개변수 설명

lpClassName - 생성하고자 하는 윈도우의 클래스를 지정하는 문자열입니다. , 등록된 윈도우 클래스 이름을 말합니다. 현재 lpClassName 자리에 TEXT("listbox") 가 들어있는데 이 말은 윈도우 클래스 이름을 listbox로 지정한다는 말입니다.

 

lpWindowName - 윈도우의 타이틀 바에 나타날 문자열입니다. , 윈도우 캡션 이름을 말합니다. 현재 lpWindowName 자리에 TEXT("확인“) 이 들어있는데 이 말은 윈도우 타이틀 바에 나타날 문자열을 확인이라고 지정한다는 말입니다.

 

dwStyle - 만들고자 하는 윈도우의 형태를 지정하는 인자입니다. 현재 dwStyle 자리에 WS_CHILD|WS_VISIBLE|WS_BORDER|LBS_NOTIFY 가 들어있는데 이 말은 윈도우 스타일을 WS_CHILDWS_VISIBLEWS_BORDERLBS_NOTIFY 로 지정하겠다는 얘기입니다. ListBox 스타일은 2장에서 자세히 다룰 예정이오니 2장을 참고 하세요.

 

x, y, nWidth, nHeight - 윈도우 좌측 상단의 x좌표, 윈도우 좌측 상단의 y좌표, 윈도우 폭, 윈도우 높이를 뜻합니다. 지금 현재 각각 10, 30, 100, 300 이렇게 숫자가 들어 있는데 이 말은 10 : ListBoxx좌표 , 30 :ListBoxy좌표, 100 : ListBox의 너비. 300 : ListBox의 높이를 말합니다.

 

hWndParent, - 생성될 윈도우를 소유하는 윈도우이거나 부모 윈도우의 핸들입니다. 현재 hWndParaent 자리에 hWnd, 이 들어있는데 hWnd가 즉 부모 핸들을 뜻하는 것입니다.

 

hMenu - 생성될 윈도우에 붙여질 메뉴 핸들입니다. 현재 hMenu(HMENU)IDL_MEMBER 이 들어 있는데 이 말은 컨트롤을 구분한 ID(HMENU)IDL_MEMBER 이라는 말입니다.

 

hInstance - 윈도우와 연결될 인스턴스 핸들입니다. 현재 hInstance 자리에 hIns가 들어 있는데 hIns가 지금 윈도우가 연결될 인스턴스 핸들이라는 것을 말합니다.

 

lpParam : 생성될 윈도우가 윈도우 생성을 마치고 WM_CREATE 메시지의 LPARAM을 통해 전달할 CREATESTRUCT 구조체에 대한 포인터를 말합니다. 즉 현재 ListBox에서 lpParam0을 뜻합니다.

 

이렇게 ListBox가 생성이 됩니다.

 

 

 

 

 

 

 

3 LIST BOX(리스트 박스) 사용 예

 

-소스코드

#include <Windows.h>

 

#define MY_FIRST_WND (TEXT("myfirstwnd"))

#define ID_LISTBOX 100

//TCHAR *Items[]={TEXT("안녕하세요."),TEXT("저는"),TEXT("리시트 박스에요."),TEXT("만나서 반가워요."),TEXT("재밌게 우리 같이 공부해요."),

//TEXT("우리 모두 프로그래머"),TEXT("됩시다.")};

HWND hList;

TCHAR str[128];

int i;

void RegWindowClass();

void MessageLoop();

 

INT APIENTRY WinMain(HINSTANCE hIns,

HINSTANCE hPrev,

LPSTR cmd,

INT nShow)

{

//윈도우 클래스 등록

RegWindowClass();

//윈도우 인스턴스 생성

HWND hWnd = CreateWindow(MY_FIRST_WND,//클래스 이름

TEXT("테스트"), //캡션

WS_OVERLAPPEDWINDOW, //윈도우 스타일

10,10,1000,800,//,,,높이

0,//부모 윈도우 핸들

0,//메뉴 핸들

hIns,//인스턴스 핸들

0);//생성 인자

ShowWindow(hWnd,nShow);//윈도우 인스턴스 시각화, SW_SHOW(시각화), SW_HIDE(비시각화)

//메시지 루프

MessageLoop();

return 0;

}

 

 

void OnCreate(HWND hWnd)

{

HINSTANCE hIns = GetModuleHandle(0);

hList = CreateWindow(TEXT("listbox"),NULL,

WS_CHILD|WS_VISIBLE|WS_BORDER,

10,10,200,140,//부모의 Client 영역에서 배치할 상대 좌표와 , 너비

hWnd,//부모 윈도우 핸들

(HMENU)ID_LISTBOX,//컨트롤을 구분할 ID

hIns,//컨트롤을 생성하는 모듈의 인스턴스 핸들

0); //리스트 박스 생성

SendMessageA(hList,LB_ADDSTRING,0,(LPARAM)"안녕하세요"); // LB_ADDSTRING 사용하여 ListBox 문자열 추가

SendMessageA(hList,LB_ADDSTRING,0,(LPARAM)"저는"); // LB_ADDSTRING 사용하여 ListBox 문자열 추가

SendMessageA(hList,LB_ADDSTRING,0,(LPARAM)"리스트 박스에요.");// LB_ADDSTRING 사용하여 ListBox 문자열 추가

SendMessageA(hList,LB_ADDSTRING,0,(LPARAM)"만나서 반가워요.");// LB_ADDSTRING 사용하여 ListBox 문자열 추가

SendMessageA(hList,LB_ADDSTRING,0,(LPARAM)"재밌게 우리 같이 공부해요.");// LB_ADDSTRING 사용하여 ListBox 문자열 추가

SendMessageA(hList,LB_ADDSTRING,0,(LPARAM)"우리 모두 프로그래머");// LB_ADDSTRING 사용하여 ListBox 문자열 추가

SendMessageA(hList,LB_ADDSTRING,0,(LPARAM)"됩시다.");// LB_ADDSTRING 사용하여 ListBox 문자열 추가

}

 

void OnDestroy(HWND hWnd)

{

PostQuitMessage(0);//메시지 큐에 WM_QUIT 메시지를 붙임

}

 

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

switch(iMessage)

{

case WM_CREATE: OnCreate(hWnd); return 0;

case WM_DESTROY: OnDestroy(hWnd);return 0;

}

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

}

 

void RegWindowClass()

{

WNDCLASS wndclass={0};

wndclass.hbrBackground = //배경 브러쉬 핸들

(HBRUSH)GetStockObject(WHITE_BRUSH);//전역 성향을 갖는 독특한 GDI Object 참조

wndclass.hCursor = //마우스 커서 핸들

LoadCursor(0,IDC_ARROW);

wndclass.hIcon = //프로세스 아이콘

LoadIcon(0,IDI_APPLICATION);

wndclass.hInstance = GetModuleHandle(0);//자신의 프로세스 핸들

wndclass.lpfnWndProc = MyWndProc;//윈도우 콜백 프로시저

wndclass.lpszClassName = MY_FIRST_WND;//클래스 이름 - 클래스 구분자

wndclass.style = CS_DBLCLKS;//클래스 종류

RegisterClass(&wndclass);

}

void MessageLoop()

{

MSG Message;

while(GetMessage(&Message,0,0,0))//메시지 루프에서 메시지 꺼냄(WM_QUIT이면 FALSE 반환)

{

TranslateMessage(&Message);//WM_KEYDOWN이고 키가 문자 키일 WM_CHAR 발생

DispatchMessage(&Message);//콜백 프로시저가 수행할 있게 디스패치 시킴

}

}

 

-실행 화면



 

 

2 LIST BOX(리스트 박스) 스타일

 

 

1 LIST BOX(리스트 박스)스타일 종류와 기능

스타일

설명

LBS_DISABLENOSCROLL

리스트 박스는 항목이 많으면 스크롤 바를 보여주고 스크롤 할 항목이 없을 경우 스크롤 바를 숨긴다. 이 스타일이 지정되어 있으면 스크롤 할 항목이 없어도 스크롤 바를 숨기지 않고 흐린 모양의 스크롤 바를 보여준다

LBS_EXITENDEDSEL

Shift키와 마우스 또는 특수한 키 조합을 사용하여 복수 개의 항목을 선택 할 수 있도록 한다.

LBS_HASSTRINGS

오너 드로우 스타일이 지정된 경우 문자열도 함께 가질 것인가를 지정한다. 오너 드로우가 아닌 경우는 이 속성을 지정하지 않아도 문자열을 가진다.

LBS_MULTICOLUMN

여러 단으로 항목을 보여준다. 각 단의 폭은 LB_SETCOLUMNWIDTH 메시지로 지정한다.

LBS_MULTIPLESEL

복수 개의 항목을 한꺼번에 선택한다.

LBS_NODATA

오너 드로우 리스트 박스의 경우 별도의 데이터를 가지지 않도록 하여 메모리를 절약하고자 할 때 사용하는 스타일이다. LBS_SORTLBS_HASSTRINGS 스타일과는 함께 사용할 수 없다.

LBS_NOINTEGRALHEIGHT

리스트 박스의 크기를 프로그램에서 지정한 대로 정확하게 적용한다. 이 스타일이 지정되지 않으면 개별 항목 높이의 배수로 강제 조정되어 항목의 일부만 보이는 현상이 없도록 한다.

LBS_NOSEL

리스트 박스의 내용이 변경된 후 즉시 업데이트하지 않는다. 이 스타일은 WM_SETREDRAW 메시지에 의해 언제든지 변경할 수 있다.

LBS_NOTIFY

부모 윈도우로 클릭, 더블클릭 등의 통지 메시지를 보낸다.

LBS_OWNERDRAWFIXED

오너 드로우 리스트 박스를 만든다. 이 스타일이 지정되면 리스트 박스의 오너가 직접 항목들을 그려야 한다. 각 항목의 크기는 일정하다.

LBS_OWNERDRAWVARIABLE

LBS_OWNERDRAWFIXED와 유사하되 각 항목의 크기가 가변적이다.

LBS_SORT

항목들을 알파벳순으로 자동 정렬한다.

LBS_STANDARD

LBS_NOTIFTY|LBS_SORT|WS_BORDER 세 스타일의 조합이며 가장 일반적인 리스트 박스를 만들 때 사용한다.

LBS_USETABSTOPS

항목 문자열에 탭 문자를 사용하도록 허가한다.

LBS_WANDKEYBOARDINPUT

키보드 입력시 오너에게 WM_VKEYTOITEM 메시지를 보낸다. 오너는 이 메시지를 받았을 때 특별한 처리를 할 수 있다.

-위의 표는 ListBox 스타일들의 종류들을 표기한 것 이면서 리스트 박스 개체를 생성할 때 사용자가 상황에 맞게끔 필요한 스타일을 가져다 쓰면 됩니다.

3 LIST BOX(리스트 박스) 메시지

1LIST BOX(리스트 박스)메시지 종류와 기능

메시지

설명

LB_ADDFILE

DlgDirList 함수에 의해 채워진 리스트 박스에 파일을 추가한다.

LB_ADDSTRING

문자열 항목을 추가하며 그 인덱스를 리턴한다

LB_DELETESTRING

문자열 항목을 삭제하며 남아있는 항목의 개수를 리턴한다.

LB_DIR

파일 목록을 리스트 박스에 추가한다.

LB_FINDSTRING

주어진 검색식에 맞는 첫 번째 항목의 인덱스를 조사한다.

LB_FINDSTRINGEXACT

주어진 검색식과 정확하게 일치하는 항목의 인덱스를 조사한다.

LB_GETANCHORINDEX

마우스에 의해 마지막으로 선택된 항목의 인덱스를 조사한다.

LB_GETCARETINDEX

포커스 사각형을 가진 항목의 인덱스를 조사한다.

LB_GETCOUNT

총 항목 개수를 조사한다.

LB_GETCURSEL

현재 선택되어 있는 항목의 인덱스를 조사한다.

LB_GETHORIZONTALEXTENT

스크롤 가능한 폭을 픽셀 단위로 리턴한다.

LB_GETITEMDATA

주어진 항목의 항목 데이터를 조사한다.

LB_GETITEMHEIGHT

개별 항목의 높이를 픽셀 단위로 조사한다.

LB_GETITEMRECT

주어진 항목의 작업영역 좌표를 조사한다.

LB_GETLOCALE

Locale정보를 조사한다. 상위 워드에 국가 코드, 하위 워드에 언어 ID가 전달된다.

LB_GETSEL

항목의 선택 상태를 조사한다.

LB_GETSELCOUNT

다중 선택 리스트 박스에서 선택된 항목의 개수를 조사한다.

LB_GETSELITEMS

다중 선택 리스트 박스에서 선택된 항목의 인덱스를 배열에 채운다.

LB_GETTEXT

주어진 항목의 문자열을 조사한다.

LB_GETTEXTLEN

주어진 항목의 문자열 길이를 조사한다.

LB_GETTOPINDEX

화면에 보이는 최상위 항목의 인덱스를 조사한다.

LB_INITSTORAGE

대량의 데이터를 추가할 때 메모리를 미리 준비하도록 한다. 이 메시지를 미리 보내놓으면 필요한 만큼 메모리를 확보하므로 삽입 속도가 빨라진다.

LB_INSERTSTRING

주어진 위치에 문자열을 삽입한다.

LB_ITEMFROMPOINT

lParam으로 주어진 좌표에 가장 가까운 항목의 인덱스를 조사한다. 좌표는 리스트 박스의 작업영역 좌표이다.

LB_RESETCONTENT

모든 항목을 삭제한다.

LB_SELECTSTRING

주어진 검색식에 일치하는 첫 번째 문자열을 선택한다.

LB_SELITEMRANGE

주어진 범위의 항목들을 선택한다.

LB_SELITEMRANGEEX

주어진 범위의 항목들을 선택하되 시작 항목이 끝 항목보다 뒤쪽에 있으면 선택이 취소된다.

LB_SETANCHORINDEX

마우스에 의해 최후로 선택된 항목을 설정한다.

LB_SETCARETINDEX

포커스 사각형을 주어진 항목으로 옮긴다.

LB_SETCOLUMNWIDTH

다중 컬럼 리스트 박스에서 컬럼의 폭을 픽셀 단위로 지정한다.

LB_SETCOUNT

총 항목의 개수를 설정한다.

LB_SETCURSEL

주어진 항목을 선택상태로 만든다.

LB_SETHORIZONTALEXTENT

스크롤 가능한 폭을 픽셀 단위로 설정한다. 이 폭을 설정하지 않으면 항목의 길이가 아무리 길어도 수평 스크롤 바가 나타나지 않는다.

LB_SETITEMDATA

항목 데이터를 대입한다.

LB_SETITEMHEIGHT

개별 항목의 높이를 설정한다.

LB_SETLOCALE

Locale값을 설정한다.

LB_SETSEL

다중 선택 리스트 박스에서 한 항목을 선택상태로 만든다.

LB_SETTABSTOPS

탭 중지점을 설정한다.

LB_SETTOPINDEX

주어진 항목이 화면의 최상위에 있도록 스크롤 시킨다.

-위의 표는 ListBox 메시지들의 종류들을 표기한 것 이면서 리스트 박스 개체를 생성할 때 사용자가 상황에 맞게끔 필요한 메시지들을 가져다 쓰면 됩니다.

 

4 LIST BOX메시지 예제

-소스코드

#include <Windows.h>

#define MY_FIRST_WND (TEXT("myfirstwnd"))

 

#define ID_LISTBOX 100

#define ID_EDIT 101

#define ID_BTNADD 102

#define ID_BTNDELETE 103

#define ID_BTNRESET 104 //식별자 정의

 

HWND hList, hEdit,hBtnAdd, hBtnDelete, hBtnReset;

TCHAR str[128];

int index;

 

void RegWindowClass();

void MessageLoop();

INT APIENTRY WinMain(HINSTANCE hIns,

HINSTANCE hPrev,

LPSTR cmd,

INT nShow)

{

//윈도우 클래스 등록

RegWindowClass();

//윈도우 인스턴스 생성

HWND hWnd = CreateWindow(MY_FIRST_WND,//클래스 이름

TEXT("리스트 박스 메시지"), //캡션

WS_OVERLAPPEDWINDOW, //윈도우 스타일

10,10,1000,800,//,,,높이

0,//부모 윈도우 핸들

0,//메뉴 핸들

hIns,//인스턴스 핸들

0);//생성 인자

ShowWindow(hWnd,nShow);//윈도우 인스턴스 시각화, SW_SHOW(시각화), SW_HIDE(비시각화)

//메시지 루프

MessageLoop();

return 0;

}

 

void OnCreate(HWND hWnd)

{

HINSTANCE hIns = GetModuleHandle(0);

hList = CreateWindow(TEXT("listbox"),NULL,

WS_CHILD|WS_VISIBLE|WS_BORDER,

10,10,100,200, hWnd,(HMENU)ID_LISTBOX,hIns,0); //리스트 박스 생성.

hEdit= CreateWindow(TEXT("edit"),NULL,

WS_CHILD|WS_VISIBLE|WS_BORDER,

120,10,100,25, hWnd,(HMENU)ID_EDIT,hIns,0); //에디트 컨트롤 생성.

hBtnAdd= CreateWindow(TEXT("button"),TEXT("등록"),

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

120,50,100,25, hWnd,(HMENU)ID_BTNADD,hIns,0); //버튼 생성.

 

hBtnDelete= CreateWindow(TEXT("button"),TEXT("삭제"),

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

120,80,100,25, hWnd,(HMENU)ID_BTNDELETE,hIns,0);

hBtnReset=CreateWindow(TEXT("button"),TEXT("모두삭제"),

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

120,110,100,25, hWnd,(HMENU)ID_BTNRESET,hIns,0);

 

}

 

void OnDestroy(HWND hWnd)

{

PostQuitMessage(0);

}

 

void BtnAdd(HWND hWnd,WORD cmsg,HWND cWnd)

{

SendMessage(hEdit,WM_GETTEXT,(WPARAM)128,(LPARAM)str); //Main Window에서 가진 문자열 질문.

if(lstrlen(str))

{

SendMessage(hList,LB_ADDSTRING,0,(LPARAM)str); // LB_ADDSTRING 사용하여 ListBox

}

}

void Btndelete(HWND hWnd,WORD cmsg,HWND cWnd)

{

index=SendMessage(hList,LB_GETCURSEL,0,0); //현재 선택되어 있는 항목의 인덱스를 조사.

if(index==LB_ERR)

{

MessageBox(hList,TEXT("선택된 항목 없어 삭제 할수 없습니다."),TEXT("에러"),MB_OK);

}

else

{

SendMessage(hList,LB_DELETESTRING,(WPARAM)index,0); //선택되어 있는 항목 삭제.

}

}

 

void BtnReset(HWND hWnd,WORD cmsg,HWND cWnd)

{

SendMessage(hList,LB_RESETCONTENT,0,0); //ListBox 존재하는 모든 항목 삭제.

}

void OnCommand(HWND hWnd,WORD cid, WORD cmsg, HWND cWnd)

{

switch(cid)

{

case ID_BTNADD:BtnAdd(hWnd,cmsg,cWnd);break;

case ID_BTNDELETE:Btndelete(hWnd,cmsg,cWnd);break;

case ID_BTNRESET:BtnReset(hWnd,cmsg,cWnd);break;

}

}

 

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

switch(iMessage)

{

case WM_CREATE: OnCreate(hWnd); return 0;

case WM_COMMAND: OnCommand(hWnd,LOWORD(wParam),HIWORD(wParam),(HWND)lParam); return 0;

case WM_DESTROY: OnDestroy(hWnd);return 0;

}

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

}

 

void RegWindowClass()

{

WNDCLASS wndclass={0};

wndclass.hbrBackground = //배경 브러쉬 핸들

(HBRUSH)GetStockObject(WHITE_BRUSH);//전역 성향을 갖는 독특한 GDI Object 참조

wndclass.hCursor = //마우스 커서 핸들

LoadCursor(0,IDC_ARROW);

wndclass.hIcon = //프로세스 아이콘

LoadIcon(0,IDI_APPLICATION);

wndclass.hInstance = GetModuleHandle(0);//자신의 프로세스 핸들

wndclass.lpfnWndProc = MyWndProc;//윈도우 콜백 프로시저

wndclass.lpszClassName = MY_FIRST_WND;//클래스 이름 - 클래스 구분자

wndclass.style = CS_DBLCLKS;//클래스 종류

RegisterClass(&wndclass);

}

void MessageLoop()

{

MSG Message;

while(GetMessage(&Message,0,0,0))//메시지 루프에서 메시지 꺼냄(WM_QUIT이면 FALSE 반환)

{

TranslateMessage(&Message);//WM_KEYDOWN이고 키가 문자 키일 WM_CHAR 발생

DispatchMessage(&Message);//콜백 프로시저가 수행할 있게 디스패치 시킴

 

-실행화면



참 고 문 헌(13p)

-윈도우 API 정복

-Windows API 실전정복 프로그래밍

 

참 고 사 이 트

-http://soen.kr/

-http://blog.naver.com/PostView.nhn?blogId=mystyle1057&logNo=110143032182

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

'포트폴리오 자료 > 기술문서' 카테고리의 다른 글

ASP.NET 유효성 검사 컨트롤  (0) 2016.04.17

이 글을 공유하기

댓글

Designed by JB FACTORY