ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 버튼
    Win API/3. Control 2021. 3. 29. 10:45

    개발 환경 : Visual Studio 2008

    버튼을 하나 생성해서, 버튼이 클릭 되면 "클릭되었다"라는 메시지를 출력하는 프로그램을 만들어 보자.

     

    버튼도 하나의 윈도우이다. 다만, 자식 윈도우이다.

    그러므로 버튼의 생성은 CreateWindow함수를 이용한다.
    버튼이나, Text, 에디트 박스, 리스트 박스, 콤보박스 들은 전부 자식 윈도우 이다.

    즉, 컨트롤은 윈도우이기는 하지만 홀로 사용될 수 없으며, 부모 윈도우의 차일드로 존재해야 한다.

    차일드 컨트롤은 보통 부모 윈도우가 만들어 질때, 즉, WM_CREATE메시지가 발생했을 때 만든다.

    버튼을 생성한 후에 CreateWindow함수는 생성된 차일드 컨트롤의 윈도우 핸들을 리턴하는데,

    핸들이 필요한 경우 별도의 변수에 핸들값을 저장해 두면 된다.

    부모가 파괴될 때, 차일드는 자동으로 파괴되므로, 생성한 컨트롤은 일부러 파괴할 필요는 없다.


    먼저, 아래와 같이 열거형을 만들자. 열거형으로 둔 이유는 

    부모 윈도우에서 자식 윈도우인 버튼은 한 두개가 아닐 것이다.

     

    아래의 내용은 WinMain 함수로 기존의 내용에서 추가된 내용은 없다.

     

     

    1. WM_CWM_CREATE 메시지에서 자식윈도우( 버튼 )를 만들자.

     

    위의 WM_CWM_CREATE 메시지에서 호출한 두 함수에 대해 살펴보자.

    첫 번째

    위의 CreateWindow함수가 호출되면 맨 위쪽 좌측상단에 텍스트 형식처럼 나타나서 어떤 버튼인지에 대해

    설명 하기 위한 일종의 Label 이다.

    CreateWindow의 첫 번째 매개변수의 static은 텍스트를 의미한다.

    static은 윈도우즈 운영체제에서 제공해주며, 버튼 등은 자식 윈도우라고 했으므로, 부모윈도우는 hWnd이다.
    부모 윈도우 상에서 버튼이 생기는 것이므로, 부모 윈도우를 hWnd라고 해준다.

    그리고, x좌표 y좌표는 부모 윈도우 상에서의 좌표이다.
    부모 윈도우 창을 마우스로 드래그해서 움직이면 자식 윈도우 또한 같이 움직인다.

    컨트롤( 버튼, 에디트, 리스트 박스, 콤보 박스, 스크롤 바, 스태틱 )은 윈도우즈가 운영체제 차원에서 제공하기 때문에,
    윈도우 클래스를 등록할 필요없이 미리 등록되어 있는 윈도우 클래스를 사용하기만 하면 된다.

    두 번째

    위의 Button또한 윈도우즈 운영체제에서 제공하며, 위의 CHILD_BUTTON라는 매개변수로 이를 구분 짓는다.
    CHILD_BUTTON은 맨 위에 enum열거자로 지정 되었다.
    다른 추가할 버튼이 생기게 되면, enum에 CHILD_BUTTON1이라고 추가하면 된다.
    CreateWindow함수를 이용해 만들어 주면 된다.
    CreateWindow함수의 첫 번째 매개변수 Button은 버튼,체크,라디오를 의미한다.
    첫 번째 매개변수 Button은 만들고자 하는 윈도우의 윈도우 클래스이다.
    컨트롤은 운영체제에 의해 윈도우 클래스가 미리 등록되어 있으므로,

    별도로 등록할 필요없이 이 매개변수에 만들고자 하는 컨트롤의 윈도우 클래스명을 적어주면 된다.
    "button" 윈도우 클래스를 지정했으므로, 버튼이 만들어 질 것이다.
    대소문자는 구분하지 않는다. "BUTTON"이라고 적어도 상관없다.

    세 번째 매개변수에서 WS_VISIBLE은 윈도우 생성시 바로  표시를 의미하고

    BS_PUSHBUTTON은 누르는 버튼 스타일을 의미한다.
    8번째 인수는 컨트롤의 부모 윈도우를 지정하는데, 컨트롤은 차일드이므로, 반드시 부모 윈도우가 있어야 한다.
    첫 번째 매개변수의 "Button"이라고 적어주면, 윈도우 창에 Button이 버튼을 누를수 있는 형식으로 된다.
    실제로, 첫 매개변수를 "static"이라고 고쳐 적어주고 실행해 보면 안다.

     

     

    2. 버튼이 눌려진 경우의 처리

    버튼을 클릭했다거나, 에디트에 문자열을 입력했다거나 할 경우 부모 윈도우로 통지 메시지를 보내 

    어떤 사건이 발생했는지를 알린다.

    부모 윈도우는 차일드 컨트롤이 보내는 통지 메시지를 받아 적절한 처리를 해야 한다.
    버튼을 클릭할 경우, WM_COMMAND 메시지를 부모 윈도우에게 보낸다.
    부모 윈도우는 WM_COMMAND에서 LOWORD(wParam)값을 조사하여

    어떤 컨트롤이 눌러졌는지에 따라 적절한 처리를한다.

    WM_COMMAND 메시지는 프로그램 실행 중에 사용자가 메뉴 항목을 선택하면 발생한다.
    WM_COMMAND 메시지는 쉽게 말해서, 사용자로부터의 명령이 될 만한 것들을 모두 처리한다.
    이 때, 어떤 메뉴 항목이 선택되었는가는 wParam의 하위 워드로 전달되므로, LOWORD(wParam)를 읽어 판단함.
    WndProc에서는 WM_COMMAND메시지를 받을 경우 switch문으로 다시 LOWORD(wParam)의 값에 따라 분기를 하여
    각 메뉴 항목에 따른 처리를 수행한다. 

    메뉴 항목이 더 늘어난다면 WM_COMMAND의 switch문 안에 case만 계속 추가 해주면 된다.
    WM_COMMAND 메시지는 메뉴 항목을 선택할 때뿐만 아니라 단축키를 누를 때도 발생하며 또한
    버튼, 에디트 박스 등의 컨트롤이 부모 윈도우로 통지 메시지를 보낼 때도 발생한다.
    기억할 것은, 메뉴 선택시 WM_COMMAND 메시지가 전달되며,

    LOWORD(wParam)을 읽어 어떤 메뉴 항목이 선택되었는지를 판단할 수 있다.

    이 메시지 처리 함수의 매개변수인 hWnd는 이 메시지를 발생 시킨 윈도우 핸들을 의미힌다.

    LOWORD(wParam)의 의미는 Control ID 이다. Control ID는 어떤 자식 윈도우를 건드렸는지 알아보려고 한다.
    HIWORD(wParam)의 의미 State ID 이다. 사용자가 쓰지말아야 할 것을 썼을시에 State ID를 이용해서 찾아내야함.
    State ID를 예로 들면, 사용자에게 허용하지 않은 범위의 키 값을 받았을때, 이에 대한 예외처리를 할 때 쓴다.
    어떤 자식 윈도우를 건드렸는지 알아보기 위해서, switch case문을 써서 이에대한 처리를 해준다.
    switch case문으로 처리를 해주는 이유는 나중에, 버튼이 한 두개가 아닐 수도 있으므로.( 버튼 추가 시 )

    이에 대한 처리를 가능하게 만들기 위함이다.

     

     

    프로그램 실행결과

     

     

    소스 파일

    WinMain.cpp
    0.00MB

    'Win API > 3. Control' 카테고리의 다른 글

    컨트롤의 활용 - 1인 채팅방 만들기 ( 엔터 키, 탭 키, 스크롤 기능 )  (0) 2021.04.01
    콤보 박스  (0) 2021.04.01
    리스트 박스  (0) 2021.03.31
    에디트 박스  (0) 2021.03.31
    체크 박스  (0) 2021.03.31

    댓글

Designed by Tistory.