Win32 API 기술문서 (ListBox)
- 포트폴리오 자료/기술문서
- 2016. 4. 17. 18:19
검수자 |
| 문서번호 | 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_CHILD와 WS_VISIBLE와 WS_BORDER와 LBS_NOTIFY 로 지정하겠다는 얘기입니다. ListBox 스타일은 2장에서 자세히 다룰 예정이오니 2장을 참고 하세요.
x, y, nWidth, nHeight - 윈도우 좌측 상단의 x좌표, 윈도우 좌측 상단의 y좌표, 윈도우 폭, 윈도우 높이를 뜻합니다. 지금 현재 각각 10, 30, 100, 300 이렇게 숫자가 들어 있는데 이 말은 10 : ListBox의 x좌표 , 30 :ListBox의 y좌표, 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에서 lpParam은 0을 뜻합니다.
이렇게 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_SORT나LBS_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(리스트 박스) 메시지
제 1절 LIST 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://blog.naver.com/PostView.nhn?blogId=mystyle1057&logNo=110143032182
'포트폴리오 자료 > 기술문서' 카테고리의 다른 글
ASP.NET 유효성 검사 컨트롤 (0) | 2016.04.17 |
---|
이 글을 공유하기