MFC缩放位图简单例子

1.环境:单文档demo,vs2015编译器,MFC框架。demo如下图:

MFC缩放位图简单例子_第1张图片

2“打开”按钮消息响应ON_COMMAND(CXXXDlg类中)。

定义变量并初始化

int m_nZoomPercent;	//bi li
CBitmap m_bmp;	//位图 
CDC m_dc;
CBitmap *m_pOlddc;
void FreeObject();

MFC缩放位图简单例子_第2张图片

功能:能够打开图片

void CMFCApplication2Dlg::OnOpen()
{
	// TODO: 在此添加命令处理程序代码
	/*
	explicit CFileDialog(
    BOOL bOpenFileDialog,    //显示的窗口,文件打开对话框或文件另存为对话框
    LPCTSTR lpszDefExt = NULL,    //默认的文件扩展名,会自动追加到文件名后。
    LPCTSTR lpszFileName = NULL,    //显示在文件名编辑栏的初始文件名。  
    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,    //用来自定义对话框的标志组合(后详)  
    LPCTSTR lpszFilter = NULL,    //文件筛选(结构见后述)  
    CWnd* pParentWnd = NULL,    //父窗口指针(通常都NULL) 
    DWORD dwSize = 0,    //The size of the OPENFILENAME structure.(找时间查查OPENFILENAME structure)  
    BOOL bVistaStyle = TRUE);    //显示Vista样式,为TRUE时使用new Vista file dialogs,为FALSE时将使用旧样式dialogs.
	(具体可以百度)
	*/
	CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, _T("*.bmp|*.bmp||"), this);
	if (dlg.DoModal() == IDOK)
	{
		//LoadImage是一种函数,功能是装载图标,光标,或位图  不支持png(可用CImage类)
		HBITMAP hbmp = (HBITMAP)LoadImage(NULL, dlg.GetPathName(),
			IMAGE_BITMAP, 0, 0,
			LR_DEFAULTSIZE | LR_LOADFROMFILE);
		if (hbmp != NULL)
		{
			FreeObject();
			//将装载位图与CBitmap对象关联起来,解除关联Detach()函数
			m_bmp.Attach(hbmp);
			CDC *pDc = GetDC();
			//绑定上下文DC
			m_dc.CreateCompatibleDC(pDc);
			ReleaseDC(pDc);
			m_pOlddc = m_dc.SelectObject(&m_bmp);
			Invalidate(FALSE);
		}
	}
}

那怎么讲图片显示到窗口上呢?OnPaint()函数可以了解一下

这里如果有部分图片失真可以在StretchBlt前面添加dc.SetStretchBltMode(COLORONCOLOR);

2.2显示图片

void CMFCApplication2Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		if (m_dc.GetSafeHdc() == NULL)
		{
			CDialogEx::OnPaint();
		}
		else{
			CPaintDC dc(this);
			CRect rect;
			GetClientRect(rect);
			//??mei you yong fa -> GetStockBrush()
			::FillRect(dc.GetSafeHdc(), rect, (HBRUSH)GetStockObject(BLACK_PEN));
			BITMAP bm;
			m_bmp.GetBitmap(&bm);
			//复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。
			dc.StretchBlt(0, 0, bm.bmWidth * m_nZoomPercent / 100,
				bm.bmHeight*m_nZoomPercent / 100, &m_dc, 0, 0, bm.bmWidth,
				bm.bmHeight, SRCCOPY);
		}
		
	}
}

这里我们发现二次点击“打开”,demo会崩溃??因为我们没有释放dc

2.3 释放dc

void CMFCApplication2Dlg::FreeObject()
{
	if (m_dc.GetSafeHdc() !=NULL)
	{
		m_dc.SelectObject(m_pOlddc);
		m_dc.DeleteDC(); 
		m_bmp.DeleteObject();
	}
}

3.放大

void CMFCApplication2Dlg::OnZoomin()
{
	// TODO: 在此添加命令处理程序代码
	m_nZoomPercent += 10;
	Invalidate(FALSE);
}

 

 

 

 

你可能感兴趣的:(MFC)