VC6.0 MFC画像オープン表示メッセージ


VC6.0
docのコンストラクション関数で2つの変数を初期化します.
         m_pImage    = NULL;//元の画像を格納するためのコピーm_pImageSrc = NULL;//元の画像を保存するために使用
///**********************************************************************************************************
BOOL CVDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	
	// TODO: Add your specialized creation code here
		m_sCurrFile  = lpszPathName;


	if( (m_pImageSrc = cvLoadImage(lpszPathName, 1)) == NULL)
		return FALSE;


	Load();




	return TRUE;
}


void CVDoc::Load()
{
 if(m_pImage != NULL)
	{
		cvReleaseImage(&m_pImage);
	}
	m_pImageSrc = cvLoadImage(m_sCurrFile, 1);
	m_pImage	= cvLoadImage(m_sCurrFile, 1);


	CRect rect;
	CFrameWnd   *pFrame=(CFrameWnd*)AfxGetMainWnd();   
	pFrame->GetActiveView()->GetClientRect(&rect);
	
	float y = (float)rect.Height()  / m_pImageSrc->height;
	float x = (float)rect.Width()   / m_pImageSrc->width;


	float ratio = x < y ? x: y;


	if(ratio < 1)
	{
		ZoomEx(ratio, m_pImageSrc, &m_pImage);
	}


	int r = ratio > 1 ? 100 : (int)(ratio*100);
}

///******************************保存画像********************************************//
// 
bool CVDoc::SaveImage(CString path)
{
	if(m_pImage == NULL)
	{
		return false;
	}

	cvSaveImage(path, m_pImage);
	return true;
}

ビューのコンストラクション関数でInitImage()を呼び出します.初期化
ex:
void CVView::InitImage()
{
	m_iImgX = 0;
	m_iImgY = 0;
	m_bIsExceedX = false;
	m_bIsExceedY = false;
	m_bIsChange	 = false;
	m_iPreX = -1;
	m_iPreY = -1;

}

///////////////////////////////////////////////////////////////////////////////CVView drawing
void CVView::OnDraw(CDC* pDC)
{
	CVDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if(pDoc->m_pImage != NULL)
	{
		CvvImage img;
		img.CopyOf(pDoc->m_pImage);					// 

		int x = 0, y = 0;
		CRect rect;
		GetClientRect(&rect);

		if(img.Width() < rect.Width())				// 
		{
			x = rect.Width() - img.Width();
			x = x / 2;
		}

		if(img.Height() < rect.Height())
		{
			y = rect.Height() - img.Height();
			y = y / 2;
		}
													// 
		img.Show(pDC->m_hDC, x, y, pDoc->m_pImage->width, pDoc->m_pImage->height, m_iImgX, m_iImgY);
	}
}

私たちのコントロールがそれほど大きくない場合、つまり表示する画像>コントロールのサイズの場合、CvImageのDrawTOHDC関数を使用できます.
CvvImage::DrawToHDC void CImage::DrawToHDC(HDC hDCDst, RECT* pDstRect); 画像のROI領域をDCのpDstRectに描画します.画像サイズとpDstRectが一致しない場合、画像は伸張/圧縮されます.この関数はWindowsでのみ有効です.hDCDstデバイス記述子.pDstRect対応デバイス記述子領域.
ex:
                CRect    rect; SetRect( rect, 0, 0, outputRect.Width(),outputRect.Height() );            m_cvImage->DrawToHDC(GetDlgItem(IDC_ORIGIN_PIC)->GetDC()->GetSafeHdc(),&rect);                                                                                                                                            //IDC_ORIGIN_PICはpictureコントロールのIDです