Chaos_Yeats 2017-07-19 08:52 采纳率: 0%
浏览 2104
已结题

在MFC中使用标签页切换CDC* pDC=pWnd->GetDC();出错

在写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;   
    }   
  • 写回答

1条回答

  • threenewbee 2017-07-19 10:27
    关注

    你pWnd是不是null,调试下看看。

    评论

报告相同问题?

悬赏问题

  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决