为什么对话框创建失败?是我创建对话框时出了问题?为了测试我新建了另一个对话框,在那个对话框生成的.cpp文件里我没有添加任何东西,然后测试也出现了同样的问题,这也是对话框创建失败吗?

解决方案 »

  1.   

    你Debug下调试一下你的CIsoSetDlg类,看看对话框初始化的地方,比如OnInitDialog函数里写了什么?
      

  2.   

    BOOL CIsoSetDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    m_PSld1.SetRange(-1024, 3071);
    m_PSld1.SetTicFreq(200);
    m_PSld2.SetRange(-1024, 3071);
    m_PSld2.SetTicFreq(200); m_PSpin1.SetBuddy(&m_PEdit1);
    m_PSpin2.SetBuddy(&m_PEdit2); m_PSpin1.SetRange(-1024, 3071);
    m_PSpin2.SetRange(-1024, 3071);    // Set current position
    m_PSpin1.SetPos(m_PIso1);
    m_PSpin2.SetPos(m_PIso2);
    m_PSld1.SetPos(m_PIso1);
    m_PSld2.SetPos(m_PIso2);
    UpdateData(false);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }
    这是我OnInitDialog的函数,里面是一些控件的初始化,另外,类里面一定要有OnInitDialog函数吗?我另创建了一个对话框,里面没有OnInitDialog函数 然后也出现了上面的问题
      

  3.   

    Isd.m_PIso1=context->volume->minIso;
    m_PIso1;//是什么,控件?
    窗口显示前不能对控件赋值!
      

  4.   

    不是控件 只是一个int型变量
      

  5.   

    在资源中打开你的对话框,按Ctrl+T 看看对话框能不能出来。
      

  6.   

    那去掉:
    Isd.m_PIso1=context->volume->minIso;
    Isd.m_PIso2=context->volume->maxIso;

    if (IDOK==Isd.DoModal()) {对话框应该可以出来。
      

  7.   

    我觉得不是这个问题,Isd.m_PIso1只是普通的int变量,而且为了测试我新建了另外一个对话框,里面什么都没做,还是会出现调用对话框的函数后面的代码都不执行的问题,是不是跟父窗口有关呢,或者是我创建对话框时除了问题,OnInitDialog()函数是自动生成的吗,我新创建的那个对话框里为什么没有OnInitDialog()函数呢?
      

  8.   

    void CMipvadKernel::ssd()
    {
    sr->enable = TRUE;
    clear3DDlg();
    getSSDDlg().ShowWindow(TRUE);
    testDlg td;
    td.DoModal();
    /* CIsoSetDlg Isd;
    Isd.m_PIso1=context->volume->minIso;
    Isd.m_PIso2=context->volume->maxIso;
    if (IDOK==Isd.DoModal()) {

    if(Isd.m_PIso1<Isd.m_PIso2)
    {
    context->volume->minIso=Isd.m_PIso1;
    context->volume->maxIso=Isd.m_PIso2;
    }
    else
    {
    context->volume->minIso=Isd.m_PIso2;
    context->volume->maxIso=Isd.m_PIso1;
    }
    }*/
    if (sr->Init(getSSDDlg().GetWindowDC(), RGB(0,0,0)))
    {

    TRACE("Render ok\n");
    ssdResize();
    sr->load(context->volume);
    }
    else
    {
    TRACE("Render failed\n");
    }// ssdResize();
    ssdRender();
    get3DDlg().Invalidate();

    }
    如上程序,testDlg是我新建的一个对话框,但是调试时发现程序执行到td.DoModal()后,就跳出ssd函数了
      

  9.   

    #include "stdafx.h"
    #include "MIPVAD.h"
    #include "testDlg.h"
    #include "afxdialogex.h"
    // testDlg dialogIMPLEMENT_DYNAMIC(testDlg, CDialog)testDlg::testDlg(CWnd* pParent /*=NULL*/)
    : CDialog(testDlg::IDD, pParent)
    {}testDlg::~testDlg()
    {
    }void testDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    }
    BEGIN_MESSAGE_MAP(testDlg, CDialog)
    END_MESSAGE_MAP()
      

  10.   

    正常时应该:
    testDlg *ptd=new testDlg;
    ptd->DoModal();
      

  11.   

    还是不行,为什么会直接跳出那个ssd()函数了呢,就是那个函数后面的语句都不执行了,直接去执行下一个函数了
      

  12.   

    testDlg::testDlg(CWnd* pParent /*=NULL*/)
    : CDialog(testDlg::IDD, pParent)
    {// F9 这里停一下看看?
        
    }
      

  13.   

    没有问题,下一步就到了ptd->DoModal();
      

  14.   

    那就加一个WM_INITDIALOG
    再停在入口
      

  15.   

    为什么我的class wiza里的message里没有WM_INITDIALOG呢?
      

  16.   

    难道是我的vs2010的问题?但是虚函数选项里有OnInitDialog,应该一样的吧?
      

  17.   

    有了就行:点 OnInitDialog 加函数,
    停入口那里看看
      

  18.   

    程序执行到ptd->DoModal();转入OnInitDialog 函数正常执行,但是执行完OnInitDialog 函数并不显示对话框,而且转回后调用它的函数ssd()后面的语句都不执行了,而是去执行下一个函数了?
      

  19.   

    在OnCancel和OnOK中停停看。
    是不是系统没安装好?
      

  20.   

    #pragma once
    #include <string>
    #include <map>
    #include <math.h> // ok
    class CMIPVADDlg;
    class CDataDlg;
    class C2DDlg;
    class CDicomArrayBox;
    //
    class CDataContext;
    class C3DDlg;
    class CVRTDlg;
    class CVolumeRender;
    class CSSDDlg;
    class CSurfaceRender;
    class CMPRDlg;
    class CMPRTHICKDlg;
    class CMIPDlg;
    class CMIPTHINDlg;
    class CCTSlice;
    class VrtVolumeRenderingSystem;
    class CParaLine;
    class CCADDlg;
    class VOLUME;
    class CIsoSetDlg;
    class testDlg;
    class CMipvadKernel
    {
    public:
    CMipvadKernel(void);
    ~CMipvadKernel(void); // GUI
    void initGUI();
    inline CMIPVADDlg* getMainDlg();
    inline CDataDlg& getDataDlg();
    inline C2DDlg& get2DDlg();
    inline C3DDlg& get3DDlg();
    void clear3DDlg();
    inline CVRTDlg& getVRTDlg();
    inline CSSDDlg& getSSDDlg();
    inline CMPRDlg& getMPRDlg();
    inline CMPRTHICKDlg& getMPRTHICKDlg();
    inline CMIPDlg& getMIPDlg();
    inline CMIPTHINDlg& getMIPTHINDlg();
    inline CCADDlg& getCADDlg();
    void mainResize();
    void tabChange(); // 数据
    CDataContext *context;
    void DataSearch(CString path);
    void OnTvnSelchangedTreeDicomShow(HTREEITEM item);
    void load();
    void DirectLoad(CString path, int gourpIndex, int firstInstance, int lastInstance); std::map<HTREEITEM,CString> items; //2d
    CDicomArrayBox *lightbox;
    void prepare2D();
    void setLBRect(CRect &rect, CDC *pDC);
    void LBdraw(CDC *pDC);
    void LBselect(CPoint &point);
    void LBMaxOne(CPoint &point);
    void OnLBVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    void LBreload();
    void LBinfo();
    void LBMaxSelected();
    void LBInvertColor();
    void LBVflip();
    void LBHflip();
    void LBLrotate();
    void LBRrotate();
    void LBSetWindow();
    void LBSetDefaultWindow();
    void LBguchuang();
    void LBfeichuang();
    void LBfuchuang();
    void LBzongge();
    void LBlunao();
    void LByaozhui();
    void LBgandan();
    void reloadImage();
    void invertImage();
    void rotateImage();
    void flipImageLr();
    void flipImageUd();
    void flipImageDj();
    void saveBmp(); //3d
    void prepare3D();
    void set3DWindow();
    void set3DDefaultWindow();
    void set3Dguchuang();
    void set3Dfeichuang();
    void set3Dfuchuang();
    void set3Dzongge();
    void set3Dlunao();
    void set3Dyaozhui();
    void set3Dgandan(); //# vrt
    void vrt();
    void vrtRender();
    void vrtResize();
    CVolumeRender *vr; //# ssd
    void ssd(int minIso,int maxIso);
    void ssdRender();
    void ssdResize();
    void ssdLButtonDown(UINT nFlags, CPoint point);
    void ssdMouseMove(UINT nFlags, CPoint point);
    CSurfaceRender *sr;
       
    //# mpr
    void mpr();
    CCTSlice *ctSlice;
    CBitmap * bmpA, * bmpC, * bmpS; void  DisplayBitmap(CDC *pDC,CRect &r,CBitmap* mpBitmap);

    //# mpr thick thin
    void mprthick();
    void mipthin(); //# mip
    void mip();
    VrtVolumeRenderingSystem *vrs; //# vrt_old
    VOLUME *v ;
    void vrt_old_pre();
    void vrt_old_render();
    CPoint m_LeftDownPos;
    void vrt_old_A_LButtonDown(UINT nFlags, CPoint point);
    void vrt_old_A_MouseMove(UINT nFlags, CPoint point);
    void vrt_old_S_LButtonDown(UINT nFlags, CPoint point);
    void vrt_old_S_MouseMove(UINT nFlags, CPoint point);
    void vrt_old_C_LButtonDown(UINT nFlags, CPoint point);
    void vrt_old_C_MouseMove(UINT nFlags, CPoint point); //# paraLine
    void paraLine();
    void updatePLine();
    CParaLine *pLine; // CAD
    void ssdMouseWheel(UINT nFlags, short zDelta, CPoint pt);
    void ssdRButtonDown(UINT nFlags, CPoint point);
    };
      

  21.   

    我就是在那个ssd()函数里调用,然后就一直出现开始的那个问题
      

  22.   

    界面类 一定要从CWnd 或 CObject 派生。一般类不存在消息循环,不能用于图形界面。
      

  23.   

    代码是这样的:
    bool CInterfacePhsFile::GetInitWorkCaseNumer()
    {
    CCaseConDlg mCaseConDlg;
    mCaseConDlg.m_strCaseFileName = m_strDataFileName;
    //  int m_n;
    //  m_n=mCaseConDlg.DoModal();
    //  CString m_c;
    //  m_c.Format("%d",m_n);
    //  AfxMessageBox(m_c);
    // MSG msg;
    //        while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE));
    if(mCaseConDlg.DoModal()==IDOK/*&&SendMessage(WM_CLOSE)/*&&CommDlgExtendedError()*/)
    {
    m_iWorkCase = mCaseConDlg.m_iWorkCaseNumer;
    m_iInitCase = mCaseConDlg.m_iInitCaseNumer;
    m_iSpringLoadType = mCaseConDlg.m_iSpringLoadType;
    }
    else
    {
    // CommDlgExtendedError();
    return false;
    }
    return true;
    }
    注释的地方是我用来调试的,可以不用看,就是在if(mCaseConDlg.DoModal()==IDOK)之后GetInitWorkCaseNumer()函数的代码都不执行了,对话框就是闪了一下然后就没了,程序也执行不动了的
    初始化对话框函数中的代码是:
    BOOL CCaseConDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    CString strText;
    //ifstreamex fin;
    BOOL bInitSet = FALSE;
    BOOL bWorkSet = FALSE; //chenbl 2011.08.31 为了适应在VS2005 unicode方式编译,所以改成UEStdioFile
    //fin.open(m_strCaseFileName,ios::in); UEStdioFileIs mFile;
    if ( !mFile.Open( m_strCaseFileName, CFile::modeRead ) )
    return TRUE; while( mFile.ReadString( strText ) /*!fin.eof()*/ )
    {
    //fin.getline(strText.GetBufferSetLength(255),255);
    //strText.ReleaseBuffer();
    CString strLoad;
    strLoad.LoadString(IDS_ER_LOADCASE);
    if( strText.Find( strLoad ) != -1)
    {
    while( mFile.ReadString( strText ) /*!fin.eof()*/)
    {
    //fin.getline(strText.GetBufferSetLength(255),255);
    //strText.ReleaseBuffer();
    if( strText.IsEmpty() )
    continue;
    if( strText.Find( _T("-----------------------") ) != -1)
    break;
    int pos = m_InitListCtrl.AddString(strText);
    int pos1 = m_WorkListCtrl.AddString(strText);
    if (strText.Find( _T("SUS") ) != -1 && !bInitSet)
    {
    m_InitListCtrl.SetCurSel(pos);
    bInitSet = TRUE;
    }
    if (strText.Find( _T("OPE") ) != -1 && !bWorkSet)
    {
    m_WorkListCtrl.SetCurSel(pos1);
    bWorkSet = TRUE;
    }
    }
    break;
    }
    }
    //fin.close();
    mFile.Close(); return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }
    它就是打开那个文件去读,然后把想要的东西加到对话框的两个列表框中去,我调试之后它都读成功了,也返回了TRUE,但然后就是对话框闪了一下就不见了,程序就卡在了那里的,求大神解决