WPARAM과 LPARAM

MFC 2011. 4. 30. 10:58

WPARAM은 unsigned int 형이고, LPARAM은 unsigned long 형이다.

특징은, WPARAM는 주로 값들을 넘기는데 사용하고, LPARAM는 값들 뿐만 아니라 포인터를 넘겨줄 때 사용된다.

 

보통 window procedure 또는 callback function의 인자로, 먼저 나오는 wParam에 자주 쓰이는 정보를 기술하고, lParam에 추가 정보를 기술한다. 지금은 모두 32bit이므로 사용자가 정의하기 나름이다.

 

윈도우는 메시지 방식으로 프로그램이 진행된다. WPARAM나 LPARAM는 모두 MS에서 지정해 놓은 형식이다. 메시지를 보낼 때 추가로 부가적인 정보를 넣는 것이다. 구체적으로 어떤 정보인지는 아무도 모른다. 이것은 각 메시지마다 다르게 구성되어 있다는 것을 뜻한다.


WM_KEYDOWN을 사용한다면, MS에서 키다운 메시지에 대한 제어를 하고 싶을 땐 이것을 써라. 그리고 부가적인 정보에는 WPARAM와 LPARAM를 사용해라. WPARAM에는 Virtual Key정보를 주고 LPARAM에는 KeyData 정보를 넣을 것이니 구현은 사용자가 알아서 제어를 해라. 하는 것과 같다.

 

W : word

L : long

 

typedef UINT WPARAM;
typedef LONG LPARAM;

현재는 둘다 32bit 값을 갖는 데이터 타입이다. 그냥 unsigned int, long 이라 해도 상관은 없겠지만, 굳이 이름을 WPARAM, LPARAM이라 한 것은 예전 16bit OS 시절에 이름 붙인 것이 이어져 온 것이다. 당시는 WPARAM은 word 형 파라미터, LPARAM은 long 형 파라미터라는 뜻이어서, (여기서 word형은 2바이트, 참고로 dword(double word)형은 4바이트, byte형은 말그대로 1바이트) 그 때도 위처럼 typedef되었었다. 그런데 32bit OS로 오면서 int형이 4바이트가 되었다. 그런데 typedef은 그대로 두다보니 현재 WPARAM는 이름과는 다르게 4바이트를 갖는 형이되었다. 그러니까 지금은 WPARAM이나 LPARAM이나 4바이트를 갖는 데이터 타입이다. 참고로 windef.h를 보면 여러가지 데이터 타입이 typedef되어 있는 걸 볼 수 있다.

Posted by pkss
,

비트맵 파일 읽어들이기

CFileDialog fileDlg (TRUE, "*.*", "*.bmp", OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, "Bitmaps (*.bmp)|*.bmp||", this);

 if ( fileDlg.DoModal() == IDOK)
 {
 }

이미지파일 읽어들이기

char szFilter[] = "Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);
if(IDOK == dlg.DoModal()) {
        CString strPathName = dlg.GetPathName();
}

텍스트파일로 저장하기

CFileDialog SaveDlg(FALSE, NULL, "*.txt", OFN_OVERWRITEPROMPT,"TXT (*.txt)|*.txt||", this);
 

 if ( SaveDlg.DoModal() == IDOK )
 { 

      ... 

 }

 

CFileDialog의 2가지 사용법이에요.

 

explicit CFileDialog(
   BOOL bOpenFileDialog,
   LPCTSTR lpszDefExt = NULL,
   LPCTSTR lpszFileName = NULL,
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
   LPCTSTR lpszFilter = NULL,
   CWnd* pParentWnd = NULL,
   DWORD dwSize = 0
);
bOpenFileDialog : TRUE - 파일 열기, FALSE - 파일 저장
lpszDefExt : 기본 확장자입니다. 파일 이름에 확장자가 없으면 자동으로 추가됨.
lpszFileName : 대화상자가 열리면 파일 이름에 나타나는 파일이름 입니다.
dwFlags : 파라메터는 이곳에 가면 잘 정리 되어있어요.
OR 연산자(|)를 사용하여 2개이상 사용 가능합니다.

http://www.winapi.co.kr/reference/Structure/OPENFILENAME.htm

 

lpszFilter : 대화상자에 출력될 파일 확장자를 필터합니다.

 

pParentWnd : 부모윈도우 지정합니다.

 

dwSize : OPENFILENAME 구조의 크기 ( 위 링크된 싸이트 참조 )


출처 : http://blog.naver.com/tptptpjj?Redirect=Log&logNo=90108388523

Posted by pkss
,

MFC 를 사용하면서 이벤트를 등록하는 방법

(보통 View 클래스에 등록을 많이 하므로 기준을 View클래스에 두고 설명 한다.)

 

1.View클래스 헤더 파일에 #define WM_<이름> (WM_USER+숫자)

   이렇게 정의한다.

 


#define WM_SUN (WM_USER+2)

 

2. 헤더 상단 하단 부분의 DECLARE_MESSAGE_MAP 에 SendMessage가 호출하게 되는 afx_msg 함수를 정의한다.

 

protected:

//Generated message map functions

//{{AFX_MSG(CProgressBar_TWO)

 

   afx_msg LRESULT TestSUN(WPARAM,LPARAM);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

 

3.클래스의 cpp파일로 와서 상단의 BEGIN_MESSAGE_MAP에 함수와 이벤트를

연결한다.

 

BEGIN_MESSAGE_MAP(...,...)

//{AFX_MSG_MAP(...)

 

   ON_MESSAGE(WM_SUN,TestSUN)

 

//}AFX_MSG_MAP

END_MESSAGE_MAP()

 

4.함수를 정의한다.

 

LRESULT xxxView::TestSUN(WPARAM,LPARAM)

{

.....

}

 

위와 같은 방법으로 메세지를 추가하고 이벤트로 사용할 수 있다.

출처 : http://blog.naver.com/swblaster?Redirect=Log&logNo=80026741771
Posted by pkss
,