VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 295|回复: 0

VC++高级班之窗口篇-[13]打造自己的图片浏览器

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-6 01:20:41 | 显示全部楼层 |阅读模式
------------------------------------------ Begin ----------------------------------------
①、实现的原理:利用 CImage 类实现各种类型图片的浏览!
===================================================
②、界面的制作及初始化:
  1. //ImageExplorerDlg.h
  2. CMap <CString, LPCTSTR, BOOL, BOOL> imgTypeMap;
  3. CListCtrl m_ImgList;

  4. //CImageExplorerDlg::OnInitDialog() 添加:
  5. imgTypeMap.SetAt(_T(".bmp"), TRUE);
  6. imgTypeMap.SetAt(_T(".png"), TRUE);
  7. imgTypeMap.SetAt(_T(".jpg"), TRUE);
  8. imgTypeMap.SetAt(_T(".gif"), TRUE);

  9. m_ImgList.InsertColumn(0, _T("图片名称"), LVCFMT_LEFT, 120);
  10. m_ImgList.InsertColumn(1, _T("图片大小"), LVCFMT_LEFT, 60);
  11. m_ImgList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

  12. //SetDlgItemText(IDC_IMAGE_PATH, _T("D:\\MyProfile\\My Documents\\My Pictures"));
复制代码

===================================================
③、添加浏览按钮代码:
  1. void CImageExplorerDlg::OnBnClickedBrowseBtn()
  2. {
  3.         TCHAR szPath[MAX_PATH] = {0};
  4.         BROWSEINFO mBroInfo = {0};
  5.         mBroInfo.hwndOwner = m_hWnd;
  6.         ITEMIDLIST *pidl = SHBrowseForFolder(&mBroInfo);
  7.         if (SHGetPathFromIDList(pidl, szPath)){
  8.                 SetDlgItemText(IDC_IMAGE_PATH, szPath);
  9.         }
  10.         CoTaskMemFree(pidl);
  11. }
复制代码

===================================================
④、获取图像列表按钮代码:
  1. void CImageExplorerDlg::OnBnClickedGetlistBtn()
  2. {
  3.         CString strPath;
  4.         GetDlgItemText(IDC_IMAGE_PATH, strPath);
  5.         if (strPath.IsEmpty()) return;

  6.         if (strPath[strPath.GetLength()-1] != '\\')
  7.                 strPath = strPath + _T("\");

  8.         CFileFind mFinder;
  9.         BOOL bFind = mFinder.FindFile(strPath + _T("*.*"), 0);
  10.         while (bFind){
  11.                 bFind = mFinder.FindNextFile();
  12.                 if (mFinder.IsDots()){
  13.                         continue;
  14.                 }else{
  15.                         if (mFinder.IsDirectory()){
  16.                                 //目标是目录
  17.                         }else{
  18.                                 //目标是文件
  19.                                 BOOL bRet = TRUE;
  20.                                 CString strExt = mFinder.GetFileName();
  21.                                 strExt.Replace(mFinder.GetFileTitle(), _T(""));
  22.                                 if (imgTypeMap.Lookup(strExt, bRet) != FALSE){
  23.                                         int itemCount = m_ImgList.GetItemCount();
  24.                                         m_ImgList.InsertItem(itemCount, mFinder.GetFileName());

  25.                                         CImage mImg;
  26.                                         mImg.Load(mFinder.GetFilePath());
  27.                                         CString strSize;
  28.                                         strSize.Format(_T("%dx%d"), mImg.GetWidth(), mImg.GetHeight());
  29.                                         m_ImgList.SetItemText(itemCount, 1, strSize);

  30.                                         TCHAR *pszPath = new TCHAR[MAX_PATH];
  31.                                         ZeroMemory(pszPath, MAX_PATH);
  32.                                         _tcscpy_s(pszPath, MAX_PATH, mFinder.GetFilePath());
  33.                                         m_ImgList.SetItemData(itemCount, (DWORD_PTR)pszPath);
  34.                                 }
  35.                         }
  36.                 }
  37.         }
  38.         mFinder.Close();
  39. }
复制代码

===================================================
⑤、添加 ListCtrl 图像列表的单击相应函数,进行图片的显示:
  1. void CImageExplorerDlg::OnNMClickImageList(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3.         LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  4.         // TODO: Add your control notification handler code here

  5.         if (pNMItemActivate->iItem < 0) return;
  6.         DrawShowImage(pNMItemActivate->iItem);

  7.         *pResult = 0;
  8. }
复制代码

  1. //其中 DrawShowImage 函数的代码如下:
  2. void CImageExplorerDlg::DrawShowImage(int iItem)
  3. {
  4.         if (iItem < 0) return;
  5.         TCHAR *pszPath = (TCHAR *)m_ImgList.GetItemData(iItem);

  6.         CImage mImg;
  7.         HRESULT hr = mImg.Load(pszPath);
  8.         if (SUCCEEDED(hr)) {

  9.                 CSize imgSize(mImg.GetWidth(), mImg.GetHeight());
  10.                 CRect showRect;
  11.                 GetDlgItem(IDC_IMAGE_SHOW)->GetClientRect(&showRect);
  12.                 showRect.left += 1;
  13.                 showRect.top += 1;
  14.                 showRect.bottom -= 1;
  15.                 showRect.right -= 1;
  16.                 int posX = 1, posY = 1, width = showRect.Width(), height = showRect.Height();

  17.                 if (imgSize.cx < showRect.Width()){
  18.                         posX = (showRect.Width()-imgSize.cx)/2;
  19.                         width = imgSize.cx;
  20.                 }
  21.                 if (imgSize.cy < showRect.Height()){
  22.                         posY = (showRect.Height()-imgSize.cy)/2;
  23.                         height = imgSize.cy;
  24.                 }

  25.                 CDC *pShowDC = CDC::FromHandle(::GetDC(GetDlgItem(IDC_IMAGE_SHOW)->m_hWnd));
  26.                 pShowDC->FillRect(showRect, CBrush::FromHandle(::CreateSolidBrush(GetSysColor(COLOR_3DFACE))));
  27.                 mImg.StretchBlt(pShowDC->m_hDC, posX, posY,width, height, SRCCOPY);
  28.                 ::ReleaseDC(GetDlgItem(IDC_IMAGE_SHOW)->m_hWnd, pShowDC->m_hDC);
  29.         }
  30. }
复制代码

===================================================
⑥、为进行格式转换添加菜单资源:
响应 ListCtrl 的右键单击消息,进行菜单的弹出:
  1. void CImageExplorerDlg::OnNMRClickImageList(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3.         LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  4.         // TODO: Add your control notification handler code here
  5.         if (pNMItemActivate->iItem < 0) return;
  6.         DrawShowImage(pNMItemActivate->iItem);

  7.         CMenu mMenu, *pMenu = NULL;
  8.         mMenu.LoadMenu(IDR_MENU1);
  9.         pMenu = mMenu.GetSubMenu(0);
  10.         CPoint pt;
  11.         GetCursorPos(&pt);
  12.         pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);

  13.         *pResult = 0;
  14. }
复制代码

===================================================
⑦、添加菜单响应函数,进行格式转换并保存文件:
  1. void CImageExplorerDlg::OnMTranslate()
  2. {
  3.         // TODO: Add your command handler code here
  4.         CFileDialog fileDlg(FALSE, _T("bmp"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  5.                 _T("bmp Files (*.bmp)|*.bmp|png Files (*.png)|*.png|jpg Files (*.jpg)|*.jpg|gif Files (*.gif)|*.gif||"));

  6.         if ( fileDlg.DoModal() == IDOK ){
  7.                 CImage mImg;
  8.                 TCHAR *pszPath = (TCHAR *)m_ImgList.GetItemData(m_ImgList.GetSelectionMark());
  9.                 HRESULT hr = mImg.Load(pszPath);
  10.                 if (SUCCEEDED(hr)) {
  11.                         mImg.Save(fileDlg.GetPathName());
  12.                 }
  13.         }
  14. }
复制代码

===================================================
⑧、
===================================================
⑨、
===================================================
⑩、重载 OnCancel() 函数,进行资源的释放:
  1. void CImageExplorerDlg::OnCancel()
  2. {
  3.         for (int idx = 0; idx < m_ImgList.GetItemCount(); ++idx){
  4.                 TCHAR *pszPath = (TCHAR *)m_ImgList.GetItemData(idx);
  5.                 delete [] pszPath;
  6.         }

  7.         CDialog::OnCancel();
  8. }
复制代码

===================================================
※※※ 小作业:解决窗口隐藏后再显示时图像消失的问题。
------------------------------------- End -------------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:http://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:http://www.cctry.com/static/vip/index.html




上一篇:VC++高级班之窗口篇-[12]打造自己的屏幕放大镜
下一篇:VC++高级班之窗口篇-[14]双缓冲讲解及界面贴图

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-8-20 23:20

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表