이번 회사 프로젝트 진행중 스레드 안에서 컨트롤을 생성해야 하는 일이 생겼는데
해결도 못하는 시스템 오류가 ㄷㄷㄷ....

결국 사용자 정의 메세지를 사용하기로 했습니다.

1. 메세지를 정의한다
:
 윈도우 자체적으로 WM_USER 라는 사용자가 정의해서 사용 할 수 있는 메세지가 있습니다.
 WM_USER+1, WM_USER+2 이렇게 사용합니다.
 그렇지만 좀더 멋드러지게 사용하고 싶다면...
#define WM_MY_MESSAGE     WM_USER+1

  
이렇게 정의해서 사용하시면 좀더 폼납니다. ^^;
메세지는 보통 따로 헤더파일을 연결해서 사용하기도 하고
전역적으로 사용하고 싶으면 StdAfx.h에 선언합니다.

2. 실제 사용할 윈도우 객체의 메세지 멤버함수를 정의합니다.
:

 
 //{{AFX_MSG(CThreadDlg)
 // Generated message map functions
virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnDestroy();
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 afx_msg void OnClose();
 //}}AFX_MSG
afx_msg LONG OnMyMessage(UINT wParam, LONG lParam);
 DECLARE_MESSAGE_MAP()

위에 보시면 헤당 .h 파일의 클래스 안에 선언해 줍니다.
//{{AFX_MSG(CThreadDlg)
...
//}}AFX_MSG
위 안에는 선언하지 마세요 주석으로 보이지만 이건 클래스 위져드가 사용하는
코드입니다. 여기 잘 못 선언해 주시면 클래스 위져드가 알아져 지우거나 위져드 상에서
다른 코드들이 안보이는 불상사가 발생합니다.
그래서 저 같은 경우는
//}}AFX_MSG 여기 다음줄에 선언해 줍니다.
그리고 .cpp 파일에 위에서 선언한 사용자 정의 함수를 정의해 줍니다.

3. .cpp 파일의 메세지 맵에서 연결해 줍니다.

BEGIN_MESSAGE_MAP(CThreadDlg, CDialog)
 //{{AFX_MSG_MAP(CThreadDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_WM_DESTROY()
 ON_WM_LBUTTONDOWN()
 ON_WM_CLOSE()
 //}}AFX_MSG_MAP
 ON_MESSAGE(WM_CREATEVS, OnCreateVS)
END_MESSAGE_MAP()

보시면 알겠지만 2번과 같이 여기도  //}}AFX_MSG_MAP 다음에 선언해주세요

4. 실제 사용은 SendMessage() 함수나, PostMessage() 함수를 이용해서 해주시면 됩니다.



  
posted by 뚱2