보통 class 안에서 선언된 callback함수는 접근이 안된다.
class T
{
public:
         void CALLBACK test();
}

보통 이렇게 되어 있다고 하면 접근을 하기 위해서 static을 붙여주기도 한다.
class T
{
public:
         static void CALLBACK test();
}



하지만... callback함수 안에서 다시 class 안에 있는 멈버 변수에 접근을 하지 못하게 된다.

내가 해결한 방법으로는
class 안에서 class 변수를 static으로 선언을 해주어서는 this 포인터로 접근하였다.

class T
{
private:
         static T*  m_pInstance;
public:
         void CALLBACK test();
}

생성자에서는
T::T(void)
{
        m_pInstance = this;
}

그리고 마지막으로 전역변수로
T* T::m_pInstance = NULL;


이렇게 하면 callback함수 안에서 class 암에 있는 멤버 변수에 접근이 가능하게 된다.
void CALLBACK T::test()
{
       m_pInstance->변수이름;
       m_pInstance->함수;
}

'C / C++ > WIN32 / MFC' 카테고리의 다른 글

Screen Capture / C++  (0) 2007.09.17
간단하게 만들어 보는 이미지 뷰어(ImageViewer)  (2) 2007.07.16

Screen Capture는 비교적 하는 방법은 간단하다.

아래는 스크린의 내용을 CBitmap 객체에 Attach 하는 함수이다.


void CScreenCaptureDlg::OnBnClickedBtnCapture()
{
    int nScreenWidth, nScreenHeight;


    // 스크린의 넓이와 높이를 받아오는 부분.

    nScreenWidth  = GetSystemMetrics(SM_CXSCREEN);
    nScreenHeight = GetSystemMetrics(SM_CYSCREEN);


    // Desktop의 DC를 얻어오는 곳이다.

    HDC hScreen = ::GetDC(NULL);

   // 스크린의 내용을 그릴 메모리 DC를 생성한다.
    HDC hMem = ::CreateCompatibleDC(hScreen);

 

    // 입력받은 DC의 Compatible DC에 이미지를 주어진 넓이와 높이로 생성한다.
    HBITMAP hbitmap = CreateCompatibleBitmap(hScreen,
                                             nScreenWidth,
                                             nScreenHeight);

 

   // 메모리 DC에 이미지를 그리기 위해 Bitmap Gdi Object를 선택한다.

    HGDIOBJ oldBitmap = ::SelectObject(hMem, hbitmap);

 

   // 메모리 DC에 스크린 이미지를 그린다.
   ::BitBlt(hMem, 0, 0, nScreenWidth, nScreenHeight, hScreen, 0, 0, SRCCOPY);
   

    // 이 뒷부분은 단지 리소스를 해지하기 위한 소스코드이다.

    ::SelectObject(hMem, oldBitmap);

    ::ReleaseDC(NULL, hScreen);
    ::DeleteDC(hMem);


    // 이전의 Bitmap 객체를 없엔다.

    if (m_bmpScreen.GetSafeHandle())
        m_bmpScreen.DeleteObject();


    // 캡춰된 Bitmap Handle을 CBitmap Object에 Attach한다.

    m_bmpScreen.Attach(hbitmap);


    // 캡춰받은 이미지를 WM_PAINT Message가 발생할때 처리하기 위해 클라이언트 영역을 무효화 시킨다.
    Invalidate();
}

1. MFC Application 생성

    Application Type
        Single document, Document/View architecture support
 uncheck
    User Interface Features
        Thick frame, Initial status bar, System menu(
저는 귀찮아서 이것도 삭제) uncheck
   
2. Stdafx.h
파일을 열고 마지막 줄에 다음 추가

    #include "atlimage.h"

3. ChildView.h
파일을 열고 CChildView class 속성에 다음 추가

    CImage image;
    CString sFilename;
   
4. ChildView.cpp
파일을 열고 생성자에 다음 추가

    sFilename = L"";
   
5. Resource view
창에서 Menu 항목의 IDR_MAINFRAME  더블 클릭하고 File 메뉴 아래 Open... 메뉴 추가

6. Open...
메뉴 오른 클릭해서 Event handler 추가 선택, CChildView 추가한다.

7. CChildView::OnFileOpen() (
방금 추가한 Event handler)  다음 추가

    // Get image file name
    char szFilter[] = "Image Files(*.BMP, *.GIF, *.JPG, *.PNG) | *.BMP;*.GIF;*.JPG;*.PNG | All Files(*.*)|*.*||";
    CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);
    if(IDOK != dlg.DoModal()) return;
    CString sFilename = dlg.GetPathName();

    // Detaches the bitmap from the CImage object and destroys the bitmap if image already loaded
    if ( !image.IsNull() )
        image.Destroy();
    image.Load(sFilename);
    Invalidate();
    UpdateWindow();
   
8. CChildView::OnPaint()
 //TODO 아래에  다음 추가

    // Draw image if a source bitmap is currently loaded
    if ( !image.IsNull() ) {
        image.Draw(dc.m_hDC, 0, 0);
    }

9. 실행

+ Recent posts