自绘标题栏及最大化最小化关闭按钮,点关闭出现运行时错误
单文档结构的程序,在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;
这几个都是框架窗口的成员,请大神帮我找出错误,小弟不胜感激!
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;
这几个都是框架窗口的成员,请大神帮我找出错误,小弟不胜感激!
...全文
相关推荐
禁用标题栏上的最大化、最小化和关闭按钮
总之,禁用标题栏上的最大化、最小化和关闭按钮主要通过编程手段实现,根据不同的开发环境和编程语言选择相应的方法。
VC 自绘窗口标题栏、边框、最大化、最小化、关闭按钮
标题栏、边框、最大化、最小化以及关闭按钮是窗口的基本元素,自绘这些元素可以让程序的界面更加独特和专业。本文将深入探讨如何在VC++中实现自绘窗口标题栏以及与之相关的控制功能。
QT自定义标题栏最大最小化关闭按钮
在QT自定义标题栏最大最小化关闭按钮这个主题中,我们将深入探讨如何在QT应用程序中实现自定义的标题栏,包括最大化、最小化和关闭功能。
Qt无边框、阴影、圆角、可拖动、有最大化最小化关闭按钮美观UI窗口
、最小化、关闭按钮"。
Winform去掉最大化最小化关闭按钮
总结来说,要实现“Winform去掉最大化最小化关闭按钮”的功能,主要步骤包括:改变`FormBorderStyle`为`None`,设置`ControlBox`为`false`,重写`ProcessCmdKey


界面
