1. 버튼
case WM_CREATE: CreateWindow(TEXT("button"), TEXT("click"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,20,20,100,25, hWnd (HMENU)0, g_Inst, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) case 0: MessageBox(hWnd, Text("clicked"), "TEXT(button)", MB_OK); break; return 0; |
버튼 컨트롤 사용 방식이다.. 윈도우 생성시 버튼을 만든 것이고, 버튼이 클릭되었을때 메시지박스를 띄우는 것이다.
CreateWindow(만들윈도우클래스, 윈도우제목, 스타일, 좌표,좌표,좌표,좌표, 부모윈도우, 아이디값, 윈도우인스턴스핸들, MDI사용될 구조체);
스타일을 살펴보면 차일드라는 속성이 사용되었다. 이것은 메인 윈도우가 만들어지면 그안에 포함되는 컨트롤인 된다는 것이다.
비지블은 보여준다, 푸쉬버튼 누른다. 라는 의미이다.
자식윈도우로 지정을 했으면 부모의 핸들을 부모윈도우 자리에 넣어주면 되고 아이디 값을 그 버튼을 눌렀을때 wParam으로 넘어가는 값을 말한다.. 커맨드에선 하이워드의 wParam을 조사하여 그에 해당하는 코드를 넣어주면 된다.
2. 체크 박스
생성방식은 위와 동일 하다..
static HWND c1; // 체크박스 핸들저장,,, (체크 확인여부위해서) static bool draw = false; // 그림을 그릴것인가에 대한 변수 RECT rt; GetClientRect(hWnd, &rt); //현제 윈도우 클라이언트 영역을 얻어온다 case WM_CRATE: c1 = CreateWindow("button", "checkbox", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 20, 20, 160, 25, hWnd, (HMENU)1, g_hInst, NULL) ; //수동체크박스 생성, 자동으로 하려면 BS_AUTOCHECKBOX로 변경한면 된다 break; case WM_COMMAND: switch(LOWORD(wParam)) case 1 : if(SendMessage(c1, BM_GETCHECK, 0, 0) == BST_UNCHECKED) //센드메시지는 전에 보았다.. 찾아봐라 |
인자는 동일하다,,,, 굳이 설명할 필요가 없다 체크 메시지와 체크 상수만 알아보겠다.
BM_GETCHECK | 체크상태를 조사.. 리턴값으로 돌려진다 |
BM_SETCHECK | 체크상태 변경... wParam에 변경할 상태를 지정 |
BST_UNCHECKED | 체크안됨 |
BST_CHECKED | 체크됨 |
BST_INDETERMINATE | 아무것도 아닌상태 |
3. 라디오 버튼
체크박스 생성방법과 동일하다 다만, 생성할 때 3번째 인자..
즉, 속성을 BS_RADIOBUTTON 이나 BS_AUTORADIOBUTTON으로 변경해봐라...
일반과 오토의 차이점은 체크상태를 스스로 변경하는가, 그렇제 않는가의 차이이다..
4. 에디트
문자열을 입력받을때 사용하는 컨트롤이다...
#define ID_EDIT 100 CHAR str[128]; HWND hEdit; //에디트 컨트롤을 담을 핸들 case WM_CREATE: hEdit = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL, 10, 10, 200, 25, hWnd, (HMENU)ID_EDIT, g_hInst, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) case ID_EDIT: switch(HIWORD(wParam)) //하이워드에서 문자열 변경상태를 파악한다 case EN_CHANGE // 변경되었다면 GetWindowText(hEdit, str, 128); // 에디트 핸들에 써진것을 가져와서 SetWindowText(hWnd,str); // 윈도우 캡션바 이름을 바꾼다 |
별로 특별한 것은 없다. 스타일과 메시지에 대해서만 간단히 알아보겠다
ES_AUTO(H),(V)SCROLL | H는 수평, V는 수직 스크롤바가 생긴다 |
ES_MULTILINE | 여러 줄을 편집 |
ES_READONLY | 읽기전용으로 만든다 |
EN_CHANGE | 문자열이 변경되었을때 |
EN_(H), (V)SCROLL | H는 수평바 클릭시, V는 수직바 클릭시 |
EN_(KILL), (SET)FOCUS | KILL은 포커스를 잃었을때, SET은 포커스를 얻었을때 |
EN_UPDATE | 문자열이 변경되기 직전.... |
5. 리스트 박스
#define ID_LISTBOX 100
CHAR str[128]; HWND hListbox; //에디트 컨트롤을 담을 핸들 int i; case WM_CREATE: hListbox = CreateWindow("listbox", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_NOTIFY, 10, 10, 200, 250, hWnd, (HMENU)ID_LISTBOX, GetModuleHandle(0), NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) case ID_LISTBOX: switch(HIWORD(wParam)) //하이워드에서 리스트 선택 상태를 파악한다 case LBN_SELCHANGE // 변경되었다면 i = SendMessage(hListbox, LB_GETCURSEL, 0, 0); //현제 몇번째 셀인지 조사한다 //구현하고 싶은 내용 |
사용 방식이 거의 동일하다... 역시 속성과 메시지만 알아보겠다..
LBS_MULTIPLESEL | 여러개의 항목을 선택할 수 있다 |
LBS_NOTIFY | 목록중 하나를 선택했을때 부모 윈도우로 메시지를 날린다 |
LBS_SORT | 항목을 정렬한다 |
LB_(ADD), (DELETE) STRING | add는 문자열 추가, delete는 문자열 삭제 |
LB_GETCURSEL | 현재 선택된 항목의 번호를 얻어온다 |
6. 콤보박스
리스트박스와 거의 동일하다... 바뀌는 부분말 말하겠다..
listbox 부분을 combobox로 바꾸어준다... 속성을 CBS_DROPDOWN 으로 바꾸어 준다. 센드 메시지 안을 LB(리스트박스)에서 CB(콤보박스)로 바꾸어 준다.. 이러면 생성이 된다..
case WM_COMMAND:
switch(LOWORD(wParam)) case ID_LISTBOX: switch(HIWORD(wParam)) //하이워드에서 리스트 선택 상태를 파악한다 case CBN_SELCHANGE: // 변경되었다면 i = SendMessage(hListbox, CB_GETCURSEL, 0, 0); //현제 몇번째 셀인지 조사한다 //구현하고 싶은 내용 case CBN_EDITCHANGE: //구현하고 싶은 내용 |
난 간단히 하기 위해서 메시지 박스로 확인을 해봤다..
7. 스크롤 바
지금까지 컨트롤과는 조금 다르다..일단 생성은 동일하다
listbox 부분을 scrollbar로 바꾸어준다... 속성을 SBS_HORZ 으로 바꾸어 준다. ID값 변경은 센스다.
생성한 후 다음 코드를 입력 한다.
case WM_CREATE: //생성코드 SetScrollRange(hScroll, SB_CTL, 0, 255, TRUE); // 스크롤바 범위 셋팅 //첫번째 스크롤바핸들, 두번째 별도의 컨트롤 지정하겠다는 의미 //세번째 최소값, 네번째 최대값, 다섯번째 화면 재 출력여부 SetScrollPos(hScroll, SB_CTL, 0, TRUE); //스크롤바 스크롤의 초기 위치 지정 //나머진 동일하도 3번째가 초기 위치가 된다. return 0; case WM_HSCROLL: SetScrollPos((HWND)lParam,SB_CTL,TempPos,TRUE); |
8. 스태틱
간단한 컨트롤이다.... 에디트랑 비슷하며.... 글을 쓰는것이 아니라 저장된 글을 그냥 출력만 시키는 컨트롤이다..
CteateWindow("static", "넣고싶은텍스트", WS_CHILD | WS_VISIBLE, 20, 20, 120, 25, hWnd, (HMENU)-1, g_hInst, NULL); |