ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 체크 박스
    Win API/3. Control 2021. 3. 31. 11:20

    아래의 글에서, 윈도우 창을 띄우는 소스를 가지고 와서 구현할 것이다.

    작업 환경은 Visual Studio 2008

    designatedroom87.tistory.com/122?category=892369

     

    프로젝트 생성 및 윈도우 창 띄우기

    Visual Studio 2019를 실행시킨다. 그리고 새 프로젝트 만들기를 선택한다. Windows 데스크톱 마법사를 선택한다. 적당한 프로젝트 이름을 정하고 만들기를 선택한다. 애플리케이션 종류는 데스크톱 애

    designatedroom87.tistory.com

     

    아래의 UI 모양이 여기에서 만들 내용이다.

     

     

    다음과 같이 열거자를 정의하고, 전역 변수를 선언한다.

    전역 변수가 필요한 이유는 체크 박스의 상태가 체크가 되어 있지 않은 상태에서 선택이 되면

    체크 상태로 만들어 줘야 하는데, 이 때 체크 박스의 현재 상태를 알고 있어야 하는데

    생성된 자식 윈도우를 알고 있으면 이를 처리할 수 있다.

    ( CheckBox와 3State CheckBox는 수동체크 박스이다. )

    그래서 이 전역 변수들은 각 생성된 자식 윈도우들을 저장할 변수들이다.

    CreateWindow함수의 리턴형이 HWND이므로 이 전역변수들의 자료형은 HWND여야 한다.

     

     

    WM_CREATE에서, 각 자식 윈도우들을 생성한다.

     

     

    여기까지만 만들고 실행시켜 보면 AutoCheckBox와 Auto 3State CheckBox만 체크 및 언 체크 기능이 된다.

    CheckBox와 3State CheckBox는 체크로 만들 수 없다.

    그래서 이 기능들을 만들기 위해서는 각 체크박스들의 정보를 알고 있어야 한다.

    그러므로, 위의 전역 변수를 통해 이 체크박스들의 정보에 접근하면 된다.

    먼저 맨 위의 체크박스의 기능부터 만들어 보자.

    두 가지 경우로 나눠서 생각하면 아래와 같다.

    (1). 현재 체크 박스의 상태가 체크 상태인 경우

    (2). 현재 체크 박스의 상태가 언체크 상태인 경우

    조건 (1)이면 언체크 상태로 변경하고 조건 (2)이면 체크 상태로 변경하면 된다.

    위의 내용을 구현학기 위해서는 SendMessage 함수와 PostMessage 함수를 이용하면 된다.

    이 두 함수에 대한 기본적인 설명은 아래와 같다.

    [SendMessage]
    LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    >SendMessage(메시지를 전달받을 윈도우 핸들, 전달할 메시지, 메시지의 부가정보, 메시지의 부가정보)
    설명 : 프로그램내에 특정 흐름을 인위적이나 강제적으로 만들어 내고 싶을 때, 사용.

            메시지 큐를 거치지 않고 메시지 핸들러 함수를 호출하여 바로 메시지를 보낸다.
            바로 일을 처리해야 할 때 사용하고 리스트 박스를 만들 때 항목을 추가할 경우 사용

    [PostMessage]
    LRESULT PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); 
    >PostMessage(메시지를 전달받을 윈도우 핸들, 전달할 메시지, 메시지 부가정보, 메시지 부가정보)
    설명 : 메시지 큐에서 메시지를 추가하는 함수

             급하지 않은 일을 처리할 때 사용한다.

     

     

    3State CheckBox의 기능을 만들어 보자.

    세 가지 경우로 나눠서 생각하면 아래와 같다.

    (1). 현재 체크 박스의 상태가 체크 상태인 경우

    (2). 현재 체크 박스의 상태가 언체크 상태인 경우

    (3). 현재 체크 박스의 상태가 INDETERMINATE 상태인 경우

    체크 박스의 INDETERMINATE 상태

    조건 (1)이면 INDETERMINATE 상태로 만들고,조건 (2)이면 체크 상태로 만들고 조건 (3)이면 언체크 상태로 만들면 된다.

    여기까지 작성하고 다시 실행하면 모든 체크박스들의 기능이 잘 작동함을 알 수 있다.

     

     

    소스 파일

    WinMain.cpp
    0.00MB

     

     

    이번에는 응용을 해보자.

    첫 번째 체크 박스가 체크되어 있다면 2,3,4 체크 박스의 기능이 가능하도록 하고

    만약 첫 번째 체크 박스가 체크가 해제 되어 있다면 2,3,4 체크 박스가 모두 체크 해제 상태로 만들자.

    위의 문제를 통해 아래의 문장을 이끌어 낼 수 있다.

    1번 체크박스가 언체크 상태에서는, 2번,3번,4번 체크박스는 체크 기능들이 불가능해진다. 

    즉, 1번 체크박스가 언 체크 상태에서는 2번,3번,4번 체크박스는 언 체크 상태로 유지가 되어야 한다.

    반대로 1번 체크박스가 체크 상태일 때는 2번,3번,4번 체크박스는 알아서 자신들의 기능을 수행하면 된다.

    구현에서 먼저 해야할 작업은 첫 번째 체크박스에서 현재 체크박스가 체크 상태에서 언 체크 상태로 변경될 때,

    나머지 2,3,4 체크 박스의 상태를 모두 언 체크 상태로 변경되도록 하자.

     

     

    그리고 2번 체크 박스는 AutoCheckBox 이다.

    이 체크 박스는 1번 체크 박스와 마찬가지로 기능이 체크 상태와 언 체크 상태 이렇게 2가지 상태만 가지고 있다.

    위의 첫 번째 체크 박스를 살펴보면, 기본적으로 첫 번째 체크 박스가 언 체크 상태라면

    나머지 2,3,4번 체크 박스는 그 상태가 모두 언 체크 상태로 유지되는 것은 변함없는 사실이므로

    ( 1번 체크 박스가 언 체크인 상태에서는 나머지 모든 체크 박스의 상태는 언 체크 상태이다. )

    첫 번째 체크 박스가 언 체크 상태이면 2번 체크 박스의 상태를 항상 언 체크 상태로 유지하면 된다.

    즉, 첫 번째 체크 박스가 언 체크 상태일 때,

    2번 체크 박스를 계속 클릭해도 이를 언체크 상태로 유지하면 체크가 되지 않는다.  

     

     

    3번 체크 박스는 3State CheckBox 이다.

    이 체크 박스는 체크 상태와 언 체크 상태 그리고 흐릿한 상태 이렇게 3가지 상태가 있다.

    1번 체크 박스가 체크 상태일 때만, 이 3번 체크 박스의 기능이 동작하도록 예외 처리를 해주면 된다.

     

     

    4번 체크 박스는 Auto 3State CheckBox 이다.

    4번 체크 박스는 2번 체크 박스의 내용과 같다.

    첫 번째 체크 박스가 언 체크 상태이면, 4번 체크 박스의 상태를 항상 언 체크 상태로 유지하면 된다.

     

     

    소스 파일

    WinMain.cpp
    0.01MB

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

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

    댓글

Designed by Tistory.