44上位机VC MFC用CFileDialog实现位图预览
44上位机VC MFC用CFileDialog实现位图预览
功能展示
在使用对话框 打开位图时,如果能够对图片进行预览就可以让用户更加快捷的选择想要的图片,我们可以使用微软提供的CFileDialog进行IDY,满足我们的程序功能;效果如图 要点提示 文件对话框类CFileDialog有一个数据成员m_ofn,该成员为OPENFILENAME结构体变量,这个结构体包含了一组成员,其中Flags是初始化对话框的一组标记,lpTemplateName用于提供文件对话框的子对话框 窗口,如果Flags中包含OFN_EXPLORER标记,系统将创建一个标准的对话框。如果我们想要设计自己的文件对话框,我们可以从CFileDialog派生创建一个新的对话框,在新的对话框中添加控件,然后将其赋给lpTemplateName,如m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);IDD_DIALOG1为我们自己创建 的对话框 ID;,这样我们就将这个对话框嵌入到CFileDialog的标准对话框当中了 实现功能 1.新建基于对话框的应用程序 2.再新建一对话框资源添加一些控件,关联对话框到一个CFileDialog类;
3.添加对话框的初始化函数OnInitDialog() ,并对对话框的变量初始化,如我们当前例程 - BOOL CBmpDlg::OnInitDialog()
- {
- CFileDialog::OnInitDialog();
- m_Bitmap.SubclassDlgItem(IDC_STATIC1,this); //控件关联ID
- m_Measure.SubclassDlgItem(IDC_STATIC2,this);
- m_Size.SubclassDlgItem(IDC_STATIC3,this);
- m_Time.SubclassDlgItem(IDC_STATIC4,this);
- return TRUE;
- }
复制代码
4.在对话框的构造函数中修改m_ofn.Flags及m_ofn.lpTemplateName的值 m_ofn.Flags = (OFN_EXPLORER|OFN_ENABLETEMPLATE| OFN_ENABLEHOOK); m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);IDD_DIALOG1为我们自己建立对话框 ID;
5.手动添加这个对话框类的虚函数OnFileNameChange()如我们例程中实现了我们位图预览的功能 - void CBmpDlg::OnFileNameChange()
- {
- CString exp;
- exp=GetFileExt();
- exp.MakeUpper(); //在比较扩展名时不区分大小写
- if(exp == "BMP") //显示位图
- {
- CFile file;
- if(!file.Open(GetPathName(),CFile::modeRead) )
- return;
- BITMAPFILEHEADER bmfHeader;
- //读位图文件头信息
- if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader)) != sizeof(bmfHeader))
- return;
- //读位图头信息
- BITMAPINFOHEADER bmiHeader;
- if(file.Read((LPSTR)&bmiHeader, sizeof(bmiHeader)) !=sizeof(bmiHeader))
- return ;
- //获得大小信息,并显示
- int bmWidth = bmiHeader.biWidth;
- int bmHeight = bmiHeader.biHeight;
- file.Close();
- int x=150,y=150;
- if(bmWidth < 150)
- x = bmWidth;
- if(bmHeight < 150)
- y = bmHeight;
- m_Bitmap.SetBitmap((HBITMAP)LoadImage(NULL,GetPathName(),IMAGE_BITMAP,x,y,LR_LOADFROMFILE));
- //><
复制代码- //><
- CFileStatus status;
- CFile::GetStatus(GetPathName(),status);
- CString measure,size,time;
- measure.Format("图像尺寸:%d*%d",bmWidth,bmHeight);
- m_Measure.SetWindowText(measure);//显示位图尺寸
- size.Format("文件大小:%dK",status.m_size/1024);
- m_Size.SetWindowText(size);//显示位图大小
- time.Format("创建时间:%s",status.m_ctime.Format("%Y年%m月%d日 %H:%M:%S"));
- m_Time.SetWindowText(time);//显示创建的位图时间
- }
- }
复制代码5.最后当然是在主对话框中调用我们自己DIY的对话框,记得添加头文件 CBmpDlgdlg(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT| OFN_EXPLORER|OFN_ENABLETEMPLATE,"AllFiles(*.BMP)|*.BMP||"); dlg.DoModal();
我们来演示下功能实现的整个过程 源码及视频下载 (仅在电脑可见)
|