Esempio n. 1
0
void CSectionCon::OnPaint()///////////////////////
{
	CPaintDC dc(this); // device context for painting
					   // TODO: Add your message handler code here
					   // Do not call CRichEditCtrl::OnPaint() for painting messages
	Graphics gra(dc);
	CRect clientRect;
	CRect abstractRect;
	GetClientRect(clientRect);
	dc.FillSolidRect(clientRect, RGB(255, 255, 255));

	Gdiplus::FontFamily ff(_T("微软雅黑"));
	Gdiplus::Font font(&ff,15,FontStyle::FontStyleUnderline|FontStyleBold);
	SolidBrush brush(Color(255,20, 10, 90));
	Gdiplus::StringFormat sf;
	sf.SetTrimming(StringTrimmingEllipsisPath);
	sf.SetHotkeyPrefix(HotkeyPrefixHide);///////////////////选择'&'的处理
	gra.SetTextRenderingHint(TextRenderingHint::TextRenderingHintSingleBitPerPixelGridFit);
	gra.DrawString(mtitle, mtitle.GetLength(), &font,RectF(20,0,clientRect.Width()-40,30),&sf,&brush);///////////////绘制标题
	RectF titleRectF;
	gra.MeasureString(mtitle, mtitle.GetLength(), &font, RectF(20, 0, clientRect.Width() - 40, 30), &sf, &titleRectF);
	titleWidth=titleRectF.Width;////////////////计算标题的宽度
	Gdiplus::Font font2(&ff, 10);
	SolidBrush brush2(Color(255,0,0,0));
	gra.DrawString(mabst, mabst.GetLength(), &font2, RectF(20, 34, clientRect.Width() - 40, clientRect.Height() - 40), &sf, &brush2);/////////准备绘制摘要
	//////////////////准备高亮关键字
	int count=0;
	for (int i = 0;i < mabst.GetLength();i++)
	{
		i = mabst.Find('&', i);
		if (i == -1)
			break;
		count++;
		i++;
	}
	if (count > 30)///////////////////限制高亮个数,提升性能
		count = 30;
	CharacterRange *cr=new CharacterRange[count];
	for (int i = 0, j = 0;i < count;i++)
	{
		j = mabst.Find('&', j);///////////找到‘&’
		cr[i].First = j + 1;//////找到高亮目标
		j = j + 1;
		cr[i].Length = 1;/////////////
	}
	Region *region = new Region[count];////////////保存所有关键字所在的位置
	sf.SetMeasurableCharacterRanges(count, cr);
	gra.MeasureCharacterRanges(mabst, mabst.GetLength(), &font2, RectF(20, 34, clientRect.Width() - 40, clientRect.Height() - 40), &sf, count, region);
	RectF rect;//////////关键字所在矩形位置
	SolidBrush bru(Color(255, 100, 0));//////////高亮字体颜色
	SolidBrush bru2(Color(255, 255, 255));/////////////删除色,用于删除原来的绘制的字
	for (int i = 0;i < count;i++)
	{
		region[i].GetBounds(&rect, &gra);
		if (rect.X >= 20)
		{
			gra.FillRectangle(&bru2, rect);
			rect.X = rect.X - 3;
			gra.DrawString(mabst.Mid(cr[i].First), 1, &font2, rect, &sf, &bru);
		}
	}
	delete[] cr;
	delete[] region;

	//CharacterRange cr;
	//Region re;////////////关键字所在区域
	//RectF rec;///////////////关键字所在的矩形区域
	//SolidBrush bru(Color(255, 100, 0));//////////高亮字体颜色
	//SolidBrush bru2(Color(255, 255, 255));/////////////删除色,用于删除原来的绘制的字
	//for (int i = 0,j=0;i < count;i++)//////////////////////将每一个关键字高亮
	//{
	//	j=mabst.Find('&', j);
	//	cr.First = j+1;
	//	j = j + 1;
	//	cr.Length = 1;
	//	sf.SetMeasurableCharacterRanges(1, &cr);
	//	gra.MeasureCharacterRanges(mabst, mabst.GetLength(), &font2, RectF(20, 34, clientRect.Width()-40, clientRect.Height()-40), &sf, 1, &re);
	//	re.GetBounds(&rec, &gra);
	//	//rec.Width += 4;
	//	gra.FillRectangle(&bru2,rec);
	//	rec.X = rec.X - 3;
	//	gra.DrawString(mabst.Mid(j), 1, &font2, rec, &sf, &bru);
	//}
}