我做了一个对话框,上面就一个按钮,一个静态文本框,其中这个静态文本框比较大,在程序中我会通过MoveWindow的方式把一个属性表单移到静态文本框上。
由于属性表单有多个属性页,每个属性页又有一些不同数据,我设置一个按钮,相应其单击消息,在消息相应函数里对属性表单的数据进行合法性检查,不合法的弹出对话框提示。结果当MessageBox时,程序像死了一样,经过我调试发现,程序一直在反复执行
LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
函数,这是wincore.cpp中的函数。
此时参数中的hWnd为属性表单(不是属性页)的句柄,nMsg的值为135请大家帮我想下,为什么会出现死循环,该如何解决呢?

解决方案 »

  1.   


    这跟你编写的流程有关,
    肯定不是Messagebox的问题。
      

  2.   

    估计你的MessageBox引起了死循环等,需要检查你的代码
      

  3.   

    MessageBox在哪里写的(哪个函数里边)?
      

  4.   

    我把我的主要代码贴出来:
    void CMakerDlg::OnExport()
    {
    // TODO: Add your command handler code here
    CheckInvalidate();
    }BOOL CMakerDlg::CheckInvalidate()
    {
    CString strCaption = _T(""), strPrompt = _T("");
    strCaption.LoadString(IDS_CAPTION); //check the case that user has selected style
    CSelectStyle *pSelectStyleDlg = const_cast<CSelectStyle*>(&(Maker.GetSelectStyleDlg()));
            //Maker即为属性表单,CSelectStyle即为其中一个属性页对应的类,我在表单类写了一个函数GetSelectStyleDlg用来获取相应的属性页
    if (pSelectStyleDlg->GetStyle() <= 0)
    {
    Maker.SetActivePage(pSelectStyleDlg);
    strPrompt.LoadString(IDS_HAVENOSEL);
    MessageBox(strPrompt, strCaption, MB_ICONEXCLAMATION);
    return FALSE;
    }
    }
      

  5.   

    很奇怪。
    方便的话,代码发给我看看:[email protected]
      

  6.   

    我的属性表单一共有4个属性页,有个奇怪的现象,就是当我把四格属性页都点一下的时候,对话框是可以弹出来的。而如果不点而直接进入判断阶段,则对话框弹不出来,进入死循环。而且,调试突然发现好像在
    LRESULT CALLBACK
    _AfxActivationWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)函数的
                               case WM_INITDIALOG:
    {
    DWORD dwStyle;
    CRect rectOld;
    CWnd* pWnd = CWnd::FromHandle(hWnd);
    _AfxPreInitDialog(pWnd, &rectOld, &dwStyle);
    bCallDefault = FALSE;
    lResult = CallWindowProc(oldWndProc, hWnd, nMsg, wParam, lParam);
    _AfxPostInitDialog(pWnd, rectOld, dwStyle);
    }
    break;
    出的问题。
      

  7.   

    BOOL CMakerDlg::CheckInvalidate() 

    CString strCaption = _T(""), strPrompt = _T(""); 
    strCaption.LoadString(IDS_CAPTION); //check the case that user has selected style 
    CSelectStyle *pSelectStyleDlg = const_cast <CSelectStyle*>(&(Maker.GetSelectStyleDlg())); 
            //Maker即为属性表单,CSelectStyle即为其中一个属性页对应的类,我在表单类写了一个函数GetSelectStyleDlg用来获取相应的属性页 是不是这儿出了问题,你试试在CheckInvalidate()函数里直接MessageBox(...)会不会出错。if (pSelectStyleDlg->GetStyle() <= 0) 

    Maker.SetActivePage(pSelectStyleDlg); 
    strPrompt.LoadString(IDS_HAVENOSEL); 
    MessageBox(strPrompt, strCaption, MB_ICONEXCLAMATION); 
    return FALSE; 

    }
      

  8.   

    回sillyou:
    我根据你的提示,试着在各处加MessageBox。结果只在一种情况下出现异常,那就是当我把MessageBox置于Maker.SetActivePage(pSelectStyleDlg); 后面时。于是,我干脆直接注释了这句话,结果对话框弹出全部正常了。我想请问的是,为什么会出现这个现象呢?关键是如何解决呢?
      

  9.   

    你跟到 SetActivePage 这里面,你的Maker是否都AddPage添加了对应的属性页等
      

  10.   

    跟踪的结果,其实就是调用单个属性页的OnSetActive函数啊,我的所有初始化工作都在OnInitDialog里面做么,这个函数并无使用。仍然困惑中...
      

  11.   

    是不是killfocuce之后又setfocuce了?
      

  12.   

    是不是MessageBox间接的被刷新触发了。
      

  13.   

    也有可能是什么消息触发MessageBox
      

  14.   

    检查MessageBox的弹出条件,怀疑死机是因为MessageBox时刻都成立;是否有定时器或者其他线程在运行?
      

  15.   

    http://topic.csdn.net/u/20090501/11/bf10f411-c81d-457d-9b9c-284de6a590f8.html
      

  16.   

    应该是界面重绘之后调用了MessageBox点击关闭MessageBox之后进行重绘又击活了MessageBox这样反反复复好像一个循环一样