Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2095527
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 21:48:24

一起学习
实现类似VC中可设断点的编辑窗口
作者: cuick

下载本文示例源代码

运行效果图如下:



想做一个跟踪调试工具,于是到网上找类似VC可设置断点的EditView,可惜没找到(呵呵,俺E文不好,没去国外站点找)。那就自己做一个吧!!
唉!!为了这个小东西俺可是走了不少弯路!!
还好,今天终于做好了,拿出来与大家分享。

1、 创建一个工程………………俺不多说了,记住要选CeditView.
2、 在OnInitialUpdate()中设置EDIT的Margin,当然留出的空间用来画断点或行号等。并得到行高。

SIZE size;

GetTextExtentPoint(GetDC()->GetSafeHdc (),"A",1,&size);

m_LineHeight = size.cy;		//得到行的高度



CEdit& theEdit = GetEditCtrl ();

theEdit.SetMargins (m_LineHeight 6,0);	//设置编辑框的左边界

theEdit.SetLimitText(10 * 1024);	//设置输入的最大文本

3、 保存断点的行号我用STL的list。
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);

}

4、 添加一个用于描画左边显示条的函数
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 ();

}

5、 处理鼠标左键单击,添加删除断点。
if(point.x < m_LineHeight 6)

{

		point.x  = 20;

		CEdit& theEdit = GetEditCtrl ();

		int n = theEdit.CharFromPos(point);

		AddRemoveBP(HIWORD(n) 1);

}

6、 再加一个热键处理得到当前光标所在的行。
CEdit& theEdit = GetEditCtrl ();

int newpoint = theEdit.LineFromChar (-1)   1;

AddRemoveBP(newpoint);

7、 在一些必要的消息处理后面调用PaintLeft。OK!大功告成!!(^%$#@#@$#$$%……呵呵,俺想起小宝…………)

下载本文示例代码


实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口实现类似VC中可设断点的编辑窗口
阅读(399) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~