WinAPI

[WINAPI]컨트롤2(라디오 버튼, 에디트, 리스트박스)

FORHAPPy 2021. 12. 30. 18:08

라디오 버튼이란 ?

 

일종의 버튼이다. 

체크 버튼은 진위적인 옵션을 개별적으로 입력받는데 비해 라디오버튼은 여러가지 선택사항들 중 한가지만 선택할 필요가 있을 때 사용한다. 

 

즉, 하나의 선택사항에 대해 여러개의 라디오 버튼들이 사용된다는 특징이 있다. 

라디오 그룹을 구성하는 방법은 간단하다.

 

첫번째 라디오 버튼에만 WS_GROUP 스타일을 주고 나머지는 주지 않으면 된다. 다음 WS_GROUP스타일을 가지는 라디오 버튼 직전까지가 한 그룹이 된다.

 

checkRadioButton(부모윈도우, 버튼 범위의 시작, 버튼의 끝, 처음에 선택할 버튼);

버튼을 만든 후 위 함수를 호출하여 처음 선택 될 라디오 버튼을 지정한다.

 

  1. CreateWindow로 그룹박스를 만든다.
  2. CreateWindow로 라디오 버튼을 생성한다.
  3. WM_COMMAND 에서 결과에 따른 값을 조절 및 InvalidateRect를 호출
  4. 그려준다.

 


에디트

 

문자열을 직접 입력받을 때 사용한다. 버튼과 마찬가지로 윈도우즈에서 가장 흔하게 볼 수 있는 컨트롤 이다. 

 

 

Edit 윈도우 클래스로부터 생성한다.

다음과 같은 스타일을 지정가능하다.

 

스타일 설명
ES_AUTOHSCROLL 수평스크롤을 지원
ES_AUTOVSCROLL 수직스크롤을 지원
ES_LEFT 왼족 정렬
ES_RIGHT 오른쪽 정렬
ES_CENTER 중앙정렬
ES_LOWERCASE 소문자로 변환하여 표시
ES_UPPERCASE 대문자로 변환하여 표시
ES_MULTILINE 여러줄을 편집할 수 있도록 한다.
ES_NOHIDESEL 포커스를 잃더라도 선택된 영역을 표시
ES_READONLY 읽기전용으로 만들어 편집을 금지한다.

 

자신의 변화에 따른 다음과 같은 통지메시지를 부모윈도우에 보낸다. 

 

메시지 설명
EN_CHANGE 문자열이 변경됨
EN_ERRSPACE 메모리가 부족
EN_HSCROLL 사용자가 수평스크롤바를 클릭
EN_VSCROLL 사용자가 수직스크롤바를 클릭
EN_KILLFOCUS 포커스를 잃었다.
EN_SETFOCUS 포커스를 얻었다.
EN_MAXTEXT 지정한 문자열의 길이를 초과하였다.
EN_UPDATE 문자열이 변경되기 직전이다.

 

SetWindowText함수로 캡션을 변경(컨트롤도 윈도우랑 같은 함수를 사용함)

MoveWindow 함수로 에디트를 이동

ShowWIndow 함수로 에디트가 보여질지 안보여질지 결정

GetWindowText 함수로 에디터에 입력된 텍스트를 읽음

 

윈도우에 적용되는 함수가 에디트에도 아무런 무리없이 적용된다. (컨트롤도 윈도우다)

 


<리스트 박스>

 

선택이 가능한 여러개의 항목들을 나열해 놓고 그 중 하나 또는 여러개를 선택하는 컨트롤 이다. 

listbox라는 윈도우 클래스로 생성한다.

 

리스트박스 스타일

스타일 설명
LBS_MULTIPLESEL 여러항목을 선택할 수 있음 디폴트는 하나다
LBS_NOTIFY 사용자가 목록중 하나를 선택했을때 부모윈도우로 통지메시지를 보냄(필수)
LBS_SORT 추가된 항목들을 자동정렬
LBS_OWNERDRAW  문자열이 아닌 비트맵이나 그림을 넣을 수 잇다.
LBS_STANDARD LB_NOTIFY | LBS_SORT | WS_BORDER

 

 

 

부모윈도우가 메시지박스를 조작하고자 할때의 메시지

메시지 설명
LB_ADDSTRING 리스트박스에 항목을 추가 lParam으로 문자열 번지를 넘겨줌
LB_DELETESTRING 항목을 삭제
LB_GETCURSEL 현재 선택된 항목의 번호를 조사한다.
LB_GETTEXT 지정한 항목의 문자열을 읽는다.
wParam에 항목번호 lParam에 문자열 버퍼의 번지를 넘기면 버퍼에 문자열을 채워준다.
LB_GETCOUNT 항목의 개수를 조사한다.
LB_SETCURSEL wParam이 지정한 항목을 선택한다.

 

통지메시지

 

메시지 설명
LBN_DBLCLK 리스트박스를 더블클릭하였다
LBN_ERRSPACE 메모리가 부족하다
LBN_KILLFOCUS 키보드 포커스를 잃었다.
LBN_SELCHANGE 사용자에 의해 선택이 변경되었다.
LBN_SELCANCLE 사용자가 선택을 취소하였다.
LBNSETFOCUS 키보드 포커스를 얻었다.

 가장 자주사용 되는 통지 메시지는 LBN_SELCHANGE다 

 

 

사용 방법

 

  1. WM_CREATE 에서 CreateWindow 함수로 리스트 박스를 만들어 주고 여기서 바로 SendMessage를 보내서 LB_ADDSTRING 메시지를 보내고 넣어줄 문자열 포인터를 넣어준다.
  2. 사용자가 리스트박스 항목을 선택하면 LBN_SELCHANGE 통지메시지가 전달된다.
  3. LB_GETCURSEL 메시지로 현재 선택된 항목의 번호를 구한다.
  4. LB_GETTEXT 메시지로 항목의 문자열을 str버퍼에 읽는다. 
  5. Setwindowtext 함수로 메인 윈도우 타이틀 바에 출력한다.

'WinAPI' 카테고리의 다른 글

[WINAPI]엑셀러레이터  (0) 2022.01.16
[WinAPI]MDI(Multiple Document INterface)  (0) 2022.01.03
[WinAPI]메타파일  (0) 2022.01.03
[WINAPI]컨트롤3(콤보박스, 스크롤, 스태틱)  (0) 2021.12.30
[WINAPI]컨트롤1(버튼, 체크박스)  (0) 2021.12.30