请教一个mfc 按钮的问题

arsenal198689 2010-05-30 04:34:06
界面里面create一个按钮,名字“退出”,响应exit(0);界面一开始全屏(只有视
图无框架的那种),按esc退出全屏,然后点击全屏再次进入全屏,这时点击“退出”,会经常出现内
存错误,也少数几次能正常退出。其他按钮按了却没有这个问题,试过debug和realse模式,无果;求教版友。谢谢~
...全文
108 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
西部流云 2010-05-31
  • 打赏
  • 举报
回复
没有释放指针,建议楼主贴出代码
arsenal198689 2010-05-31
  • 打赏
  • 举报
回复
不好意思,我懒了,现在把代码贴一下
view里面退出按键的响应函数
void CFullScreenView::OnExit()
{
exit(0);
//PostQuitMessage(0);
}

frame框架的全屏函数
void CMainFrame::OnViewFullScreen()
{
if(m_bIsFull)
{
return;
}
m_bIsFull=TRUE;

m_bViewTool=m_wndToolBar.IsWindowVisible();
m_bViewStatus=m_wndStatusBar.IsWindowVisible();
//记录要显示的视图当前位置
CView *pView=this->GetActiveView();
pView->LockWindowUpdate();
pView->GetWindowPlacement(&m_plcView);
pView->UnlockWindowUpdate();

//记录主框架的当前位置
this->LockWindowUpdate();
this->GetWindowPlacement(&m_plcWnd);
this->UnlockWindowUpdate();

//隐藏工具栏和状态栏
ShowControlBar(&m_wndToolBar,FALSE,FALSE);
ShowControlBar(&m_wndStatusBar,FALSE,FALSE);

//求得全屏大小
::SystemParametersInfo(SPI_GETWORKAREA,0,&m_rectDesktop,0);
m_rectDesktop.right=::GetSystemMetrics(SM_CXSCREEN);
m_rectDesktop.bottom=::GetSystemMetrics(SM_CYSCREEN);
m_rectDesktop.right+=m_rectDesktop.left;
m_rectDesktop.bottom+=m_rectDesktop.top;

//计算以全屏为客户区时的窗体大小
CRect rectHold=m_rectDesktop;
::AdjustWindowRect(&m_rectDesktop,this->GetStyle(),TRUE);
m_rectDesktop.bottom+=::GetSystemMetrics(SM_CYBORDER);


//设置主框架窗体位置和大小
WINDOWPLACEMENT plcHold=m_plcView;
plcHold.showCmd=SW_SHOWNORMAL;
plcHold.rcNormalPosition=m_rectDesktop;
this->LockWindowUpdate();
this->SetWindowPlacement(&plcHold);
this->UnlockWindowUpdate();

//设置客户区窗体的位置和大小
plcHold.rcNormalPosition=rectHold;
::AdjustWindowRect(&(plcHold.rcNormalPosition),pView->GetStyle(),FALSE);
pView->LockWindowUpdate();
pView->SetWindowPlacement(&plcHold);
pView->UnlockWindowUpdate();



}
view类里面按esc来响应下面的函数
void CFullScreenView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar==VK_ESCAPE)
{
((CMainFrame*)AfxGetMainWnd())->EscapeFullScreen();
return;
}
CView::OnChar(nChar, nRepCnt, nFlags);
}

退出全屏函数如下:
void CMainFrame::EscapeFullScreen
{
if(!m_bIsFull)
{
return;
}
m_bIsFull=FALSE;
//AfxMessageBox("escape");



//恢复主窗体
CView *pView=this->GetActiveView();
pView->LockWindowUpdate();
pView->SetWindowPlacement(&m_plcView);
pView->UnlockWindowUpdate();

//恢复主框架窗体
LockWindowUpdate();
SetWindowPlacement(&m_plcWnd);
UnlockWindowUpdate();
ShowControlBar(&m_wndToolBar,m_bViewTool,FALSE);
ShowControlBar(&m_wndStatusBar,m_bViewStatus,FALSE);

}

执行顺序依次是OnViewFullScreen()、EscapeFullScreen、OnViewFullScreen(),这时按下退出键就出现问题。
postquitmessage用了不出现问题,谢谢ls的回答~期待对exit的解释,多谢各位!

zhlandwufei 2010-05-30
  • 打赏
  • 举报
回复
PostQuitMessage(0);
arsenal198689 2010-05-30
  • 打赏
  • 举报
回复
对了,退出按钮响应函数就一句,exit(0),而内存报错也就是在这里出现的,说什么read 0x0000004地址出错,请高手帮我想想,能有什么情况产生这样的问题。谢谢了
NIKE霸天虎 2010-05-30
  • 打赏
  • 举报
回复
一个是重复创建,另一个看看退出时按钮的生存是否
lxl843 2010-05-30
  • 打赏
  • 举报
回复
你在退出前把m_btn3销毁掉
lxl843 2010-05-30
  • 打赏
  • 举报
回复
应该是重复创建按钮了
arsenal198689 2010-05-30
  • 打赏
  • 举报
回复
m_btn3.Create("退 出",WS_CHILD|WS_BORDER|WS_VISIBLE,CRect(630,399,726,439),this,IDC_EXIT);
在view的oncreate里面创建的
lxl843 2010-05-30
  • 打赏
  • 举报
回复
按钮是控件还是动态创建的

16,471

社区成员

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

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

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