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)  //센드메시지는 전에 보았다.. 찾아봐라
   {                          //체크 확인 메시지            // 체크 되있지 않다면
    draw = TRUE;
    SendMessage(c1, BM_SETCHECK, BST_CHECKED, 0); // 체크박스로 다시 보내 체크 하도록 요구한다
   }                          // 변경               // 체크상태
   else
   {
    draw = false;
    SendMessage(c1, BM_SETCHECK, BST_UNCHECKED, 0);
   }                                                   //비체크상태
   InvalidateRect(hWnd, &rt, true);   //이것도 전에 보았다.
   break;

인자는 동일하다,,,, 굳이 설명할 필요가 없다 체크 메시지와 체크 상수만 알아보겠다.

 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);
   SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM)"aaa");   //문자열 추가, 엘파람 으로 문자가 넘어간다.
   SendMessage(hListbox, LB_ADDSTRING, 0, (LPARAM)"BBB");  //문자열 추가

 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:
 if ((HWND)lParam == hRed) TempPos = Red;
  switch (LOWORD(wParam)) {
   case SB_LINELEFT:
    TempPos=max(0,TempPos-1);
    break;
   case SB_LINERIGHT:
    TempPos=min(255,TempPos+1);
    break;
   case SB_PAGELEFT:
    TempPos=max(0,TempPos-10);
    break;
   case SB_PAGERIGHT:
    TempPos=min(255,TempPos+10);
     break;
   case SB_THUMBTRACK:
    TempPos=HIWORD(wParam);
     break;
}
if ((HWND)lParam == hRed) Red=TempPos;

SetScrollPos((HWND)lParam,SB_CTL,TempPos,TRUE);
InvalidateRect(hWnd,NULL,FALSE);
return 0;


8. 스태틱

 간단한 컨트롤이다.... 에디트랑 비슷하며.... 글을 쓰는것이 아니라 저장된 글을 그냥 출력만 시키는 컨트롤이다..

CteateWindow("static", "넣고싶은텍스트", WS_CHILD | WS_VISIBLE, 20, 20, 120, 25, hWnd, (HMENU)-1, g_hInst, NULL);


신고
Posted by 나비 나비:D

● 컨트롤을 윈도우에 그려질려면 CreateWindow() 함수를 호출 해야한다.


CreateWindow() 함수


CreateWindow( "만들 컨트롤", "컨트롤에 나타날 문자", 컨트롤 속성, 시작할 X좌표, 시작할 Y좌표,

           , 컨트롤 폭, 컨트롤 높이, 나타낼 윈도우 핸들, (HMENU) 컨트롤 ID

           , 컨트롤을 만드는 인스턴스의 핸들 , 사용자 정의 데이터);


ex)

※ 버튼 생성

HWND hButton;


hButton = CreateWindow("button","Click",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON

             , 20, 20, 100, 25, hWnd, (HMENU)0, g_hInst, NULL);


※ 에디트박스 생성

HWND hEdit;


hEdit = CreateWindow("eidt", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER

          | ES_AUTOHSCROLL, 10, 10, 200, 25, hWnd, (HMENU)ID_EDIT, g_hInst, NULL);


※ 리스트 박스 생성

HWND hList;


hList = CreateWindow("listbox", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER

          | LBS_NOTIFY, 10, 10, 100, 200, hWnd, (HMENU)ID_LISTBOX, g_hInst, NULL);


※ 컴보 박스 생성

HWND hCombo;


hCombo = CreateWindow("combobox", NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOW

               , 10, 10, 100, 200, hWnd, (HMENU)ID_COMBOBOX, g_hInst, NULL);


※ 스크롤 바 생성

HWND hScroll;


hScroll = CreateWindow("scrollbar", NULL, WS_CHILD | WS_VISIBLE | SBS_HORZ

             , 10, 10, 200, 20, hWnd, (HMENU)ID_SCROLL, g_hInst, NULL);


※ 스태틱 생성

HWND hStatic;


hStatic  = CreateWindow("static", "Only Text", WS_CHILD | WS_VISIBLE

              , 10, 10, 100, 24, hWnd, (HMENU)-1, g_hInst, NULL);


신고
Posted by 나비 나비:D

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
----------------------------- (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

글 보관함

달력

«   2017/08   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
Total : 870,086
Today : 41 Yesterday : 412