自绘标题栏及最大化最小化关闭按钮,点关闭出现运行时错误

看着捉急 2013-03-11 02:46:52
单文档结构的程序,在OnNcPaint中自绘标题栏及最大化最小化关闭按钮,点关闭,窗口关闭后立刻出现运行时错误,最小化最大化正常。关键代码如下
void CMainFrame::OnNcPaint()
{
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CFrameWndEx::OnNcPaint()



CRect rcWnd;
GetWindowRect(&rcWnd);
rcWnd.OffsetRect(-rcWnd.TopLeft());
int cxBorder = GetSystemMetrics(SM_CXFRAME);
int cyBorder = GetSystemMetrics(SM_CYFRAME);
int cyButton = GetSystemMetrics(SM_CYSIZE);
int cxButton = GetSystemMetrics(SM_CXSIZE);
m_rcCaption = rcWnd;
m_rcCaption.bottom = m_rcCaption.top + cyBorder + cyButton + 2;

CPoint p1,p2;
p1.SetPoint(rcWnd.right - cxBorder, rcWnd.top + 18);
p2.SetPoint(rcWnd.right - cxBorder - 45, rcWnd.top);
m_rcClose.SetRect(p2, p1);
p1.x -= 45;
p2.x -= 34;
m_rcMax.SetRect(p2, p1);
p1.x -= 34;
p2.x -= 34;
m_rcMin.SetRect(p2, p1);

CDC *dc = GetWindowDC();
CBrush br(RGB(0x3a, 0x3a, 0x3a));
CBrush *pOldBrush = dc->SelectObject(&br);
dc->Rectangle(&m_rcCaption);
m_ilClose.Draw(dc, 0, CPoint(m_rcClose.left, m_rcClose.top), ILD_NORMAL);
m_ilMax.Draw(dc, 0, CPoint(m_rcMax.left, m_rcClose.top), ILD_NORMAL);
m_ilMin.Draw(dc, 0, CPoint(m_rcMin.left, m_rcClose.top), ILD_NORMAL);
dc->SelectObject(pOldBrush);
ReleaseDC(dc);


}

void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CFrameWndEx::OnActivate(nState, pWndOther, bMinimized);

// TODO: 在此处添加消息处理程序代码
SendMessage(WM_NCPAINT);
}

LRESULT CMainFrame::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rcWnd;
GetWindowRect(&rcWnd);
point.Offset(-rcWnd.TopLeft());
if (m_rcMax.PtInRect(point) || m_rcMin.PtInRect(point))
{
return HTSYSMENU;
}
if (m_rcClose.PtInRect(point))
{
return HTCLOSE;
}
return CFrameWndEx::OnNcHitTest(point);
}

void CMainFrame::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rcWnd;
GetWindowRect(&rcWnd);
point.Offset(-rcWnd.TopLeft());
if (m_rcClose.PtInRect(point))
{
SendMessage(WM_CLOSE);
}
if (m_rcMax.PtInRect(point))
{
if (IsZoomed())
{
SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.y, point.x));
}
else if(!IsIconic())
{
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.y, point.x));
}

}
if (m_rcMin.PtInRect(point))
{
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.y, point.x));
}
CFrameWndEx::OnNcLButtonUp(nHitTest, point);
}

CRect m_rcClose CRect m_rcMax; CRect m_rcMin;
CImageList m_ilClose, m_ilMax, m_ilRecover, m_ilMin;
这几个都是框架窗口的成员,请大神帮我找出错误,小弟不胜感激!
...全文
131 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
看着捉急 2013-03-11
  • 打赏
  • 举报
回复
已解决,我突然发现原来那个 CMainFrame::OnNcLButtonUp(UINT nHitTest, CPoint point)中最后的默认调用CFrameWndEx::OnNcLButtonUp(nHitTest, point)就是罪魁祸首,删了就好了
看着捉急 2013-03-11
  • 打赏
  • 举报
回复
可以,在CWnd::default()处错误,点击了关闭后的最后调用关系为CMainFrame::OnNcLButtonUp,调用CWnd::OnMDIActivate,再调用CWnd::Default();不明白这个
jimette 2013-03-11
  • 打赏
  • 举报
回复
窗口关闭后立刻出现运行时错误 不可以断点?
看着捉急 2013-03-11
  • 打赏
  • 举报
回复
补充:同样的做法在基于对话框的程序中,没有问题

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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