高手救命:建立一个非模式对话框,当对话框不为当前窗口时让它自行销毁。然后按一下自己设定的某个按键,重新建立一个窗口,结果出错。示源码;
在主窗口头文件的定义中加入
public:
MenuSet *m_MenuSet;按设定的按键处理:
if(m_MenuSet) m_MenuSet->SetActiveWindow(); //激活对话框
else
{
//创建非模态对话框
m_MenuSet=new MenuSet(this);
m_MenuSet->Create(IDD_DIALOG1,this);
}
::GetWindowRect(m_MenuSet->m_hWnd,&dlgsize);
m_MenuSet->ShowWindow(SW_SHOWNORMAL);
::SetWindowPos(m_MenuSet->m_hWnd,HWND_TOPMOST,tt.x,tt.y,dlgsize.right-dlgsize.left,dlgsize.bottom-dlgsize.top,SWP_SHOWWINDOW);在对话框的消息处理中,当对话框不为当前窗口时让它自行销毁:
LRESULT MenuSet::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message==134 && wParam==0 && lParam==0) DestroyWindow();
return CDialog::WindowProc(message, wParam, lParam);
}结果错误:“0x00483e6e”指令引用的"0xddddde81"内存,该内存不能为"READ"
在主窗口头文件的定义中加入
public:
MenuSet *m_MenuSet;按设定的按键处理:
if(m_MenuSet) m_MenuSet->SetActiveWindow(); //激活对话框
else
{
//创建非模态对话框
m_MenuSet=new MenuSet(this);
m_MenuSet->Create(IDD_DIALOG1,this);
}
::GetWindowRect(m_MenuSet->m_hWnd,&dlgsize);
m_MenuSet->ShowWindow(SW_SHOWNORMAL);
::SetWindowPos(m_MenuSet->m_hWnd,HWND_TOPMOST,tt.x,tt.y,dlgsize.right-dlgsize.left,dlgsize.bottom-dlgsize.top,SWP_SHOWWINDOW);在对话框的消息处理中,当对话框不为当前窗口时让它自行销毁:
LRESULT MenuSet::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message==134 && wParam==0 && lParam==0) DestroyWindow();
return CDialog::WindowProc(message, wParam, lParam);
}结果错误:“0x00483e6e”指令引用的"0xddddde81"内存,该内存不能为"READ"
其实,一般窗口的销毁可以用DestoryWindow(),对话框的销毁可以用EndDialiog().
EndDialog(IDOK);
DoModal()的返回值为IDOK,但不会执行用户定义的OnOK.
只要发送WM_CLOSE消息,就会有响应的函数处理的。
SendMessage(WM_CLOSE);
PostMessage(WM_CLOSE);void CTestDialog::OnButton1()
{
GetParent()->DestroyWindow();
}
窗口和对话框一起关
PostMessage(WM_QUIT);
SendMessage(WM_QUIT);//不行
无模式对话框用DestroyWindow();
用EndDialog
你再打开原对话框就有问题
无模式对话框
的OnOK,OnCance
都要重载
if(message==134 && wParam==0 && lParam==0)
{
DestroyWindow();
return TRUE;
}
我不是已经把对话框用 DESTROYWINDOW() 删除掉了吗?为什么结果错误:“0x00483e6e”指令引用的"0xddddde81"内存,该内存不能为"READ"
if(m_MenuSet) m_MenuSet->SetActiveWindow(); //激活对话框
你销毁对话框后并没有delete menuSet以及置menuSet为Null,所以下次按键时还是会调用SetActiveWindow(),但是这个窗口已经被销毁了,所以出错了?
void MenuSet::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this; //删除对话框对象
CDialog::PostNcDestroy();
}因此当再次调用时,m_MenuSet应该为NULL
{
// TODO: Add your specialized code here and/or call the base class
delete this; //删除对话框对象
CDialog::PostNcDestroy();
}
好象有问题啊自己内部DELETE自己?
不行吧
if (IsWindow(m_MenuSet->m_hWnd)) m_MenuSet->SetActiveWindow();
else{...}