프로그래밍/API

API 일부 정리

에어버스 2016. 6. 10. 11:52

edit 컨트롤
- 32KB로 제한. 그 이상되면 Edit control out of space 에러 발생함.
- 윈도우 스타일에서 ES_LEFT, ES_RIGHT, ES_CENTER 정렬방식 지정
- 멀티라인 ES_MULTILINE
- ES_AUTOHSCROLL, ES_AUTOVSCROLL 수평, 수직 스크롤 지원
- WS_BORDER 경계선 지정
- ES_NOHIDESEL, 포커스를 갖지 않을때라도 선택된 것을 반전되어 있게 유지한다. (기본값은 문자열 선택하여 반전되어 있다가 포커스를 잃으면 반전 해제된다)
에디트 컨트롤은 부모 윈도우 프로지저에 WM_COMMAND 메시지에 wParam, lParam 전달하며 아래와 같은 값을 가진다.
LOWORD(wParam) : 자식윈도우 ID
HIWORD(wParam) : 통지코드
lParam : 자식 윈도우 핸들
 
ES_ERRSPACE : 에디트컨트롤은 공간을 써버린다
EN_MAXTEXT : 에디트 컨트롤은 삽입 시 공간을 써버린다.
EX_HSCROLL : 수평스크롤바 이동막대가 클릭된다.
EX_VSCROLL : 수직 스크롤바 이동막대가 클릭된다.

SendMessage(hWndEdit, WM_CUT, 0, 0) : 선텍된 문자열 자르기 (클립보드에 저장)
SendMessage(hWndEdit, WM_COPY, 0, 0) : 선텍된 문자열 복사
SendMessage(hWndEdit, WM_CLEAR, 0, 0) : 선텍된 문자열 지우기 (클립보드에 저장 안됨)
SendMessage(hWndEdit, WM_PASTE, 0, 0) : 선텍된 문자열 붙여넣기
SendMessage(hWndEdit, EM_GETSEL, (WPARAM)&n시작, (LPARAM)&n끝) : 선텍된 문자열 시작과 끝 위치 얻기, 끝 위지는 (마지막 선택된 문자 위치+1) 이 된다.
SendMessage(hWndEdit, EM_SETSEL, n시작, n끝) : 문자열 선택
SendMessage(hWndEdit, EM_REPLACESEL, 0, (LPARAM)str문자열) : 문자열 교체
n라인수 = SendMessage(hWndEdit, EM_LINEUNDEX, n라인, 0) : 멀티라인에서 라인 수 얻기
n줄길이 = SendMessage(hWndEdit, EM_LINELENGTH, n라인, 0)
n길이 = SendMessage(hWndEdit, EM_GETLINE, n라인, (LPARAM)str문자열) : 줄의 내용을 str문자열에 복사

 

목록상자
항목이 선택되면 부모윈도우에 WM_COMMAND 보내면 선택된 항목을 알 수 있다.
한 문자 키를 누르면 해당 항목으로 이동한다.
기본값으로는 부모윈도우에 WM_COMMAND 메시지를 전달하지 않으므로 필요하면 LBS_NOTIFY 포함시켜 부모윈도우가 WM_COMMAND를 받을 수 있도록 해야 한다.
LBS_SORT : 항목 정렬
LBS_MUTIPLESEL : 다중 항목선택
LBS_NOREDRAW : 항목이 추가될때마다 다시 그리게 되는데 이를 막음
WS_BORDER : 목록상자 테두리 표시
WS_VSCROLL : 수직 스크롤 바 표시, (수평 스크롤바는 윈도우스타일 지정만으로 안되고 직접 그려줘여 한다.)
LBS_STANDARD : (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)

목록상자의 폭 = (가장 긴 문자열의 길이 + (수직 스크롤바 폭 = GetSystemMetrics(SM_CXVSCROLL))
목록상자에 항목 넣기 : SendMessage(hWndListBox, LB_ADDSTRING, 0, (LPARAM)str항목) 성공하면 LB_OKAY(0), 실패하면 LB_ERR(-1), 메모리공간이 부족하면 LB_ERRSPACE(-2) 리턴
 
LB_ADDSTRING : 항목 삽입 후 정렬된다. (LBS_SORT 스타일 일때)
LB_INSERTSTRING : 지정한 위치에 삽입, SendMessage(hWndListBox, LB_INSERTSTRING, n위치, (LPARAM)str항목) n위치는 0부터 시작, LBS_SORT 스타일이라도 정렬 안됨
항목 삭제 : SendMessage(hWndListBox, LB_DELETESTRING, n위치, 0)
항목 전체 삭제 : SendMessage(hWndListBox, LB_RESETCONTENT, 0, 0)
항목 추가나 삭제 시 다시 그리기 중지 : SendMessage(hWndListBox, LB_SETREDRAW, FALSE, 0) 추가나 삭제 항목이 많은 경우 유용
다시 그리기 켜기 : SendMessage(hWndListBox, LB_SETREDRAW, TRUE, 0)
항목수 = SendMessage(hWndListBox, LB_GETCOUNT, 0, 0)
항목선택 : SendMessage(hWndListBox, LB_SETCURSEL, n위치, 0) n위치 값을 -1로 하면 모든 항목의 선택 취소된다.
nIndex = SendMessage(hWndListBox, LB_SELECTSTRING, n위치, (LPARAM)str문자열) n위치부터 str문자열의 첫문자와 같은 항목을 선택, n위치 값이 -1 이면 처음부터 찾는다. 찾는 첫문자가 없으면 LB_ERR(-1) 리턴한다
목록상자에서 WM_COMMAND 메시지를 얻을때 현재 선택의 인덱스를 알 수 있다. n인덱수 = SendMessage(hWndListBox, LB_SETCURSEL, 0, 0) 선텍 항목없으면 LB_ERR(-1) 리턴n
n문자열길이 = SendMessage(hWndListBox, LB_GETTEXTLEN, n위치, 0)
항목 복사 : n문자열길이 = SendMessage(hWndListBox, LB_GETEXT, n위치, (LPARAM)str버퍼) str버퍼는 (항목의 문자열길이+1) 보다 커애 한다.
다중선택 스타일에서는 LB_SETCURSEL, LB_GETCURSEL, LB_SELECTSTRING 사용할 수 없다.
다중선택 스타일이라도 특정항목 선택 : SendMessage(hWndListBox, LB_SETSEL, wParam, n위치) wParam 값은 선택하고 반전 시키려면 0 이 아닌 값을지정, 취소하려면 0, lParam 값이 -1 이면 모든 항목 선택 또는 취소된다.
특정위치의 항목 상태 SendMessage(hWndListBox, LB_GETSEL, n위치, 0) 항목이 선택되면 0이 아닌값 그렇지 앟으면 0이 아닌값을 리턴

부모윈도우로부터 목록상자에 포커스 지정 : SetFocus(hWndListBox)
목록상자는 부모윈도에게 WM_COMMAND 메시지를 보낼떄
LOWORD(wParam) : 자식윈도우의 ID
HIWORD(wParam) : 통지 코드
lParam : 자식윈도우의 핸들

인식코드
LBN_ERRSPACE : 목록상자 컨트롤의 공간 부족
LBN_SELCHANGE : 현재 선택이 변경
LBN_DBLCLK : 항목이 더블 클릭
LBN_SELCANCEL
LBN_SETFOCUS
LBN_KILLFOCUS

목록상자 윈도우스타일이 LBS_NOTIFY 일때 부모윈도우에 LBN_SELCHANGE, LBN_DBLCLK 보낸다


- 아이콘, 커서
OS에 등록된 아이콘을 사용 : LoadIcon(NULL, IDI_APPLICATION)
리소스 파일에 등록 후 사용 : LoadIcon(프로그램 인스턴스, "아이콘이름")


SetClassLong(핸들, GCW_HICON, LoadIcon(인스턴스, "아이콘이름")) : 아이콘 변경, GCW_HICON (작은 아이콘)
아이콘 핸들 얻기 : GetClassLong(핸들, GGW_HICON)

아이콘 그리기 : DrawIcon(HDC, x, y, GetClassLong(핸들, GGW_HICON))


SetClassLong(핸들, GCW_HCURSOR, LoadCursor(인스턴스, "커서이름")) : 커서 바꾸기

SetCursor(커서핸들) : 자식윈도우를 사용하지 않고 클라이언트 영역을 좀더 작은 영역들로 분할한다면 각 영역마다 커서를 바꿀때 이용, WM_MOUSEMOVE 이벤트처리에서 호출해야 한다.
 
- 비트맵
1. 클라이언트 영역에 그리기
2. 브러시를 만들어 클라이언트 영역을 채운다

비트맵 이미지를 리소스에 추가 후
HBITMAP hBitmap = LoadBitmap(인스턴스, MAKEINTRESOURCE(IDB_BITMAP1))
HBRUSH hBrush = CreatePatternBrush(hBitmap);
윈도우클래스.hbrBackground = hBrush;
프로드램 종료 전
DeleteObject((HGDIOBJ)hBrush);
DeleteObject((HGDIOBJ)hBitmap);

로 실행하면 클라이언트 영역의 배경이 비트맵 이미지로 채워진다.


- 문자열 리소스 (IDS_ 로 시작)

구조

STRINGTABLE
BEGIN
    IDS_APP_TITLE           "Win32Project1"
    IDC_WIN32PROJECT1       "WIN32PROJECT1"
END

문자열 리소스 얻기 : LoadString(인스턴스, IDS_APP_TITLE, sz문자열, n길이)
최대 255 문자 가능 (윈95 기준)
/t 외에는 어떠한 C형식의 제어문자도 사용 불가지만 8진수 상수는 포함 가능하다.
TAB   \011
Linefeed \012
Carriage return \015


- 메뉴

사용자가 메뉴 항목을 선택할 때 OS는 프로그램에게 ID번호를 포함하는 WM_COMMAND 메시지를 보낸다.

CHEDKED, GRAYED, INACTIVE,
MENUBREAK : 이 항목 다음에 오는 항목들은 메뉴의 새칸에 표시
MENUBARBREAK : MENUBREAK와 같고 수직 줄 추가?
윈도우 클래스에 지정하거나 윈도우 만들때 지정한다. NULL로 지정하면 윈도우 클래스에 저장된 메뉴로 사용

메뉴 바꾸기 : SetMenu(윈도우 핸들, 메뉴핸들)

윈도우에 붙은 메뉴는 그 윈도우가 제거될때 같이 제거되나 붙지 않은 메뉴는 종료 전에 DestroyMenu() 호출해서 제거해야 한다.

WM_INITMENU : 메뉴 항목이 선택되기 전에 메뉴를 바꿀 수 있는 기회를 제공하나 보통 무시된다. - 메뉴를 바꾸면 사용자에게 혼란 줄 수 있음

WM_MENUSELECT : 사용자가 커서나 마우스를 메뉴 항목 사이로 이동할때 발생
LOWORD(wParam) : 선택한 메뉴 항목 ID
HIWORD(wParam) : 선택 플러그, MF_GRAYED, MF_DISABLE, MF_CHECKED, MF_BITMAP, MF_POPUP, MF_HELP, MF_SYSMENU, MF_MOUSESELECT (항목 선택에 따라 작업을 할때 사용)

WM_INITMENUPOPUP : 팝업 메뉴를 표시할 준비가 되었을때 발생 (클립 보드에 텍스트 가지고 있으면 Paste 메뉴를 활성화 아니면 비활성화 시킬때 등)
wParam : 팝업 메뉴 핸들
LOWORD(lParam) : 팝업 인덱스
HIWORD(lParam) : 시스테메뉴이면 1, 아니면 0

WM_COMMAND : 메뉴 선택되면 발생

LOWORD(wParam) : 메뉴 ID
HIWORD(wParam) : 0
lParam : 0

WM_SYSCOMMAND : 시스템 메뉴 항목 선택
LOWORD(wParam) : 메뉴 ID
HIWORD(wParam) : 0
LOWORD(lParam) : 마우스 커서의 X 좌표, HIWORD(lParam) : 마우스 커서의 Y 좌표

WM_MENUCHAR : 사용자가 문자를 누른경우
LOWORD(wParam) : ACSII 코드
HIWORD(wParam) : 선택코드, 0: 팝업 메뉴 표시안됨, MF_POPUP : 팝업 표시됨, MF_SYSMENU : 시스템 메뉴 팝업이 표시됨
lParam : 메뉴 핸들

메뉴핸들 = GetMenu(hWnd)
CheckMenuItem(GetMenu(hWnd), LOWWORD(wParam), MF_UNCHECKED) : 언체크 한다

EnableMenuItem(핸들메뉴, 메뉴ID, MF_GRAYED) : 메뉴를 흐리게한다, 활성화는 MF_ENABLED