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

在写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个回答

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

Saber190919
Saber190919 我用这代码试了下,结果弹出来的窗口是“非空”,所以感觉应该是存在的。只是网上的说法看了下,是说可能是这个控件注册了但是还没创建会出这种问题。但是我觉得我这样肯定已经创建了啊
2 年多之前 回复
Saber190919
Saber190919 if(pWnd = NULL){ MessageBox( _T("空"), _T("Debug"), MB_OKCANCEL | MB_ICONQUESTION); }else{ MessageBox( _T("非空"), _T("Debug"), MB_OKCANCEL | MB_ICONQUESTION); }
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问