1.环境:单文档demo,vs2015编译器,MFC框架。demo如下图:
2“打开”按钮消息响应ON_COMMAND(CXXXDlg类中)。
定义变量并初始化
int m_nZoomPercent; //bi li
CBitmap m_bmp; //位图
CDC m_dc;
CBitmap *m_pOlddc;
void FreeObject();
功能:能够打开图片
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<WPARAM>(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);
}