본문 바로가기
[ Program ]/자체숙제프로젝트

1-4.나에게 윈도우메세지전송

by 관이119 2013. 12. 9.

 

일단 다른프로그램에게 메세지를 전송하기전에 나스스로에게 메세지를 전송하는것부터 해봅시다. 

 

 

 

일단 기존에 있던 메인화면에 버튼을 하나 추가해 봅시다.

왼쪽의 도구상자에서 버튼 드래그 해서 화면 위로 올리기만 하면 됩니다!

 

 

 

그럼 위와 같이 일단 버튼이 추가되었습니다.

 

 

이제 예쁘게 이름도 바꿔줘 봅시다.

오른쪽밑에 속성창에 캡션을 찾아봅시다.

 

 

그리고 캡션내용을 나에게 전송 이라고 바꿔줘 봅시다.

그럼 버튼위에 캡션도 그렇게 바뀝니다.

 

 

그리고 버튼이 추가 되었으니 이벤트도 연결 시켜 봅시다.

버튼에서 마우스 오른쪽으로 이벤트처리기 추가 창을 들어갑니다.

 

 

요런팝업창 이제 살짝 익숙해져 갑니다.

이왕 열린거 그냥 버튼을 누르지말고 무슨내용이 있는지도 한번 봅시다.

메세지 형식은 BN_CLICKED 인걸 봐서 버튼 클릭 메세지구나 라고 유추할수있습니다!

그리고 클래스 목록은 메인창 이름이 선택되어있군요

함수처리기이름은 저이름으로 이벤트를 처리할 함수가 생성된다고 생각해볼수 있겠군요

이제 추가및 편집을 눌러봅시다.

 

 

요렇게 다시 돌아 왔습니다.

 

 

요렇게 내용을 추가 해봅시다.

 

#define WM_TEST_MESSAGE WM_USER + 1

void CTestTransDlg::OnBnClickedButton2()
{
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

 SendMessage(WM_TEST_MESSAGE, 100, 200);
}

 

갑자기 이상한 내용을 적어놔서 놀라셨죠?

저도 많이 놀랐습니다~

SendMessage 는 윈도우 기본제공 함수입니다.

SendMessage,PostMessage 대충 찾아보니 두가지 정도 인듯한데 일단 저렇게 있구나 정도만 알고 넘어갑시다.

함수명만봐도 무슨내용일지 짐작이 갑니다!

메세지를 전송하겠다 라는 함수일거같군요

 

그런데 어디에?

 

WM_TEST_MESSAGE 에! 100 과 200 을!

 

그런데 WM_TEST_MESSAGE 는 난데없이 어디서 나온거지?

 

#define WM_TEST_MESSAGE WM_USER + 1

 

요부분입니다.

WM_TEST_MESSAGE 라는 이름으로 WM_USER + 1 을 정의 해 놓겠다!

그런데 WM_USER 에서 오른쪽 눌러 정의로 이동해보면 0x0400 이라고 되있습니다.

16진수인데 10진수로 바꾸면 1024가 됩니다.

윈도우에서 기존적으로 정의 되있는 상수인데 저숫자보다 작은것들은 기본적으로 윈도우 내부에서 사용하는 메세지 이기때문에 건드리면 안된다고 생각하시면 됩니다.

1024 +1 즉  WM_TEST_MESSAGE  라는 이름으로 1025 라는 상수를 정의했습니다.

그번호표를 단 데이터를 100 과 200 을 보냈습니다!

 

좀 복잡해졌습니다.

요약을 해봅시다!

-윈도우가 인식할수있는 1025라는 번호표를 달고있는 100과 200 데이터를 윈도우메세지로 전송했다.

요정도가 되겠군요

 

현재 번호표만 지정하고 대상을 지정하지 않았기 때문에 자기자신에게(현재 실행중인 프로그램에게) 던지게 됩니다.

 

참고로

윈도우 프로그램에서는 사용자를 위하여 0x0400 ~ 0x7fff 의 영역을 사용자 메시지 영역으로 제공한다.

라고 되어있군요 ( 0x0400 는 WM_USER 입니다.)

 

영역이 얼마나되는지 참고로 계산해봅시다.(16진수나오면 겁먹지 말고 계산도 할줄 알아야죠. 0x 붙은건 16진수라는걸 의미합니다.)

0x0400 = (16^2)*4 + (16^1)*0 + (16^0)*0 = (16*16)*4 + (16)*0 + (1)*0 = 1024

0x7fff = (16^3)*7 + (16^2)*f + (16^1)*f + (16^0)*f = (16*16*16)*7 + (16*16)*15 + (16)*15 + (1)*15 = 32767

이네요

 

 

좀전에 바꾼내용중에 #define WM_TEST_MESSAGE WM_USER + 1

요부분만 위쪽으로 올려줍시다.

선언이니까요~

정의하는 내용은 위로 올려서 같이 모아서 관리해줍시다.

 

 

이제 메세지를 보냈으니 받는 부분을 만들어봅시다.

오른쪽에 헤더파일중 TestTransDlg.h 요파일의 내용을 열어 봅시다.

메인창의 여러가지 내용이 선언되어있는 파일입니다.

저기서 Protected 에

LRESULT GetTestMessage(WPARAM wParam, LPARAM lParam);

요렇게 추가해줍시다.

GetTestMessage 라는 함수를 만들거다! 라고 미리정의 해놓은겁니다.

 

 

그리고 다시 소스파일로 돌아와서 위쪽부분에 보시면

 BEGIN_MESSAGE_MAP(CTestTransDlg, CDialogEx)

이라는 부분이 있습니다.

MESSAGE_MAP 은 그냥 간단하게 함수랑 위에서 우리가 달아준 이름표랑 연결하는 테이블이라고 생각하시면 됩니다.

내용을 잘살펴보시면

ON_BN_CLICKED(IDC_BUTTON2, &CTestTransDlg::OnBnClickedButton2)

요런식으로 우리가 이벤트 연결해준 내용도 다 정의 되있는걸 볼수 있습니다.

우리는 그냥 화면에서 마우스 오른쪽 눌러서 이벤트추가 해주면 저런식으로 내용이 생성 됩니다. 자동으로! 그런거였습니다!

아무튼 MESSAGE_MAP 안에 우리가 정의해준 WM_USER+1 과 이제 만들 GetTestMessage 라는 함수를 연결하겠다 라고 정의 해버립시다.

ON_MESSAGE(WM_TEST_MESSAGE, GetTestMessage)

요렇게요

 

 

그럼이제 GetTestMessage 라는 함수만 실제로 만들어 주면 되겠군요

 

LRESULT CTestTransDlg::GetTestMessage(WPARAM wParam, LPARAM lParam)
{

    // LM_TIPSSOFT_MESSAGE 메시지가 발생했을때 처리할 코드 작성...
    CString str;
    str.Format(_T("GetTestMessage 메시지를 받았습니다. ( wParam = %d, lParam = %d )"),wParam, lParam);
    MessageBox(str, _T("메시지 확인"), MB_OK);


    return 1;

}

 

요렇게 함수를 만들어 주고 실행하면

 

 

나에게 전송 버튼을 눌러주면 요렇게 나옵니다!

좀복잡했죠?

천천히 몇번읽어보면 감이옵니다!

요렇게 나에게 전송은 끝입니다~

댓글