[MFC] LRESULT CALLBACK 전역변수 사용법좀 알려주세요.
안녕하세요.
MFC로 캠 영상을 띄어주고 그 영상위에 선을 그려주었습니다.
그런데 선을 실시간으로 계속 좌표값을 받아서 이동해주고싶은데,
좌표값을 전역변수로 선언을 해주었는데
LRESULT CALLBACK 함수에서 받아들이지를 못하네요.
소스 설명입니다.
LRESULT CALLBACK VideoCallbackProc(HWND, LPVIDEOHDR);
영상위에 선을 그린소스는 요함수 안에 들어있어요.
저함수는
class CNumber_DecodeDlg : public CDialog
{
public:
static LRESULT CALLBACK VideoCallbackProc(HWND, LPVIDEOHDR);
}
요렇게 static으로 정의를 해주었습니다.
BOOL CNumber_DecodeDlg::OnInitDialog()
{
capSetCallbackOnVideoStream(m_hCamWnd, VideoCallbackProc);
capSetCallbackOnFrame(m_hCamWnd, VideoCallbackProc);
}
여기서 콜백함수로 호출을 합니다.
LRESULT CALLBACK CNumber_DecodeDlg::VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
내용
}
이안에 함수에서 전역변수의 값을 받아오고싶은데,
error C2597: illegal reference to data member 'CNumber_DecodeDlg::Point_x' in a static member function
이러한 에러가 발생합니다.
static을지우면 에러가나고, 다른걸로 바꿔도 에러가 납니다.
this-> 포인터를 사용해서 받아오려고 시도했으나,, 지식부족으로 못하였습니다.
자세한 설명방법부탁드립니다.
유사한걸 어떤분도 하셨네요. ㅇ_ㅇ'''
http://seohyun0903.blog.me/120127865761
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
밑에 익명글 영상위에 선그리는게 제가
밑에 익명글 영상위에 선그리는게 제가 올린질문인데,
찾아보니 VFW방식으로 영상을 띄어서 하는 방법이더라구요.
그렇게 해서 위와같은결과가 나왔는데, 좌표값의 위치를 변수로 받아서
실시간으로 선을 그려주려고 합니다..
자세한 설명방법 부탁드립니다.
아주 간단하게는..
그냥 전역변수로 해주면되긴 할거에요..
그냥 소스코드 위에 C언어에서 하듯이 전역변수 사용하시면되요..
MFC 가 OOP 이긴하지만 C의 문법을 사용해도 됩니다.
LRESULT CALLBACK
LRESULT CALLBACK CNumber_DecodeDlg::VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr, int value)
이런식으로 말인가요?
마지막에 int형으로 넘겨주는것도 해보았는데, 에러는 없지만
보내주는건 int형으로 50이라든지 정수를 보내주게 되면
받아들이는 값이 0을 받습니다.
대체 왜이럴까요...
고수님들제발 도와주세요~
흠....
콜백함수 내의 변경된 값을 다른 함수내에서 받아올 때 초기선언한 값이 불러들여지지는 않을까요(변경된 값을 불러와야 하는데 말이죠 흑..)
질문이요
콜백함수 안에 코딩 작성할때 BMINFO를 꼭 이용해서 코딩을 해야 하나요?
저 같은 경우는 다른 책에 있는 다른 DIB란 클래스를 이용해서 영상을 받아오고 있어서요
이거 참고해보세요.
설명할게 너무 많네요. ㅡ_ㅡ;;
가장 중요한건. 비트맵과 RGB를 이해하는거예요. 책 보시면 잘 나옵니다.
그 밖에 다른 방법이 있다면... 아래와 같습니다.
- 첨부된 파일 소스를 보시면서 구현 방식을 참고해 보세요.
- WinAPI 관련 도서나 영상처리 관련 도서를 보시면. BITMAP 관련 내용이 있습니다.
- 네이버에 HBITMAP. CBitmap. BITMAPINFO 로 검색해보시면 좀 더 전문적인 다양한 내용이 나옵니다.
- MSDN을 참고해보세요.
http://msdn.microsoft.com/ko-kr/library/z5731wbz(v=VS.80).aspx
비트맵 이미지에 대한 강좌가 데브피아에 있을겁니다.
비트맵. bitmap 찾아보세요.
http://www.devpia.com/Maeul/Contents/List.aspx?BoardID=51&MAEULNo=20
http://www.winapi.co.kr/
제21장 비트맵
가.비트맵의 종류
DIB. DDB 구조보세요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
제가 보기엔 해당 콜백 함수 구현에 문제가 있는듯 합니다.
일단 비디오 처리와 직접적 관계는 없는 상황인듯 하고요
error C2597: illegal reference to data member 'CNumber_DecodeDlg::Point_x' in a static member function
요거는 결국
LRESULT CALLBACK CNumber_DecodeDlg::VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
이 스태틱 콜백함수 안에서 스태틱이 아닌 멤버(Point_x)를 참조한다는 뜻이거든요. 말씀 그대로 스태틱 함수에서는 스태틱이 아닌 멤버를 참조해선 안됩니다. 굳이 필요하면 포인터를 어딘가 저장했다가 사용하는 수밖에 없습니다.
그리고 맨 끝에 int를 붙였을때 0(또는 기타 쓰레깃값)이 넘어오는건 당연합니다. 콜백함수의 프로토타입과 일치하지 않기 때문에 해당 값이 잘리는 거죠. 콜백 함수 호출은 아마도 비디오 라이브러리가 할테고 그부분 소스는 변경할 수 없을테니..
자세한 구현상황은 알 수가 없지만, 일단 혹시 저 hWnd값이 CNumber_DecodeDlg객체에 1:1대응하고 유니크하다면 HWND와 CNumber_DecodeDlg 포인터간의 맵을 만들어서 사용하는 방법을 생각해볼 수 있겠습니다. HWND가 아니고 LPVIDEOHDR가 유니크하다면 그걸 가지고 맵을 만들수도 있겠죠. 아니면 두 값의 컴비네이션으로..
콜백함수의 본체를 같이 올려주시면 좀더 자세한 답변이 가능할듯 합니다.
--
댓글 달기