오다기리 박의 알고리즘 노트

[WIN32 API] 6. 대화상자와 컨트롤 본문

WIN32 API

[WIN32 API] 6. 대화상자와 컨트롤

오다기리 박 2017. 11. 3. 15:42

6. 대화상자와 컨트롤


■ 대화상자 이용

  1. 리소스에서 새로운 대화상자 만들기

  2. 대화상자에 대한 메시지 처리 함수 작성하기

  3. 대화상자 띄우기


■ 컨트롤을 대화상자에서 기본적으로 사용할 수 있도록 제공되는 것


■ 컨트롤에서 대화상자로 오는 WM_COMMAND 메시지



메시지를 보낸 곳

wParam


lParam

HIWORD

LOWORD

컨트롤

컨트롤에 따른 통지 정보

컨트롤 ID

컨트롤 핸들 값


■ 컨트롤에 메시지를 전송하는 함수 (콤보박스, 리스트박스.. 등에서 사용)

LRESULT SendMessage(HWND hwnd,

UINT iMsg,

WPARAM wParam,

LPARAM lParam);

- hwnd : 메시지를 받을 윈도우나 컨트롤의 핸들 값

- iMsg : 전송할 메시지

- wParam, lParam : 메시지의 부가 정보


■ 버튼 컨트롤


      ⠂통지 정보 종류

- BN_CLICKED : 버튼클릭

- BN_DBCLICK : 버튼 더블클릭

- BN_DISABLE : 버튼 사용 불가능 상태

- BN_HILITE : 사용자가 버튼 선택

- BN_SETFOCUS : 버튼이 포커스를 받음


⠂윈도우에 작은 윈도우가 존재하고, 그것은 GetDlgItem()함수를 이용해 ID로 얻어올 수 있다.


■ 에디트 컨트롤 : 사용자의 키보드 입출력을 위한 편집 창


      ⠂통지 정보 종류

- EN_CHANGE : 에디트 컨트롤의 내용이 변함

- EN_HSCROLL : 에디트 컨트롤의 수평 스크롤바 선택

- EN_VSCROLL : 에디트 컨트롤의 수직 스크롤바 선택

- EN_SETFOCUS : 에디트 컨트롤이 포커스를 받음


■ 콤보박스 컨트롤 : 항목의 리스트 컨트롤을 보여주어 이 중 하나를 선택할 때 사용


      ⠂통지 정보 종류

- CBN_DROPDOWN : 콤보박스 컨트롤에 등록된 항목이 아래로 펼쳐짐

- CBN_DBCLK : 아래로 펼쳐진 항목 리스트 컨트롤에서 하나를 더블클릭

- CBN_EDITCHANGE : 콤보박스 컨트롤의 텍스트 편집 공간에 텍스트를 추가,수정

- CBN_SELCHANGE : 항목 리스트 컨트롤에서 하나를 선택



      ⠂콤보 박스 컨트롤에 보내는 iMsg

- CB_ADDSTRING : 콤보박스 컨트롤의 항목 리스트에 문자열을 새로 추가

wParam : 사용X

lParam : 추가될 문자열의 시작 주소

- CB_DELETESTRING : 콤보박스 컨트롤에 있는 항목 하나를 삭제

wParam : 삭제하고자 하는 항목의 인덱스

lParam : 0

- CB_FINDSTRING : 항목 리스트 컨트롤에 있는 텍스트 중 원하는 텍스트를 찾음

wParam : 찾기 시작할 위치를 지정하는 인덱스 값으로 0부터 시작함. -1로 하면 리스트 컨트롤 전체에서 찾는다

lParam : 찾고자 하는 문자열의 시작 주소

- CB_GETCOUNT : 콤보 박스 컨트롤의 항목 리스트에 있는 항목의 개수 얻기

wParam : 0

lParam : 0

- CB_GETCURSEL : 현재 선택한 항목의 인덱스 번호 얻기

wParam : 0

lParam : 0

- CB_SERCURSEL : 콤보박스 컨트롤의 텍스트 편집 공간에 지정한 항목의 텍스트를 보여줌

wParam : 나타내고자 하는 항목의 인덱스 번호

lParam : 사용x


■ 리스트박스 컨트롤 : 외부 입력 없이 여러 개의 항목을 일렬로 보여주는 컨트롤


      ⠂통지 정보 종류

- LBN_DBCLK : 리스트 박스 컨트롤의 여러 항목 중 하나를 더블클릭

- LBN_SELCHANGE : 항목 중 하나가 선택됨

- LBN_SETFOCUS : 리스트 박스 컨트롤이 포커스를 받음

- LBN_KILLFOCUS : 리스트 박스 컨트롤이 포커스를 잃음

- LBN_DELETEITEM : 리스트 박스 컨트롤의 항목 중 하나가 삭제됨



      ⠂리스트 박스 컨트롤에 보내는 iMsg

- LB_ADDSTRING : 리스트 박스 컨트롤의 항목 리스트 마지막에 문자열을 추가

wParam : 사용x

lParam : 문자열의 시작 주소

- LB_DELETESTRING : 리스트 박스 컨트롤에 있는 항목 중 하나를 삭제

wParam : 삭제하려는 항목의 인덱스 정수

lParam : 0

- LB_FINDSTRING : 항목 리스트 컨트롤에 있는 텍스트 중 원하는 텍스트 찾기

wParam : 찾기 시작할 위치를 지정하는 인덱스 값으로 0부터시작함. -1로 하면 리스트 컨트롤 전체에서 찾음

lParam : 찾고자 하는 문자열의  시작 주소

- LB_GETCOUNT : 리스트 박스 컨트롤의 항목 리스트에 있는 항목 개수 얻기

wParam : 0

lParam :0

- LB_GETCURSEL : 현재 선택한 항목의 인덱스 번호 얻기

wParam : 0

lParam :0

- LB_SETCURSEL : 선택한 항목을 보여줌

wParam : 선택한 항목의 인덱스 번호

lParam : 사용x

- LB_GETSELCOUNT : 리스트 컨트롤 중 선택한 항목의 개수 얻기

wParam :0

lParam :0

- LB_GETSELITEM : 리스트 컨트롤 중 선택한 항목의 인덱스 번호 가져오기

wParam : 선택할 수 있는 항목의 최대 개수

lParam : 선택한 항목들의 인덱스 번호를 저장할 정수 배열의 시작주소

- LB_GETTEXT : 항목 리스트 컨트롤 중 wParam에서 지정한 인덱스 항목의 텍스트 얻어오기

wParam : 얻어올 항목의  인덱스 번호

lParam : 얻어온 텍스트를 저장할 버퍼의 시작 주소

- LB_INSERTSTRING : 항목 리스트 중간에 문자열을 새로운 항목으로 추가

wParam : 항목 리스트 중 추가될 위치의 인덱스 번호

lParam : 문자열의 시작 주소


■ 모덜리스 대화상자

  • 모덜 대화상자는 대화상자의 핸들 값이 필요없지만, 모덜리스 대화상자는 부모 윈도우와 대화상자가 동시에 구동되기 때문에 부모 윈도우가 대화상자의 윈도우 핸들 값을 가져야 한다.

  • 모덜 대화상자 생성,삭제 : DialogBox(), EndDialog()

  • 모덜리스 대화상자 생성,삭제 : CreateDialog(), DestroyWindow()



■ 리스트 컨트롤 : 리스트박스 컨트롤의 발전된 형태



■ 컨트롤에서 대화상자로 오는 WM_NOTIFY메시지 : 컨트롤에 변화가 있을 때 부모 윈도우(대화상자)에 보내진다


메시지를 보내는 곳

lParam


wParam

(LPNMHDR)lParam

(LPNMLISTVIEW)lParam

컨트롤

변화가 일어난 컨트롤의 윈도우 핸들 값과 변화 내용을 알 수 있음

리스트 컨트롤의 어떤 항목에 변화가 있었는지 알 수 있음



  • NMHDR구조체

typedef struct tagNMHDR {

HWND hwndFrom; ->변화가 발생한컨트롤의 윈도우 핸들 값

UINT_PTR idFrom; ->메시지를 보낸 컨트롤의 ID값

UINT code; ->컨트롤에 발생한 변화 내용

} NMHDR; (LVN_ITEMCHANGING : 리스트 컨트롤의 항목에 변화 발생

LVN_KEYDOWN: 리스트 컨트롤에서 키보드 누름

LVN_INSERTITEM: 리스트 컨트롤에 새항목 추가

LVN_DELETEITEM: 리스트 컨트롤의 항목 하나 삭제

LVN_COLUMNCLICK: 리스트 컨트롤의 특정 칼럼 선택)


  • NMLISTVIEW 구조체

typedef struct tagNMLISTVIEW {

NMHDR hdr; ->WM_NOTIFY와 함께 변화가 일어난 컨트롤의 윈도우 핸들 값과 변화내용을 알려주는 정보. 이는 lParam을 NMLISTVIEW로 형변환 할 때와 동일

int iItem;->리스트 컨트롤의 몇 번째 행에 변화가 있었는지에 대한 인덱스 0부터 시작

int iSubItem; ->리스트 컨트롤의 몇 번째 열에 변화가 있었는지에 대한 인덱스 0부터시작

UINT uNewState; ->나머지는 WM_NOTIFY에서 사용x

UINT uOldState;

UINT uChanged;

POINT ptAction;

LPARAM lParam;

} NMLISTVIEW, *LPNMLISTVIEW;



'WIN32 API' 카테고리의 다른 글

[WIN32 API] 8. 파일 입출력  (0) 2017.11.03
[WIN32 API] 7. MDI 프로그래밍  (0) 2017.11.03
[WIN32 API] 5. 단축키와 비트맵  (0) 2017.11.03
[WIN32 API] 4. 윈도우 메뉴  (0) 2017.11.03
[WIN32 API] 3. 제어 메시지 처리하기  (0) 2017.11.03