Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135461
  • 博文数量: 20
  • 博客积分: 128
  • 博客等级: 入伍新兵
  • 技术积分: 310
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-10 18:16
文章分类

全部博文(20)

文章存档

2013年(15)

2012年(5)

分类: Windows平台

2013-04-19 14:54:49


如上图,做一个图片查看器,点击打开可以选择要打开的文件夹,如下

批量选择图片,此处要是没有选择批量图片,仅选择一张,出现如下提示:


然后可以重新选择批量图片



点击-->和<--可以实现依次浏览
打开按钮ID:IDC_BUTTON1
-->按钮ID:IDC_BUTTON2
<--按钮ID:IDC_Left
程序如下:
Test3Dlg.h

class CTest3Dlg : public CDialog
{
// Construction
public:
 CTest3Dlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
 //{{AFX_DATA(CTest3Dlg)
 enum { IDD = IDD_TEST3_DIALOG };
 CStatic m_bmp;
 CStatic m_Fram;
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CTest3Dlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
 //}}AFX_VIRTUAL
 CStringArray m_Array;
 CString m_FileName;
    HBITMAP m_hBmp;
 CBitmap *pbmp;
// Implementation
protected:
 HICON m_hIcon;

 // Generated message map functions
 //{{AFX_MSG(CTest3Dlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnButton1();
 afx_msg void OnButton2();
 afx_msg void OnLeft();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
public:
 //int m_ButtonState;
 CButton *pbtn;//用来设定按键是否禁能,这个值没有定死,在每个需要处理的按键时必须初始化
 int i; //当前浏览时照片的加载号,用来辅助向左和向右翻页的功能
 void DrawBmp();//根据图片大小加载图片
// POSITION ;
// CFileFind finder;
 CString m_path; 
// std::vector m_vStrAllFiles;//容器
};

Test3Dlg.cpp

void CTest3Dlg::OnButton1()
{
 // TODO: Add your control notification handler code here
 CFileDialog m_dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
  "BMP图像|*bmp;*.bmp||",this);
 m_dlg.m_ofn.lpstrTitle="打开图像文件";
 m_dlg.m_ofn.nMaxFile=1000*MAX_PATH;
 m_dlg.m_ofn.lpstrFile=new TCHAR[m_dlg.m_ofn.nMaxFile];
 ZeroMemory(m_dlg.m_ofn.lpstrFile,sizeof(TCHAR)*m_dlg.m_ofn.nMaxFile);
 m_Array.RemoveAll();
 
 if (m_dlg.DoModal()==IDOK)
 {
  POSITION posFileStart=m_dlg.GetStartPosition();
  //m_FileName =m_dlg.GetPathName();
  while(posFileStart!=NULL)
  {
   m_FileName = m_dlg.GetNextPathName(posFileStart);//错的  
   m_Array.Add(m_FileName.GetBuffer(MAX_PATH));
   m_Array.FreeExtra(); 
  }
  if(m_Array.GetSize()== 1)
  {
   MessageBox("请选择至少两张图片");
   return ;
  }
  m_hBmp=(HBITMAP)::LoadImage(::AfxGetResourceHandle(),m_Array.GetAt(0),IMAGE_BITMAP,0,0,
   LR_LOADFROMFILE);  
  pbmp=CBitmap::FromHandle(m_hBmp); 
  DrawBmp();
     }
// m_ButtonState = 0;
}

 


void CTest3Dlg::OnButton2()
{
 pbtn = (CButton *)GetDlgItem(IDC_BUTTON2);
    if(i < m_Array.GetSize())
 {
  if (i == 0)//这里这么处理是因为当翻到左边最后一张时,即左按钮此时变灰色,要向右翻时,为了避免当期显示的图片再次加载
  {
   i++;
  }
  m_hBmp=(HBITMAP)::LoadImage(::AfxGetResourceHandle(),m_Array.GetAt(i),IMAGE_BITMAP,0,0,
   LR_LOADFROMFILE);
  pbmp=CBitmap::FromHandle(m_hBmp); 
  DrawBmp();
  
  if (i == m_Array.GetSize()-1) //这里是为了保证向右翻到最后一页时,不能再翻了,必须向左继续回翻
  {
   pbtn->EnableWindow(FALSE);
   pbtn = (CButton *)GetDlgItem(IDC_Left);
   pbtn->EnableWindow(TRUE);
   i++;
   return ;
  }
  i++;
 }
}

 

void CTest3Dlg::DrawBmp()
{
 CDC *pDC = GetDlgItem(IDC_PICTRUE)->GetDC();
 // m_Fram.SetBitmap(m_hBmp);
 CDC memdc;
 memdc.CreateCompatibleDC(pDC);
 CBitmap *pOidBitmap=(CBitmap*)memdc.SelectObject(pbmp);
 
 long wide, high;     
 BITMAP bmp;
 pbmp->GetBitmap(&bmp);
 wide = bmp.bmWidth;
 high = bmp.bmHeight;
 
 CRect bmpRC;
 GetDlgItem(IDC_PICTRUE)->GetWindowRect(&bmpRC);
 //::TransparentBlt(pDC->GetSafeHdc(),bmpRC.left,bmpRC.top,bmpRC.Width(),bmpRC.Height(),
 // memdc.GetSafeHdc(),0,0,wide,high,SRCCOPY);
 ::SetBrushOrgEx(::GetDC(m_Fram.m_hWnd),0,0,NULL);
 pDC->SetStretchBltMode(HALFTONE);
 //bmpRC.Width(),bmpRC.Height()160,160
 pDC->StretchBlt(0,0,bmpRC.Width(),bmpRC.Height(),&memdc,0,0,wide,high,SRCCOPY); /*这里有问题,不知为何加了一个静态框之后,显示的图片大小就小了,也就是说说这个函数出问题了,将bmpRC.Width(),bmpRC.Height()改为150,150却对了,说明此函数有问题
待解决问题
*/
 //memdc.SelectObject(&pOidBitmap);
 //ReleaseDC(pDC);
}

待解决的问题:
此处出现此问题是因为我添加了一个静态文本的控件,并将Picture控件放在静态文本控件内了。之后图片出现的就特别的小,这里肯定不是DrawBmp()函数的问题,是picture控件的大小改变了,因此回到dialog对话框中。

如上图:修改picture控件的属性,将type改为最初的frame类型,并将此控件大小修改至自己满意的大小,然后将type继续改为bitmap型即可。
删除功能还在改进,待续

阅读(8222) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~