반응형

http://cafe.naver.com/bc6783232/1347




MFC 강의 - 4 컨트롤 다루기 -버튼


일단 처음은 대화상자 기반으로 만듭니다.(컨트롤을 만들고 배치하기 편하기 때문에...)
1.
처음에 생성되는 버튼들을 전부 지웁니다.

도구상자에 있는 버튼을 클릭해서

이렇게 가운데 하나를 배치하고 아래에 세 개를 배치합니다.

배튼 한 개씩 클릭해서 옆에 있는 속성창의 caption과 ID를 수정합니다.
순서는 달라고 되니까 ID와 CAPTION이 일치하도록 해주세요.

제목 바꾸기 - IDC_BUTTON_TITLE
숨기기        - IDC_BUTTON_SHOW
사용하지 못하게 함 - IDC_BUTTON_DISABLE

그 다음 MFC 클래스 마법사를 실행하면 (오른쪽 클릭 후 클래스 마법사항목 선택)
개체 ID와 메시지라는 항목이 나옵니다.
메시지 항목은 왼쪽의 클릭된 객체의 메시지(버튼이 클릭되었을 경우라던가...)입니다.
우리가 만들었던 버튼들 중 IDC_BUTTON_TITLE를 빼고 전부 BN_CLICKED메시지를 클릭하여 처리기를 추가합니다.
이렇게 하면 버튼들이 클릭되었을 때(이벤트) 운영체제에서 해당 버튼이 클릭 되었다는 메시지(BN_CLICKED)를 보내는 처리기(함수)를 설정해 주는 것 입니다.



코드 창을 보면 클래스의 메소드 3개가 추가되어있는 것을 확인할 수 있습니다.

그럼 우선 OnClickedButtonDisable()이란 함수를 수정해 보도록 하겠습니다.
"사용하지 못하게 함"이라 써져 있던 버튼이 클릭되어 있을 때 실행되는 메소드입니다.

void CMFC4Dlg::OnClickedButtonDisable()
{
//현재 버튼이 어떤 상태인지를 기억하기 위한 변수를 선언합니다. 함수가 종료더라도 상태
//은 기억되야 하므로 정적변수로 선언합니다.
//처음 실행될 때의 상태는 사용할 수 있으므로 true로...
static bool bEnable = true;
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
//누르면 상태가 바뀌어야 하므로 !연산자을 한 자기 자신을 대입합니다.
bEnable = !bEnable;
//GetDlgItem()은 해당 ID인 컨트롤인 클래스의 주소를 반환합니다. 클래스의 메
//소드를 이용하여 컨트롤의 상태를 조절할 수 있습니다.
//컨트롤 클래스의 메소드인 EnableWindow()는 bool변수를 인수로 가지며,
//true일 경우 버튼을 사용할 수 있게, false일 경우 버튼을 사용불가로 만듭니
//다.
GetDlgItem(IDC_BUTTON_TAGET)->EnableWindow(bEnable);
if(bEnable)
{
//SetWindowText()메소드는 버튼의 텍스트를 설정하는 메소트입니다.

GetDlgItem(IDC_BUTTON_DISABLE)->SetWindowText(_T("사용하지 못하게
                함"));
}
else
{
GetDlgItem(IDC_BUTTON_DISABLE)->SetWindowText(_T("사용하게 함"));
}
}
다음은 "숨기기"라 써져있던 버튼이 클릭되었을 때 실행되는 메소드를 수정해 보겠습니다.
OnClickedButtonShow이란 메소드입니다.

void CMFC4Dlg::OnClickedButtonShow()
{
static bool bShow=true;
bShow = !bShow;
GetDlgItem(IDC_BUTTON_TAGET)->ShowWindow(bShow);
if(bShow)
{
GetDlgItem(IDC_BUTTON_SHOW)->SetWindowText(_T("숨기기"));
}
else
{
GetDlgItem(IDC_BUTTON_SHOW)->SetWindowText(_T("보이기"));
}
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
내용은 거의 같습니다. 다만 EnableWindow(bEnable)이 아닌  ShowWindow(bShow)인데
인수가 true면 보이는 상태로 false면 보이지 않는 상태로 변경합니다.

이제 제목 바꾸기 라는 버튼이 클릭되었을 때 실행되는 메소드를 수정해 보겠습니다.
OnClickedButtonTitle이란 메소드 입니다.


void CMFC4Dlg::OnClickedButtonTitle()
{
static bool bTitle =true;
bTitle = !bTitle;
if(bTitle)
{
GetDlgItem(IDC_BUTTON_TAGET)->SetWindowTextW(_T("바뀌었다."));
}
else
{
GetDlgItem(IDC_BUTTON_TAGET)->SetWindowTextW(_T("실험체"));
}
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
참고로 버튼(컨트롤)의 상태를 변경하는 메소드가 Window라고 써져있는 이유는
사실 컨트롤들은 일종의 윈도창입니다. 자세한 것은 인터넷에 검색해 보시길...

반응형

+ Recent posts