Add line numbering on crichedit control
step 1 :-----
SendMessage( hRichEdit, EM_SETMARGINS, EC_LEFTMARGIN, 70 );
step 2 :------
case WM_COMMAND:
switch( HIWORD(wParam) ){
case EN_UPDATE:
hRichEdit = FindWindowEx( hwnd, NULL, "RichEdit20A", NULL );
hdc = GetDC( hRichEdit );
makeLineNumber( hRichEdit, hdc );
ReleaseDC( hRichEdit, hdc );
break;
}
break;
step 3:----
void makeLineNumber( HWND hRichEdit, HDC hdc ){
/*get height of rich edit*/
RECT richEditRect;
SendMessage( hRichEdit, EM_GETRECT, 0 , (LPARAM)&richEditRect );
int iRectHeight = richEditRect.bottom - richEditRect.top;
/*get height of font being used*/
TEXTMETRIC tm;
GetTextMetrics( hdc, &tm );
/*use height of font and height of rich edit control to get the maximum number of lines
the edit control can hold, increase by one for additional line (necessary because rich
edit has smooth scrolling and shows partial line*/
int iMaxNumberOfLines = (iRectHeight/tm.tmHeight) + 1;
/*get first visible line*/
int iFirstVisibleLine = SendMessage( hRichEdit, EM_GETFIRSTVISIBLELINE, 0, 0 );
/*create integers to temporarily hold the line number/char*/
int iLineChar = 0;
int iLineNumber = 0;
/*loop cannot run more than the max number of lines in the edit control*/
for( int c = 0; c <= iMaxNumberOfLines; c++ ){
/*return value is the character index of the line specified in the wParam parameter,
or it is ?1 if the specified line number is greater than the number of lines in the
edit control. */
iLineChar = SendMessage( hRichEdit, EM_LINEINDEX, (iFirstVisibleLine + c ), 0 );
/*break if last line of edit control is reached*/
if( iLineChar == -1 )
break;
/*otherwise output line number*/
else{
iLineNumber = SendMessage( hRichEdit, EM_LINEFROMCHAR, (WPARAM)iLineChar, 0 );
std::stringstream strLineIndex;
strLineIndex << (iLineNumber + 1);
POINTL pl;
SendMessage( hRichEdit, EM_POSFROMCHAR, (WPARAM)&pl, (LPARAM)iLineChar );
RECT tmpRect;
tmpRect.right = 55; //right border is 55 (rich edit control left border is 70 so there is a gap of 15)
tmpRect.left = 0; //left border is flush with edge of window
tmpRect.bottom = richEditRect.bottom; //bottom is same as rich edit controls bottom
tmpRect.top = pl.y; //top is the y position of the characters in that line number
DrawText( hdc, strLineIndex.str().c_str(), strlen( strLineIndex.str().c_str() ), &tmpRect, DT_RIGHT );
}
}
}
Laur wrote:
CEditView and linie numbers
12-Dec-08
My apllication should display line numbers in a MDI applications Text windows
view. Each line should have its own line number, like:
00001 Some text
00002 Next line with text
00003 Another ....
Wordwrap is not on
Any hint?
Previous Posts In This Thread:
On Friday, December 12, 2008 4:39 AM
Laur wrote:
CEditView and linie numbers
My apllication should display line numbers in a MDI applications Text windows
view. Each line should have its own line number, like:
00001 Some text
00002 Next line with text
00003 Another ....
Wordwrap is not on
Any hint?
On Friday, December 12, 2008 10:43 AM
AliR \(VC++ MVP\) wrote:
You will have to write a custom control to that, which means you will have to
You will have to write a custom control to that, which means you will have
to write your own edit control from scratch.
See if this helps:
http://www.learnstar.com/AliR/HexView.zip
I wrote this sample while I was helping someone on here a couple of years
ago. All of the logic of the hex editor is in the HexViewView.cpp class.
AliR.
"Laurs" <Laurs@discussions.microsoft.com> wrote in message
news:81AC5C46-A075-48B0-A486-D3D74C804715@microsoft.com...
On Saturday, December 13, 2008 2:16 PM
Joseph M. Newcomer wrote:
Re: CEditView and linie numbers
There are three approaches:
(a) write your own edit control
(b) create your control borderless. Put a borderless control next to it, in which you put
the line numbers. Keep the two controls "in sync" as you scroll the edit control (it
isn't impossible, but is tedious)
(c) use rich edit, make the line numbers protected, keep them updated as you add or remove
lines (really tedious, as it turns out, but I've been told it is comparable to (b))
joe
On Fri, 12 Dec 2008 01:39:00 -0800, Laurs <Laurs@discussions.microsoft.com> wrote:
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm
On Monday, December 15, 2008 9:13 AM
Laur wrote:
HiThanks.
Hi
Thanks. I see both proposals as possible, but have ended with a more lazy
version. I just write the line number and caracter position (L,P) in a Pane
in my CStatusBar.
Only one thing is missing. When I move the caret(text cursor) with the
keyboard or mouse I get no event.
How can I get a notification for that in in my messagehandler:
BEGIN_MESSAGE_MAP(MICVIWTXT, GICVED)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
END_MESSAGE_MAP()
None of these
ON_WM_PAINT()
ON_WM_SETCURSOR()
ON_WM_KEYDOWN()
gives me any help.
Best regards
Laurs
"Joseph M. Newcomer" wrote:
On Monday, December 15, 2008 10:57 AM
Laur wrote:
HiI found it on GodeGuru, so no panicON_UPDATE_COMMAND_UI(ID_INDICATOR_CURPOS,
Hi
I found it on GodeGuru, so no panic
ON_UPDATE_COMMAND_UI(ID_INDICATOR_CURPOS, OnUpdateCurPosIndicator)
void CMainFrame::OnUpdateCurPosIndicator(CCmdUI *pCmdUI)
{
CString strCurPos;
int nLineNum, nColNum;
int nSelStart, nSelEnd;
// you're going to have to get a pointer
// to the edit control in the view
m_wndEditCtrl->GetSel(nSelStart, nSelEnd);
nLineNum = m_wndEditCtrl->LineFromChar(nSelStart);
nColNum = nSelStart - m_wndEditCtrl->LineIndex(nLineNum);
strCurPos.Format(ID_INDICATOR_CURPOS,
nLineNum+1,
nColNum+1);
m_wndStatusBar.SetPaneText(
m_wndStatusBar.CommandToIndex(ID_INDICATOR_CURPOS),
strCurPos);
}
"Laurs" wrote:
On Monday, December 15, 2008 11:11 AM
Joseph M. Newcomer wrote:
Yes, this is a problem; an edit control gives no notification of selection
Yes, this is a problem; an edit control gives no notification of selection change. THe
way I handled this was that I subclassed CEdit, and handle keyboard and mouse
notifications, track the current selection, and force an update of the position
information if the selection changes. This is a bit of a pain, and today, I would use a
rich edit control, use SetEventMask to allow EN_SELCHANGE notifications, and handle the
EN_SELCHANGE notification to force the update.
joe
On Mon, 15 Dec 2008 06:13:10 -0800, Laurs <Laurs@discussions.microsoft.com> wrote:
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm
Submitted via EggHeadCafe - Software Developer Portal of Choice
What's New for Developers in SharePoint 2010 Object Model?
http://www.eggheadcafe.com/tutorials/aspnet/84e8403e-a25c-49b7-a0d8-3e2773fa29b5/whats-new-for-developers.aspx