分类: 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
};
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型即可。
删除功能还在改进,待续