在写MFC的标签页时我需要实现的是该界面的功能
在该界面中点击打开图片便能够将选中的图片显示到图片控件中去。
而我的要求就是在切换到别的标签页时再切换回来该显示图片还在,所以我就做了相关的处理,但是报错了。以下是我写的两部分和显示有关的代码:
//这是为“打开图片”按钮写的点击函数,点击选择图片后便做相应的操作
void CIMGDlg::OnBnClickedOpenButton()
{
// TODO: 在此添加控件通知处理程序代码
// 设置过滤器
TCHAR szFilter[] = _T("图像文件(*.jpg)|*.jpg|所有文件(*.*)|*.*||");
// 构造打开文件对话框
CFileDialog fileDlg(TRUE, _T("jpg"), NULL, 0, szFilter, this);
CString strFilePath;
CString strFilePathSave;
// 显示打开文件对话框
if (IDOK == fileDlg.DoModal())
{
// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里
strFilePath = fileDlg.GetPathName();
SetDlgItemText(IDC_OPEN_EDIT, strFilePath);
//获得图片的保存路径
strFilePathSave = fileDlg.GetFileTitle();
//---------------------CString的连接操作中=号有点特殊,所以要注意这种连接操作-------------------------------------//
CString strTmp(_T("temp\\"));
strFilePathSave = strTmp + strFilePathSave ;
strFilePathSave+=".bmp";
//_______________________________________________________________________________________________________________//
}
//-----------------------------------这段代码将CString转换为String类型可以重复使用-----------------------------------//
//将CString类型的文件地址转换成String类型
String strFilePath_cv,strFilePathSave_cv;
strFilePath_cv = CT2CA(strFilePath.GetBuffer(0));
strFilePathSave_cv = CT2CA(strFilePathSave.GetBuffer(0));
//-------------------------------------------------------------------------------------------------------------------//
//------------------------------------这段代码用来显示自己所需要的信息可以重复使用-----------------------------------//
//CString msg(strFilePath_cv.c_str());
//MessageBox(msg, _T("Debug"), MB_OKCANCEL | MB_ICONQUESTION);
//-------------------------------------------------------------------------------------------------------------------//
Mat pic_Input = imread(strFilePath_cv);//通过路径读取图片
imwrite(strFilePathSave_cv,pic_Input);//将读取的路径转换格式并且保存到项目中去
//String转为LPCTSTR
CImage img;
CString cstr(strFilePathSave_cv.c_str());
extern LPCTSTR m_faceImg;
m_faceImg = cstr;
img.Load(cstr);
//---------------------------------在指定的图像控件中画出图像---------------------------------------------------------//
CWnd* pWnd;
pWnd=GetDlgItem(IDC_Face_DRAW);
CDC* pDC=pWnd->GetDC();
HDC hDC = pDC->m_hDC;
CRect rect_frame;
//CImage image;
pWnd->GetClientRect(&rect_frame);
::SetStretchBltMode(hDC,HALFTONE);
::SetBrushOrgEx(hDC,0,0,NULL);
img.Draw(hDC,rect_frame);
ReleaseDC(pDC);//释放picture控件的DC
//-------------------------------------------------------------------------------------------------------------------//
}
//这是选择相应标签页后做的操作
switch (m_tab.GetCurSel())
{
//当标签被选中时则显示对应的对话框
case 0:
{
m_imgDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_landmarkDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_faceDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_modelDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
/*extern LPCTSTR m_faceImg;
MessageBox(m_faceImg, _T("Debug"), MB_OKCANCEL | MB_ICONQUESTION);*/
//if(m_imgDlg.m_faceImg!=_T("temp\\1.bmp"))
CImage img;
//MessageBox(_T("temp\\1.bmp"), _T("Debug"), MB_OKCANCEL | MB_ICONQUESTION);
//初始加载一张产品图片
img.Load(_T("temp\\2.bmp"));
CWnd* pWnd;
pWnd=GetDlgItem(IDC_Face_DRAW);
CDC* pDC=pWnd->GetDC();
HDC hDC = pDC->m_hDC;
CRect rect_frame;
CImage image;
pWnd->GetClientRect(&rect_frame);
::SetStretchBltMode(hDC,HALFTONE);
::SetBrushOrgEx(hDC,0,0,NULL);
img.Draw(hDC,rect_frame);
ReleaseDC(pDC);//释放picture控件的DC
break;
}
case 1:
m_imgDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_landmarkDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_faceDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_modelDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
break;
case 2:
m_imgDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_landmarkDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_faceDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
m_modelDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
break;
case 3:
m_imgDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_landmarkDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_faceDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);
m_modelDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);
break;
default:
break;
}