捕捉键盘后,在程序中创建一新的有模式对话框。结束后为什么出现错误?

chen_pin 2003-09-14 09:13:45
我在主对话框中的BOOL CCPJHDlg::PreTranslateMessage(MSG* pMsg) 中加入了:
if(pMsg->message == WM_KEYDOWN) {
if(pMsg->wParam == VK_F2)
{
OnButton2();
}
....
}

void CCPJHDlg::OnButton2()
{
// TODO: Add your control notification handler code here

CDlgCSMan dlg_csm;
int nResponse;
nResponse=dlg_csman.DoModal();
}
按F2后弹出dlg_csm对话框,再按确定,dlg_csm消失后系统就会提示出错。这是怎么回事?
错误信息内容是:
Debug Assertion Failed!
Program:.........\CPJH.exe
File:wincore.cpp
Line:875

...
调试后,Wincore.cpp的部分内容是
// check for special wnd??? values
ASSERT(HWND_TOP == NULL); // same as desktop
if (m_hWnd == HWND_BOTTOM)
ASSERT(this == &CWnd::wndBottom);
else if (m_hWnd == HWND_TOPMOST)
ASSERT(this == &CWnd::wndTopMost);
else if (m_hWnd == HWND_NOTOPMOST)
ASSERT(this == &CWnd::wndNoTopMost);
else
{
// should be a normal window
第875行:-->> ASSERT(::IsWindow(m_hWnd));

// should also be in the permanent or temporary handle map
CHandleMap* pMap = afxMapHWND();
ASSERT(pMap != NULL);

CObject* p;
ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||
(p = pMap->LookupTemporary(m_hWnd)) != NULL);
ASSERT((CWnd*)p == this); // must be us

哪位高手可以指点一下,谢谢!!
...全文
75 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_pin 2003-09-14
  • 打赏
  • 举报
回复
继续关注,谢谢!
HongHuer 2003-09-14
  • 打赏
  • 举报
回复
告诉你个方向,你自己看看。


应该是系统资源临时对象的删除的问题。或者是 资源的问题。
我对这个问题也是抹零两可。

看清楚了说一下(我在《vc++技术内幕》上差点找到了答案,还差一点点。)
chen_pin 2003-09-14
  • 打赏
  • 举报
回复
我就是这么调试的,但是,看不懂,哪位高手可以指点下
调试框内容为:
Context:CWnd::AssertValid()
m_hWnd 0x00040a48
this 0x00422aa0{CTempWnd hWnd=0x00040a48}
lanfanghelanfanghe 2003-09-14
  • 打赏
  • 举报
回复
你是不是用到了,dlg_csm.UpdateData(TRUE);

好象是它的问题,我也不太清楚,以前我也做过,也是这个问题

HongHuer 2003-09-14
  • 打赏
  • 举报
回复
我使用的是 无模式 的,可以。


//.h
class CDialog_1 : public CDialog
{
//
protected:
char m_Title[64];

const int m_CLASSSIZE;
char m_Class[8][64];

//对话框
CDialog_1_1 * m_pDialog_1_1;
};

//.cpp
BOOL CDialog_1::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
//
//Esc key(VK_ESCAPE) prssed
//
case VK_ESCAPE:
Handle_KeyEsc();
return true;

//
//1 key(VK_1) prssed
//
case 0x31:
case 0x61:
Handle_Key1();
break ;
}
return CDialog::PreTranslateMessage(pMsg);
}

void CDialog_1::Handle_Key1(void)
{
Language language;
language = Chinese;
PopDialog(language);
}

void CDialog_1::PopDialog(Language & language)
{
if(m_pDialog_1_1->GetSafeHwnd() == 0)
{
m_pDialog_1_1->Create(IDD_DIALOG_1_1, this);
m_pDialog_1_1->SetLanguage(language);
m_pDialog_1_1->ShowWindow(SW_SHOW);
}
}

BOOL CDialog_1::DestroyWindow()
{
DeleteResource();
return CDialog::DestroyWindow();
}

void CDialog_1::NewResource(void)
{
m_pDialog_1_1 = new CDialog_1_1;
ASSERT(m_pDialog_1_1);
}

void CDialog_1::DeleteResource(void)
{
if(m_pDialog_1_1)
{
delete m_pDialog_1_1;
m_pDialog_1_1 = 0;
}
}
foxmail 2003-09-14
  • 打赏
  • 举报
回复
调试的时候打开
call stack
出错的时候按retry
foxmail 2003-09-14
  • 打赏
  • 举报
回复
调试的时候打开
call stack
出错的时候按retry
chen_pin 2003-09-14
  • 打赏
  • 举报
回复
我自己找到一个办法:就是再OnButton2()后面加入一句return 1;

if(pMsg->message == WM_KEYDOWN) {
if(pMsg->wParam == VK_F2)
{
OnButton2();
return 1;
}
....
}

不提示出错了,哪位高手分析一下,会不会还有什么可能存在的问题。
chen_pin 2003-09-14
  • 打赏
  • 举报
回复
Up it

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧