-
이미지 렌더링하기 - CxImageGUI/GDI 2008. 12. 22. 23:15
CxImage
.Load()
.CreateFromHANDLE()
.CopyToHandle()
.Save()
.Draw()
.GetWidth()
.GetHeight()
::FindType()
// Stdafx.h
#include "xImage.h"
class CImageApp : public CWinApp
{
public:
CImageApp();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CImageApp)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CImageApp)
...
afx_msg void OnFileOpen();
afx_msg void OnUpdateEditPaste(CCmdUI* pCmdUI);
afx_msg void OnEditPaste();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CImageApp, CWinApp)
//{{AFX_MSG_MAP(CImageApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
//}}AFX_MSG_MAP
...
END_MESSAGE_MAP()
...
void CImageApp::OnFileOpen()
{
// TODO: Add your command handler code here
char szFilter[] = "Image (*.bmp,*.jpg, *.gif, *.png, *.tif, *.mng, *.ico, *.pcx, \
*.tga, *.wmf, *.jbg, *.j2k)| \
*.bmp;*.jpg;*.gif;*.png;*.tif;*.mng;*.ico;*.pcx;\
*.tga;*.wmf;*.jbg;*.j2k|All Files(*.*)|*.*||";
CFileDialog fileDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);
if(IDOK == fileDlg.DoModal())
{
OpenDocumentFile(fileDlg.GetPathName());
}
}
void CImageApp::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(!IsClipboardFormatAvailable(CF_DIB)) pCmdUI->Enable(FALSE);
}
void CImageApp::OnEditPaste()
{
// TODO: Add your command handler code here
// ImageDoc의 DocTemplate을 얻음
POSITION pos = GetFirstDocTemplatePosition();
CDocTemplate *pTemplate = GetNextDocTemplate(pos);
// 새로운 도큐먼트 생성
CImageDoc *pNewDoc = (CImageDoc*)pTemplate->OpenDocumentFile(NULL);
if (pNewDoc)
{
HANDLE hBitmap=NULL;
// 클립보드에서 데이터 가져오기
if (::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd()))
hBitmap = ::GetClipboardData(CF_DIB);
if (hBitmap){
// 클립보드에서 얻은 데이터로부터 CxImage 생성
pNewDoc->m_pImage = new CxImage();
pNewDoc->m_pImage->CreateFromHANDLE(hBitmap);
// View 초기화
POSITION pos = pNewDoc->GetFirstViewPosition();
CImageView* pView = (CImageView*)pNewDoc->GetNextView(pos);
}
// 클립보드 닫기
::CloseClipboard();
pNewDoc->SetModifiedFlag();
}
}
class CImageDoc : public CDocument
{
...
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CImageDoc)
public:
...
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
virtual void DeleteContents();
virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
//}}AFX_VIRTUAL
// Implementation
public:
CxImage *m_pImage;
virtual ~CImageDoc();
...
// Generated message map functions
protected:
//{{AFX_MSG(CImageDoc)
afx_msg void OnEditCopy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CImageDoc, CDocument)
//{{AFX_MSG_MAP(CImageDoc)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
...
CImageDoc::CImageDoc()
{
// TODO: add one-time construction code here
m_pImage = NULL;
}
...
BOOL CImageDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: Add your specialized creation code here
// {
m_pImage = new CxImage;
m_pImage->Load(lpszPathName, CxImage::FindType(lpszPathName));
// }
return TRUE;
}
void CImageDoc::DeleteContents()
{
// TODO: Add your specialized code here and/or call the base class
// {
if(m_pImage)
delete m_pImage;
// }
CDocument::DeleteContents();
}
BOOL CImageDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
// TODO: Add your specialized code here and/or call the base class
// {
return m_pImage->Save(lpszPathName, CxImage::FindType(lpszPathName));
// }
// return CDocument::OnSaveDocument(lpszPathName);
}
void CImageDoc::OnEditCopy()
{
// TODO: Add your command handler code here
HANDLE hDIB = m_pImage->CopyToHandle();
if (::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd())) {
if(::EmptyClipboard()) {
if (::SetClipboardData(CF_DIB, hDIB) == NULL ) {
AfxMessageBox( "Unable to set Clipboard data" );
}
}
}
::CloseClipboard();
}
class CImageView : public CView
{
...
// Generated message map functions
protected:
//{{AFX_MSG(CImageView)
afx_msg void OnViewOriginalsize();
afx_msg void OnViewZoomIn();
afx_msg void OnViewZoomOut();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int m_nZoom;
};
BEGIN_MESSAGE_MAP(CImageView, CScrollView)
//{{AFX_MSG_MAP(CImageView)
ON_COMMAND(ID_VIEW_ORIGINALSIZE, OnViewOriginalsize)
ON_COMMAND(ID_VIEW_ZOOM_IN, OnViewZoomIn)
ON_COMMAND(ID_VIEW_ZOOM_OUT, OnViewZoomOut)
//}}AFX_MSG_MAP
...
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageView construction/destruction
CImageView::CImageView()
{
// TODO: add construction code here
m_nZoom = 1;
}
...
void CImageView::OnDraw(CDC* pDC)
{
CImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(pDoc->m_pImage)
{
pDC->SetStretchBltMode(COLORONCOLOR);
if(m_nZoom >= 1)
{
pDoc->m_pImage->Draw(pDC->GetSafeHdc(), CRect(0, 0,
(int)(pDoc->m_pImage->GetWidth()*m_nZoom),
(int)(pDoc->m_pImage->GetHeight())*m_nZoom));
}
else
{
pDoc->m_pImage->Draw(pDC->GetSafeHdc(), CRect(0, 0,
(int)(pDoc->m_pImage->GetWidth()/(2-m_nZoom)),
(int)(pDoc->m_pImage->GetHeight())/(2-m_nZoom)));
}
}
}
...
void CImageView::OnViewOriginalsize()
{
// TODO: Add your command handler code here
m_nZoom=1;
Invalidate();
}
void CImageView::OnViewZoomIn()
{
// TODO: Add your command handler code here
m_nZoom++;
Invalidate();
}
void CImageView::OnViewZoomOut()
{
// TODO: Add your command handler code here
m_nZoom--;
Invalidate();
}