我做了一个对话框,上面就一个按钮,一个静态文本框,其中这个静态文本框比较大,在程序中我会通过MoveWindow的方式把一个属性表单移到静态文本框上。
由于属性表单有多个属性页,每个属性页又有一些不同数据,我设置一个按钮,相应其单击消息,在消息相应函数里对属性表单的数据进行合法性检查,不合法的弹出对话框提示。结果当MessageBox时,程序像死了一样,经过我调试发现,程序一直在反复执行
LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
函数,这是wincore.cpp中的函数。
此时参数中的hWnd为属性表单(不是属性页)的句柄,nMsg的值为135请大家帮我想下,为什么会出现死循环,该如何解决呢?
由于属性表单有多个属性页,每个属性页又有一些不同数据,我设置一个按钮,相应其单击消息,在消息相应函数里对属性表单的数据进行合法性检查,不合法的弹出对话框提示。结果当MessageBox时,程序像死了一样,经过我调试发现,程序一直在反复执行
LRESULT CALLBACK
AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
函数,这是wincore.cpp中的函数。
此时参数中的hWnd为属性表单(不是属性页)的句柄,nMsg的值为135请大家帮我想下,为什么会出现死循环,该如何解决呢?
这跟你编写的流程有关,
肯定不是Messagebox的问题。
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;
}
}
方便的话,代码发给我看看:[email protected]
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;
出的问题。
{
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;
}
}
我根据你的提示,试着在各处加MessageBox。结果只在一种情况下出现异常,那就是当我把MessageBox置于Maker.SetActivePage(pSelectStyleDlg); 后面时。于是,我干脆直接注释了这句话,结果对话框弹出全部正常了。我想请问的是,为什么会出现这个现象呢?关键是如何解决呢?