如何在CRichEditView显示行号?

快乐小兵 2011-08-27 09:35:46
现在要用MFC做一个代码文本编辑器。

现在的想法是生成一个基于CRichEditView单文档结构的程序。读入一个txt文件,有什么办法可以做一个在右边显示行号的功能?自己画?当滚动条移动的时候,如何即时更新呢?

求大牛指导。
...全文
298 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑桃_杰克 2011-08-28
  • 打赏
  • 举报
回复
标记下,同问
linxren 2011-08-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110822/11/69b9b7d4-b4e2-46e5-a2ce-d0b8a81e6179.html
这是我写的编辑器,但不是基于CRichEditView的。我是从CWnd直接重绘的。以前写过从CRichEdit来写,但是不满意。
LRESULT CExRichEdit::WndProcNew(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{
CExRichEdit * pWnd = NULL;
pWnd = (CExRichEdit *)CWnd::FromHandlePermanent( hWnd );
if( pWnd == NULL ){
return 0;
}
if( !(pWnd->m_Style & EX_RICHEDIT_LN) )
{
return CallWindowProc(pWnd->WndProcOld, hWnd, uMsg, wParam, lParam);
}
if( uMsg == WM_PAINT )
{
CallWindowProc(pWnd->WndProcOld, hWnd, uMsg, wParam, lParam);

HDC hDC = ::GetDC( hWnd );
CDC * pDC = new CDC;
pDC->Attach( hDC );
pDC->SetBkMode(TRANSPARENT);
//------------------------------------------------------------------------------------------------------
CDC MemDC;
CRect rect;
CBitmap m_Canvas;
pWnd->GetClientRect(&rect);
MemDC.CreateCompatibleDC(pDC);
m_Canvas.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
MemDC.SelectObject(&m_Canvas);
MemDC.SetBkMode(TRANSPARENT);
//-------------------------------------------------------------------------------------------------------------
CRgn rgn2;
rgn2.CreateRectRgn( rect.left, rect.top, rect.left+pWnd->m_nweigth, rect.bottom );
MemDC.SelectClipRgn(&rgn2); // 裁剪边框

CRgn rgn1;
rgn1.CreateRectRgn( rect.left+pWnd->m_nweigth, rect.top, rect.right, rect.bottom );
// pWnd->RedrawWindow(0, &rgn1, RDW_INVALIDATE);

LOGFONT lf;
HFONT hFont,oldFont;

GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);
lf.lfHeight = -pWnd->m_cf.yHeight/15;
lf.lfWidth = 7;
lf.lfWeight = 300;
wsprintf( lf.lfFaceName, _T("%s"), _T("隶书") );
hFont = CreateFont(lf.lfHeight, lf.lfWidth,
lf.lfEscapement, lf.lfOrientation, lf.lfWeight,
lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet,
lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality,
lf.lfPitchAndFamily, lf.lfFaceName);
oldFont = (HFONT)pDC->SelectObject( hFont ); // 设置字体

CBrush BrushOver;
BrushOver.CreateSolidBrush( pWnd->m_nbclr ); // 行号底色底色
rect.right = pWnd->m_nweigth-7;
MemDC.FillRect( &rect, &BrushOver );

CPen PenLine;
PenLine.CreatePen(PS_INSIDEFRAME | PS_DOT, 1, pWnd->m_nclr);
pDC->SelectObject( &PenLine );
pDC->MoveTo( rect.right, rect.top);
pDC->LineTo( rect.right, rect.bottom);
BrushOver.DeleteObject();
PenLine.DeleteObject();

long s,e;
pWnd->GetSel( s,e);
CPoint pt, sPt, ePt;
COLORREF colorref = RGB( 255, 255, 255 );
colorref ^= pWnd->m_nclr; // 与背景色异或
int nSNum = pWnd->GetFirstVisibleLine(); // 可显第一行
int nLNum = pWnd->GetLineCount(); // 总行数
int nLVis = nLNum - nSNum;
CString sLNum;
for( int i=0; i<nLVis; i++)
{
sPt = pWnd->PosFromChar( s );
ePt = pWnd->PosFromChar( e );
pt = pWnd->PosFromChar( pWnd->LineIndex(nSNum+i) );
if( pt.y >= sPt.y && pt.y <= ePt.y ) MemDC.SetTextColor( colorref ); // 行号颜色
else MemDC.SetTextColor( pWnd->m_nclr);
sLNum.Format( _T("%4d"), nSNum+i);
MemDC.TextOut( 0, pt.y, sLNum , sLNum.GetLength() ); //绘制行号
}
//-------------------------------------------------------------------------------------------------
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);

MemDC.SelectObject( oldFont );
DeleteObject( hFont );
MemDC.DeleteDC();
pDC->DeleteDC();
delete pDC;
return 0;
}
return CallWindowProc(pWnd->WndProcOld, hWnd, uMsg, wParam, lParam);
}

void CExRichEdit::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
long eventmask = GetEventMask() | ENM_PROTECTED | ENM_CHANGE;
SetEventMask( eventmask );

PostMessage( (UINT) EM_SETMARGINS , EC_LEFTMARGIN, (LPARAM)m_nweigth );
WndProcOld = (WNDPROC)SetWindowLong(this->GetSafeHwnd(), GWL_WNDPROC, (LONG)WndProcNew);

SetBackgroundColor( 0, m_bclr);
ExSetFont( m_cf );

// this->SetSel(charrange &cr );

CRichEditCtrl::PreSubclassWindow();
}
Eleven 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 wuxianbin1992 的回复:]
现在要用MFC做一个代码文本编辑器。

现在的想法是生成一个基于CRichEditView单文档结构的程序。读入一个txt文件,有什么办法可以做一个在右边显示行号的功能?自己画?当滚动条移动的时候,如何即时更新呢?

求大牛指导。
[/Quote]
可以参考Scintilla,开源的http://www.scintilla.org/
linxren 2011-08-28
  • 打赏
  • 举报
回复
只能重绘。没有别的办法~

15,979

社区成员

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

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