1 新建MDI,在CView的头文件里面添加
#include <list>
using namespace std;
typedef list<int> IntList;
2 在CView里面添加成员
public:
int m_LineHeight;
BOOL m_ldown;
IntList lBreakPoint;
void PaintLeft();
void AddRemoveBP(int point);
3 修改其他代码如下
void CBreakPointDemoView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_ldown = TRUE;
PaintLeft();
CEditView::OnLButtonDown(nFlags, point);
}
void CBreakPointDemoView::PaintLeft()
{
CBrush brushb(RGB(245, 245, 230));
int m_breakpoint;
CDC* hdc;
hdc = GetWindowDC();
CRect rect;
GetClientRect(&rect);
hdc->FillRect(CRect(rect.left + 2, rect.top + 2, rect.left + m_LineHeight + 7, rect.Height() + 2), &brushb);//画底色
brushb.DeleteObject();
CEdit& theEdit = GetEditCtrl();
int nFirstVisible = theEdit.GetFirstVisibleLine();
//*
CBrush OrigBrush, brushf(RGB(255, 0, 0));
CBrush* oldBrush = (CBrush*)hdc->SelectObject(brushf);
OrigBrush.FromHandle((HBRUSH)oldBrush);
IntList::iterator it;
for (it = lBreakPoint.begin(); it != lBreakPoint.end(); it++)
{
m_breakpoint = *it;
if (m_breakpoint > nFirstVisible)
{
int point = (m_breakpoint - 1 - nFirstVisible) * m_LineHeight + 3;
if (point < (rect.bottom - m_LineHeight + 1))
{
hdc->Ellipse(rect.left + 5, point, rect.left + m_LineHeight + 4, point + m_LineHeight);
}
}
}
hdc->SelectObject(&OrigBrush);
OrigBrush.DeleteObject();
brushf.DeleteObject();
}
void CBreakPointDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rect;
GetClientRect(&rect);
InvalidateRect(CRect(rect.left + 2, rect.top + 2, rect.left + m_LineHeight + 7, rect.Height() + 2));
CEditView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CBreakPointDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_ldown == TRUE)
PaintLeft();
CEditView::OnMouseMove(nFlags, point);
}
void CBreakPointDemoView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_ldown = FALSE;
if (point.x < m_LineHeight + 6)
{
point.x += 20;
CEdit& theEdit = GetEditCtrl();
int n = theEdit.CharFromPos(point);
AddRemoveBP(HIWORD(n) + 1);
}
PaintLeft();
CEditView::OnLButtonUp(nFlags, point);
}
void CBreakPointDemoView::AddRemoveBP(int point)
{
IntList::iterator it;
it = find(lBreakPoint.begin(), lBreakPoint.end(), point);
if (it != lBreakPoint.end())
lBreakPoint.erase(it);
else
lBreakPoint.push_back(point);
}
void CBreakPointDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CEditView::OnPaint()
PaintLeft();
}