본문 바로가기

Windows/MFC

ImageView 이미지

[code]
// ImageView.cpp : implementation of the CImageView class
//

#include "stdafx.h"
#include "Image.h"

#include "ImageDoc.h"
#include "ImageView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CImageView

IMPLEMENT_DYNCREATE(CImageView, CView)

BEGIN_MESSAGE_MAP(CImageView, CView)
    //{{AFX_MSG_MAP(CImageView)
    ON_COMMAND(ID_IMAGE_CENTER, OnImageCenter)
    ON_COMMAND(ID_IMAGE_STRETCH, OnImageStretch)
    ON_COMMAND(ID_IMAGE_TILE, OnImageTile)
    ON_UPDATE_COMMAND_UI(ID_IMAGE_CENTER, OnUpdateImageCenter)
    ON_UPDATE_COMMAND_UI(ID_IMAGE_STRETCH, OnUpdateImageStretch)
    ON_UPDATE_COMMAND_UI(ID_IMAGE_TILE, OnUpdateImageTile)
    ON_COMMAND(ID_IMAGE_DESKTOP, OnImageDesktop)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageView construction/destruction

CImageView::CImageView()
{
    m_Type = CENTER;
}

CImageView::~CImageView()
{
}

BOOL CImageView::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Modify the Window class or styles here by modifying
    // the CREATESTRUCT cs

    return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageView drawing

void CImageView::OnDraw(CDC* pDC)
{
    CImageDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    switch(m_Type)
    {
    case CENTER: // 비트맵을 중앙에 출력한다.
        CenterImage(pDC);
        break;
    case TILE: // 비트맵을 바둑판 모양으로 출력한다.
        TileImage(pDC);
        break;
    case STRETCH: // 비트맵을 클라이언트 영역에 맞게 출력한다.
        StretchImage(pDC);
        break;
    }
}

/////////////////////////////////////////////////////////////////////////////
// CImageView diagnostics

#ifdef _DEBUG
void CImageView::AssertValid() const
{
    CView::AssertValid();
}

void CImageView::Dump(CDumpContext& dc) const
{
    CView::Dump(dc);
}

CImageDoc* CImageView::GetDocument() // non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDoc)));
    return (CImageDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CImageView message handlers

void CImageView::CenterImage(CDC * pDC)
{
    CBitmap myBit, *pOldBit;
    CDC     memDC;
    BITMAP bm;

    myBit.LoadBitmap(IDB_IMAGE);
    myBit.GetObject(sizeof(BITMAP), &bm);

    memDC.CreateCompatibleDC(pDC);
    pOldBit = memDC.SelectObject(&myBit);

    CRect rc;
    GetClientRect(rc);
    int x = (rc.Width()-bm.bmWidth)/2;    
    int y = (rc.Height()-bm.bmHeight)/2;

    pDC->BitBlt(x, y, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(pOldBit);
}

void CImageView::TileImage(CDC * pDC)
{
    CBitmap myBit, *pOldBit;
    CDC     memDC;
    BITMAP bm;

    myBit.LoadBitmap(IDB_IMAGE);
    myBit.GetObject(sizeof(BITMAP), &bm);

    memDC.CreateCompatibleDC(pDC);
    pOldBit = memDC.SelectObject(&myBit);

    CRect rc;
    GetClientRect(rc);
    int x, y;

    for(y = 0; y < rc.bottom; y += bm.bmHeight)
        for(x = 0; x < rc.right; x += bm.bmWidth)
            pDC->BitBlt(x, y, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);

    memDC.SelectObject(pOldBit);
}

void CImageView::StretchImage(CDC * pDC)
{
    CBitmap myBit, *pOldBit;
    CDC     memDC;
    BITMAP bm;    

    myBit.LoadBitmap(IDB_IMAGE);
    myBit.GetObject(sizeof(BITMAP), &bm);

    memDC.CreateCompatibleDC(pDC);
    pOldBit = memDC.SelectObject(&myBit);

    CRect rc;
    GetClientRect(rc);
    int x = rc.Width(); // 클라이언트 영역의 폭
    int    y = rc.Height(); // 클라이언트 영역의 높이

    pDC->StretchBlt(0, 0, x, y, &memDC,
        0, 0, bm.bmWidth, bm.bmHeight, SRCINVERT);

    memDC.SelectObject(pOldBit);
}

void CImageView::OnImageCenter()
{     // ID_IMAGE_CENTER로 정의된 메뉴 항목이나 툴바 버튼을 선택한 경우
    m_Type = CENTER; // 비트맵을 중앙에 배치
    Invalidate();
}

void CImageView::OnImageTile()
{     // ID_IMAGE_TILE로 정의된 메뉴 항목이나 툴바 버튼을 선택한 경우
    m_Type = TILE; // 비트맵을 바둑판 모양으로 배치
    Invalidate();
}

void CImageView::OnImageStretch()
{     // ID_IMAGE_STRETCH로 정의된 메뉴 항목이나 툴바 버튼을 선택한 경우
    m_Type = STRETCH; // 비트맵을 클라이언트 영역 크기에 맞게 배치
    Invalidate();
}

void CImageView::OnUpdateImageCenter(CCmdUI* pCmdUI)
{
    pCmdUI->SetCheck(m_Type == CENTER);    
}

void CImageView::OnUpdateImageTile(CCmdUI* pCmdUI)
{
    pCmdUI->SetRadio(m_Type == TILE);    
}

void CImageView::OnUpdateImageStretch(CCmdUI* pCmdUI)
{
    pCmdUI->SetCheck(m_Type == STRETCH);    
}


void CImageView::OnImageDesktop()
{
    // NULL값을 지정하면 데스크탑(바탕화면)에
    // 대한 DC가 얻어진다.
    CClientDC dc(NULL);
    CBitmap myBit, *pOldBit;
    CDC     memDC;
    BITMAP bm;

    myBit.LoadBitmap(IDB_DIRECTX);
    myBit.GetObject(sizeof(BITMAP), &bm);

    memDC.CreateCompatibleDC(&dc);
    pOldBit = memDC.SelectObject(&myBit);

    dc.BitBlt(20, 20, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(pOldBit);
}
[/code]

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

Bible ADODB Connect  (0) 2013.10.02
Wheel scrolling  (0) 2013.10.02
OnNcCreate 삼각,둥근 윈도우  (0) 2013.10.02
SHAPE  (0) 2013.10.02
brush  (0) 2013.10.02