⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageviewerdlg.cpp

📁 在wince下面开发的一个图片浏览器全部用图形界面编写的,带图片放大缩小,图片拖动,图片自动播放等功能,支持jpg,bmp格式. 图片缩放始终保持原始比例,
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		
		if (m_hBitmap)
		{
			CDC m_MemDC;
			m_MemDC.CreateCompatibleDC(&dc);
			m_MemDC.SelectObject(m_hBitmap);

			if (!m_bFullScreen)
			{
				buffDC.FillSolidRect(&m_DefaultRect,RGB(0,0,0));
			}
			else
			{
				buffDC.FillSolidRect(0,0,320,240,RGB(0,0,0));
			}
			buffDC.StretchBlt(m_DstStartX,m_DstStartY,m_DstWidth,m_DstHeight,&m_MemDC,m_SrcStartX,m_SrcStartY,m_SrcWidth,m_SrcHeight,SRCCOPY);
			buffDC.SetBkMode(TRANSPARENT);
			buffDC.SetTextColor(RGB(255,0,0));
			buffDC.DrawText(GetFileName(m_SourceFile),CRect(86,213,237,231),DT_CENTER|DT_VCENTER);

			m_MemDC.DeleteDC();
		}
		dc.BitBlt(0,0,320,240,&buffDC,0,0,SRCCOPY);
		buffDC.DeleteDC();			//删除顺序切勿颠倒!!!
		bgBmp.DeleteObject();	
		
	}
	else
	{	
		dc.BitBlt(0,0,320,240,&m_BgDC,0,0,SRCCOPY);
	}	
	// Do not call CDialog::OnPaint() for painting messages
}



BOOL CImageViewerDlg::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	return TRUE;
}

void CImageViewerDlg::OnButtonAutoplay() 
{
	// TODO: Add your control notification handler code here
	m_bAutoPlay = !m_bAutoPlay;	
	
	if (m_bAutoPlay)
	{
		m_butAutoPlay.LoadBitmaps(IDB_IMAGE_PLAYD,IDB_IMAGE_PLAYD,IDB_IMAGE_PLAYDIS);
	}
	else
	{
		m_butAutoPlay.LoadBitmaps(IDB_IMAGE_PLAY,IDB_IMAGE_PLAY,IDB_IMAGE_PLAYDIS);
	}
	m_butAutoPlay.Invalidate();

	//
	if (m_bAutoPlay)
	{
		SetTimer(1,m_DelayTime,NULL);
	}
	else 
	{
		KillTimer(1);
	}
}


void CImageViewerDlg::OnButtonClose() 
{
	// TODO: Add your control notification handler code here
	EndDialog(IDOK);
}


void CImageViewerDlg::OnButtonFullscreen() 
{
	// TODO: Add your control notification handler code here
	if (!m_bFullScreen)
	{		
		m_bFullScreen = TRUE;	
		ShowControl(FALSE);
		m_Zoom = 0;
		m_butZoomIn.EnableWindow(FALSE);
		m_butZoomOut.EnableWindow(TRUE);
		Invalidate();
	}	
}

void CImageViewerDlg::OnButtonBack() 
{
	// TODO: Add your control notification handler code here	
	if (g_Playlist.m_CurrentFile >0)
	{
		m_butNext.EnableWindow(TRUE);
		if (g_Playlist.m_CurrentFile == 1)
		{	m_butBack.EnableWindow(FALSE);
		}
		m_SourceFile = g_Playlist.GetNextWorkFileName(TRUE,FALSE);
		LoadImage(m_SourceFile);
		InvalidateRect(CRect(86,213,237,231));
	}
}

void CImageViewerDlg::OnButtonNext() 
{
	// TODO: Add your control notification handler code here
	if (g_Playlist.m_CurrentFile < g_Playlist.m_TotalFiles-1)
	{
		m_butBack.EnableWindow(TRUE);
		if (g_Playlist.m_CurrentFile == g_Playlist.m_TotalFiles-2)
		{	m_butNext.EnableWindow(FALSE);
		}
	
		m_SourceFile = g_Playlist.GetNextWorkFileName(FALSE,FALSE);
		LoadImage(m_SourceFile);	
		InvalidateRect(CRect(86,213,237,231));
	}
}

void CImageViewerDlg::OnButtonOpen() 
{
	// TODO: Add your control notification handler code here

	COpenFileDlg fileDlg;

	fileDlg.LoadBitmap(IDB_FILEVIEW_WND,IDB_ICON_IMAGEDIR,IDB_ICON_IMAGEDIRD,
							      IDB_ICON_IMAGE,IDB_ICON_IMAGED);
	fileDlg.SetFileType( L".bmp.jpg.");
	fileDlg.SetPosition(m_InitInf.FileviewPosition);
	fileDlg.SetSourceFile(m_InitInf.SourceFile);	

	if (fileDlg.DoModal() == IDOK)
	{		
		m_InitInf.FileviewPosition=fileDlg.GetPosition();
		m_InitInf.SourceFile=fileDlg.GetSourceFile();
		m_SourceFile = fileDlg.GetSourceFile();

		g_Playlist.m_FileList.RemoveAll();
		g_Playlist.m_TotalFiles = fileDlg.m_FileList.GetSize();
		g_Playlist.m_CurrentFile = fileDlg.m_FileNO;
		g_Playlist.m_FileList.Append(fileDlg.m_FileList);
		g_Playlist.m_FilePath = m_SourceFile.Left(m_SourceFile.ReverseFind(L'\\')+1);
		g_Playlist.InitSeed(g_Playlist.m_TotalFiles);
		
		if (g_Playlist.m_TotalFiles > 1)
		{
			m_butNext.EnableWindow(TRUE);
			m_butBack.EnableWindow(TRUE);
			m_butAutoPlay.EnableWindow(TRUE);
			m_FileNumber = g_Playlist.m_TotalFiles;
		} 
		else
		{
			m_butNext.EnableWindow(FALSE);
			m_butBack.EnableWindow(FALSE);
			m_butAutoPlay.EnableWindow(FALSE);
			m_FileNumber = 1;
		}
//
		if (!m_SourceFile.IsEmpty())
		{
			m_butFullScreen.EnableWindow(TRUE);			

			if (m_FileNumber > 1)
			{
				m_butBack.EnableWindow(TRUE);
				m_butNext.EnableWindow(TRUE);
			}
			else
			{
				m_butBack.EnableWindow(FALSE);
				m_butNext.EnableWindow(FALSE);
			}
		}
		else
		{
			m_butAutoPlay.EnableWindow(FALSE);
			m_butFullScreen.EnableWindow(FALSE);
			m_butBack.EnableWindow(FALSE);
			m_butNext.EnableWindow(FALSE);
		}
		
		LoadImage(m_SourceFile);
	}		
}

void CImageViewerDlg::OnButtonZoomin() 
{
	// TODO: Add your control notification handler code here
	if (m_hBitmap)
	{
		m_butZoomOut.EnableWindow(TRUE);	
		if (m_Zoom > 0)
		{
			if (--m_Zoom==0)
			{	m_butZoomIn.EnableWindow(FALSE);
			}
			InvalidateRect(m_DefaultRect);
		}
	}
}

void CImageViewerDlg::OnButtonZoomout() 
{
	// TODO: Add your control notification handler code here
	if (m_hBitmap)
	{
		m_butZoomIn.EnableWindow(TRUE);
		if (m_Zoom < MAX_ZOOM)
		{
			if (++m_Zoom==MAX_ZOOM)
			{	m_butZoomOut.EnableWindow(FALSE);
			}
		
			InvalidateRect(m_DefaultRect);
		}
	}
}

bool CImageViewerDlg::LoadImage(CString strFileName)
{
	m_Zoom=0;
	m_butZoomIn.EnableWindow(FALSE);
	m_butZoomOut.EnableWindow(FALSE);

	CClientDC dc(this);
	switch(GetImageType(strFileName))
	{
	case IMG_BMP:

		// 装载Bitmap格式的图片			
		//m_hBitmap = SHLoadDIBitmap(strFileName); 
		if (m_hBitmap)
		{
			DeleteObject(m_hBitmap);
			m_hBitmap = NULL;
			m_DIBSection.DeleteObject();
		}

		m_DIBSection.Load(strFileName);

		m_hBitmap = m_DIBSection.GetSafeHandle();

		if (!m_hBitmap)
		{
			return FALSE;
		}else
		{
			// 获取图片宽和高
			m_ImageSize = CSize(m_DIBSection.GetWidth(),m_DIBSection.GetHeight());	
		}
		break;
	case IMG_JPG:
		if (m_hBitmap)
		{
			DeleteObject(m_hBitmap);
			m_hBitmap = NULL;
		}
		LoadImageJPG(strFileName);
		if(!m_hBitmap) 
		{
			return false;	
		}
		break;
	case IMG_UNKNOWN:
		m_hBitmap = NULL;
		//MessageBox(L"该图片格式暂不支持....");
		return FALSE;
		break;
	}


	if (m_bFullScreen)
	{
		Invalidate();
	}
	else
	{
		InvalidateRect(m_DefaultRect);
	}

	m_butZoomOut.EnableWindow(TRUE);
	return true;
}

int CImageViewerDlg::GetImageType(CString strFileName)
{
	// 判断文件是否是Bitmap位图	
	CFile file;
	CFileException e;
	
	// 打开文件
	if (! file.Open(strFileName,CFile::modeRead,&e) )
	{	return IMG_UNKNOWN;
	}
	
	// 读取文件前两个字节
	BYTE bBuffer[2];
	file.Read(bBuffer,2);
	
	file.Close();
	// 判断前两个字节是不是'BM'
	if (bBuffer[0] == 0x42 && bBuffer[1] == 0x4D)
	{
		return IMG_BMP;		
	}
	else
	{
		if (bBuffer[0] == 0xFF && bBuffer[1] == 0xD8)
		{
			return IMG_JPG;		
		}
	}	
	
	return IMG_UNKNOWN;
}

//***********************************************
void CImageViewerDlg::ZoomImage(int iZoom)
{
	CSize	m_InitViewSize;		//初始态窗口对应的源图像大小
	CSize	m_CurrentViewSize;	//中间变量,用于计算Src &  Dst
	int		m_ZoomQuotiety;	// =2^m_zoom
	float k;  // 目标/源 比例系

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -