[김재진][API]Dialog에서 Slider Componet를 사용하기

Programming/MFC 2010. 7. 13. 18:23 Posted by 알 수 없는 사용자
float g_fPos1 = 1; // Slider 수치값을 저장할 변수

// Dialog Callback Function Create
BOOL CALLBACK  DlgMapInfo(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
    switch(iMessage)
    {
    case WM_INITDIALOG:
        // SendMessage(GetDlgItem(hDlg, IDC_SLIDER1) Slider를 사용한 Wnd 값을 가져온다.
        // TBM_SETRANGE는 SLIDER Range 설정
        // MAKELPARAM(최소값, 최대치) 값을 설정한다.
        SendMessage(GetDlgItem(hDlg, IDC_SLIDER1), TBM_SETRANGE, false, MAKELPARAM(1, 10));
        // 위치값 설정 TBM_SETPOS
        SendMessage(GetDlgItem(hDlg, IDC_SLIDER1), TBM_SETPOS, NULL, 0);
        // Edit Component에 출력
        SetDlgItemInt(hDlg, IDC_EDIT1, (int)g_fPos1, true);
        // Dialogbox를 새로 고침
        InvalidateRect(hDlg, NULL, true);
        return true;

    // Slider Scoll 변경 Event 처리
    case WM_HSCROLL:
        // 실행된 윈도우 Handle 값을 가져와서 Slider Component의 값을 읽어온다.
        if((HWND)lParam == GetDlgItem(hDlg, IDC_SLIDER1))
        {
            // Slider Component 의 값을 읽어와 g_fPos에 저장
            // TBM_GETPOS : Slider의 위치값을 읽어온다.
            g_fPos1 = (float)SendMessage(GetDlgItem(hDlg, IDC_SLIDER1), TBM_GETPOS, 0, 0);
            // Edit Component 에 값을 입력한다.
            SetDlgItemInt(hDlg, IDC_EDIT1, (INT)g_fPos1 , FALSE);
            InvalidateRect(hDlg, NULL, true);
        }

        return true;
    case WM_DESTROY:
        EndDialog(hDlg, IDCANCEL);
        return true;
    }
    return false;
}

※ 주의사항 : Resource에 Dialog를 생성하고 그 안에 Slider Component를 생성한 후에 적용 시켜야 함.

'Programming > MFC' 카테고리의 다른 글

[서동권] MFC 메뉴 삭제하는 방법  (0) 2010.06.06
[장영수]MFC-Cimage  (1) 2010.05.27

[김재진]메모리 누수 확인 방법

Programming 2010. 7. 12. 13:00 Posted by 알 수 없는 사용자
header 추가

#ifdef _DEBUG
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif

WinMain() 함수에
_CrtDumpMemoryLeaks();
Function Call

위와 같이 실행 할 경우 Debug모드로 실행 후 종료 시  아래와 같은 메시지 출력된다.
Detected memory leaks!
Dumping objects ->
{57} normal block at 0x003E5D38, 36 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00
{56} normal block at 0x003E5BF0, 268 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
---------------------------------------------------------------------------------------
메 모리 누수 검출 방법

1. 함수를 이용한 메모리 누수 검색방법

영역표시된 부분(57)이 메모리 누수가 발생하는 프로그램 주소값이다. 이 주소 값을 이용하여
라는 함수 파라미터 값으로 주소 값을 입력하게 되면 메모리 할당 및 메모리 위치, 메모리 누수 위치는 중단점에서 멈추게 된다.

2. Visual Studio 에 있는 기능을 이용한 검색 방법


영역표시된 부분이 메모리 누적이 발생한 위치값이다.
이것을 Ctrl + B를 누르게 되면 새 중단점을 지정할 수 있다.



위와 같이 설정 후 확인을 누르게 되면 메모리 누수가 발생하는 곳에서 멈추게 된다.

※ 주의사항 : 이 중단점(Break Point)는 Visual Studio에서 표시가 이루어지지 않는다. 그렇기 때문에 설정된 중단점을 삭제하기 위해서는  모든 중단점 해제(ctrl + shift + F9)로 중단점 해제해야 한다.
그렇지 않으면 매번 디버그 할때마다 같은 지역에서 멈추게 된다.

난 .... 끝없이 나오더라 orz

[김재진] 카메라 시점 자동 설정

Programming/DirectX 2010. 7. 6. 17:01 Posted by 알 수 없는 사용자

카메라 시점 자동 설정(강제적으로 카메라를 Object를 바라 보도록 설정하기위한 방법)



Y값과 Z값은 0.1f 이상이어야 한다.
D3DXVECTOR3 DA = D3DXVECTOR3(0.0f, 0.1f, 0.0f); // Object 위치정보를 저장한 Vector Y값
m_fXAngle = D3DXVec3Dot(&DA, &m_vCameraPos);
zDA = D3DXVECTOR3(0.1f, 0.0f, 0.0f);                     // Object 위치정보를 저장한 Vector X값
m_fYAngle = -D3DXVec3Dot(&m_vCameraPos, &DA);

// D3DXToDegree : 값
// D3DXToRadian : 각도
// 회전값을 저장한 Quaternion변수에 Rotation값을 저장
D3DXQuaternionRotationYawPitchRoll( &m_qRotation
                                                     , D3DXToRadian(m_fYAngle)
                                                     , D3DXToRadian(m_fXAngle)
                                                     , 0.0f);
   

// 회전과 이동을 곱한 것을 m_qRotation을 행렬변수인 m_matOrientation로 변경
D3DXMatrixAffineTransformation(&m_matOrientation, 1.0f, NULL, &m_qRotation, &m_vCameraPos);

/* m_matOrientation을 m_matView에 반대값을 입력
    (카메라가 움직이는것이 아닌 월드행렬이 움직이는 것이기 때문에) */
D3DXMatrixInverse( &m_matView, NULL, &m_matOrientation );

단, 카메라의 위치가 Z축이 0.001보다 낮다면 X와 Y값의 변경 가중치 값을 변경해야 한다.
(0.5f 이상 변경해야함)

문제점 많은 오브젝트 시점 바라보게 만드는 코딩임...
해결할 사람 ㄱㄱㄱㄱ