赞
踩
**前言:**本次课程首先讲解了关于信号处理的一些理论知识,之后就是通过VC++实现图片的显示与存储
在 1博主学习到了如下内容:
1.首先在vs2010中创建MFC基于对话框的应用程序
2.在资源视图的Dialog界面创建图片显示窗口和控制按钮,方法是在对话框中添加picture control和Button 等控件。分别修改各个控件的ID和Caption。
3.双击打开按钮,MFC自动添加消息响应函数void CBMP_RSYDlg::OnBnClickedButtonOpen(),并在消息响应函数中添加如下代码:
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"bmp(*.bmp)|*.bmp||",this); if (dlg.DoModal()!=IDOK) { MessageBox("图片打开失败"); return; } m_strSrcBmpPath = dlg.GetPathName(); CFile file; file.Open(m_strSrcBmpPath,CFile::modeRead); file.Read(m_pBmpFileHeader,14); file.Seek(14,CFile::begin); file.Read(m_pBmpInfo, 40+256*4); if (m_pBmpInfo->bmiHeader.biBitCount==8)//灰度图像,有调色板 { file.Seek(14+40+256*4,CFile::begin); } else if (m_pBmpInfo->bmiHeader.biBitCount==24)//彩色图像,无调色板 { file.Seek(14+40,CFile::begin); } int iWidth = m_pBmpInfo->bmiHeader.biWidth; int iHeight = m_pBmpInfo->bmiHeader.biHeight; int iImgSize = m_pBmpInfo->bmiHeader.biSizeImage; int iXPels = m_pBmpInfo->bmiHeader.biXPelsPerMeter; int iYPels = m_pBmpInfo->bmiHeader.biYPelsPerMeter; int biClrUsed = m_pBmpInfo->bmiHeader.biClrUsed; int biClrImportant = m_pBmpInfo->bmiHeader.biClrImportant; file.Read(m_pSrcBuf, m_pBmpInfo->bmiHeader.biSizeImage); file.Close(); Invalidate();
第一次按照此代码与我本身的软件VS不完全贴合,进行了如下的修改:
在“无法打开BPM文件”前添加了_T
在“图片打开失败”前添加_T
在代码前进行声明
但是尽管如此由于代码较复杂,经过多次修改后项目已经被破坏了,虽然代码编译无错误,但是最终图片不能被打开如下所示:
1、新建项目,将代码重新复制到项目中,控件添加稍微简单了些
2、虽然项目成功了但是还是无法将图片打开
如下所示:
这一次换了一个博主 学习,但是链接已丢失,学习和实践过程如下:
1、新建项目重新放置了控件如下:
2、修改和添加了类
3、添加程序
```cpp ```cpp ```cpp class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CYUXDlg 对话框 CYUXDlg::CYUXDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CYUXDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); strFilePath = _T(""); strFileName = _T(""); } void CYUXDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATIC1, m_picture1); DDX_Control(pDX, IDC_STATIC2, m_picture2); } BEGIN_MESSAGE_MAP(CYUXDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CYUXDlg::OnBnClickedButton1) END_MESSAGE_MAP() // CYUXDlg 消息处理程序 BOOL CYUXDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CYUXDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CYUXDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CYUXDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CYUXDlg::OnBnClickedButton1() { CFileDialog fileDlg(TRUE, _T("png"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*|"), this); fileDlg.DoModal(); strFilePath=fileDlg.GetPathName(); //文件路径 strFileName = fileDlg.GetFileName(); //文件名 if (strFilePath == _T("")) { return; } CImage image; image.Load(strFilePath); CRect rectControl; //控件矩形对象 m_picture1.GetClientRect(rectControl); CDC *pDc = m_picture1.GetDC(); //设备上下文对象的类 rectControl = CRect(rectControl.TopLeft(), CSize((int)rectControl.Width(), (int)rectControl.Height())); m_picture1.SetBitmap(NULL); //清空picture image.Draw(pDc->m_hDC, rectControl); //将图片绘制到Picture控件表示的矩形区域 image.Destroy(); m_picture1.ReleaseDC(pDc); }
4、成功显示图片如下:
虽然第三次尝试终于成功了,但是在这过程中还是有问题,没有完全按照第二个博主的方法来,破坏了项目多次尝试才成功的,总的来说,要细心,每个步骤都不能省略,学会不断反思和发问,继续进步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。