Dialog 에서 Enter 또는 ESC 키를 눌렀을 때, 오작동 하거나 프로그램이 종료되어 버리는 문제를 해결.

 

Dialog 클래스 선택 -> 속성에서 ->재정의 아이콘 선택 ->preTranslateMessage 함수 재정의

 

 

 

생성된 가상 함수에 아래처럼 코드를 추가한다.

//////////////////////////////////////////////////////////////////////////////////////////////
// Enter , ESC 버그 (종료 방지)
//////////////////////////////////////////////////////////////////////////////////////////////
//
BOOL CSHM_PCcode_ver2Dlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
        return TRUE;
    }

return CDialogEx::PreTranslateMessage(pMsg);

}

아래 그림 순서대로 하면 클래스 뷰에서 클래스가 추가되고

cpp 파일과 h파일이 생성된 것을 알 수 있다.

생성된 헤더 파일을

Dalog 클래스 등에서 include 하고 사용하면 된다.

 

 

 

 

 ++연산자를 사용하여 포인터 증가 / 감소

출처 : C언어 입문, 성윤정 저 (대림)

 

배열을 선언과 동시에 초기화 할때..

array[100]={0};   -----(x)

array[100]={0,}; -----(o)

/    :주석 처리/해제

alt+f8 : 줄 맞추기

ctl+l : 줄 지우기

원래 thread 함수 내부에서는 Updatedata를 사용할 수 없다.
하지만 Dlg클래스에 사용자 메시지를 등록하여
thread 함수에서 이에 접근하는 방법으로 사용가능하다.

 

1. 다음과 같이 Dialog class에 멤버함수로 UpdateData를 실행하는 함수를 만들어 준다.

LRESULT ___Dlg::OnUpdateDataFalse(WPARAM wParam, LPARAM lParam)
{
     return UpdateData(FALSE);
}


LRESULT ___Dlg::OnUpdateDataTrue(WPARAM wParam, LPARAM lParam)
{
     return UpdateData(TRUE);
}

 


2. stdafx.h 에 사용할 사용자 정의 메시지를 정의한다.

//사용자 정의 메시지
#define UM_UPDATEDATAFALSE (WM_USER+1)  //thread 에서 updatedata를 사용하기 위한 사용자 message
#define UM_UPDATEDATATRUE (WM_USER+2)

 

3. ___Dlg.cpp 의
   BEGIN_MESSAGE_MAP 에
   정의한 사용자 메시지를 등록해 준다.

BEGIN_MESSAGE_MAP(.......(생략) )
.......(생략)
 ON_MESSAGE(UM_UPDATEDATAFALSE, OnUpdateDataFalse) //thread 에서 updatedata 를 사용하기 위한 사용자메시지 처리
 ON_MESSAGE(UM_UPDATEDATATRUE, OnUpdateDataTrue)  //thread 에서 updatedata 를 사용하기 위한 사용자메시지 처리

END_MESSAGE_MAP()

 

4. thread를 시작할 때 현재 Dialog의 핸들을 인수로 넘겨주면서 시작한다.
   (-> 작업자 thread 함수는 전역 함수이므로(dialog의 멤버 함수가 아님))
   (-> Dialog class 의 멤버들을 사용할 수 있게 하기 위함.)

  AfxBeginThread(thread작업함수이름,this);

 

5. thread작업함수 에서 dialog class 의 멤버들을 가져다 쓰기위한 pointer 를 선언/할당 한다.

UINT ThreadDataSave(LPVOID pParam)
{
   ___Dlg* pDlg = (___Dlg*)pParam;

   ...(생략)
}

 

6. thread 에서 dialog class의 메시지에 접근하여 updatedata 를 실행한다.

UINT ThreadDataSave(LPVOID pParam)
{
   ___Dlg* pDlg = (___Dlg*)pParam;

   ...(생략)
   pDlg->PostMessage(UM_UPDATEDATAFALSE);
   pDlg->PostMessage(UM_UPDATEDATATURE);
}



threadingbuildingblocks(TBB dubug .dll .lib) 가 필요한 경우
아래에서 최신 win용 파일을 다운 받는다.
http://threadingbuildingblocks.org/ver.php?fid=174

해당 파일을 압축을 풀고
\tbb40_233oss\bin\ia32\vc10  에 있는   (32bit , visual studio 10 의 경우)
\tbb40_233oss\bin\intel64\vc10 에 있는 (64bit , visual studio 10 의 경우)

tbb_debug.dll
tbb.dll
두 파일을
해당 프로젝트의 폴더(debug, release 폴더가 있는 폴더)
또는 system32에 복사해주면 된다.

참고 출처 : moorim21 님의 블로그
http://blog.naver.com/PostView.nhn?blogId=moorim21&logNo=80139961251


opencv_calib3d231d.lib
opencv_contrib231d.lib
opencv_core231d.lib
opencv_features2d231d.lib
opencv_flann231d.lib
opencv_gpu231d.lib
opencv_haartraining_engined.lib
opencv_highgui231d.lib
opencv_imgproc231d.lib
opencv_legacy231d.lib
opencv_ml231d.lib
opencv_objdetect231d.lib
opencv_ts231d.lib
opencv_video231d.lib


------------------------
opencv_calib3d231d.lib
opencv_contrib231d.lib
opencv_core231d.lib
opencv_features2d231d.lib
opencv_flann231d.lib
opencv_gpu231d.lib
opencv_haartraining_engined.lib
opencv_highgui231d.lib
opencv_imgproc231d.lib
opencv_legacy231d.lib
opencv_ml231d.lib
opencv_objdetect231d.lib
opencv_ts231d.lib
opencv_video231d.lib

+ Recent posts