LineNumberEdit.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:29k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ==========================================================================
  2. CLineNumberEdit
  3. Author : Johan Rosengren, Abstrakt Mekanik AB
  4. Date : 2004-03-09
  5. Purpose : CLineNumberEdit is a CEdit-derived class that displays 
  6. line numbers to the left of the text.
  7. Description : The class uses the edit rect to make space for the line 
  8. numbers. The line numbers are relized through a special 
  9. CStatic-derived class, CLineNumberStatic. As soon as the 
  10. text is updated, the CLineNumberStatic is updated as 
  11. well.
  12. Usage : The control can be dynamically created, or created from 
  13. a dialog template. The formatting string for the line 
  14. numbers can be set by calling SetLineNumberFormat (the 
  15. same format string as for CString::Format). By calling 
  16. SetMarginForegroundColor or SetMarginBackgroundColor 
  17. the fore- and background colors for the line number 
  18. display is set.
  19.    ========================================================================
  20. Update :        Keith Bowes
  21. Date :          2004-04-13
  22. Purpose :       1. To allow CLineNumberEdit to properly change colour when
  23.                        Enabled/Disabled or when system colours change.
  24.                        Changing system colours only has a noticable effect when
  25.                        a scheme such as Marine or Plum is chosen.
  26.                     2. To allow a line number delta to be applied to the first
  27.                        line number so the index does not have to start at zero.
  28.                     3. To allow a max value to be specified to stop the line
  29.                        count and to allow smarter size formatting.
  30. Description :   1. Added OnEnable and OnSysColorChange to detect when
  31.                        a colour change is required. This allows the line number
  32.                        area and CEdit area to update colours properly.
  33.                        Added colour ref variables to hold enabled/disabled states
  34.                        of the background/foreground colours.
  35.                        In an attempt to allow previous functionality to take
  36.                        precedence, if the colours are changed explicitly, the
  37.                        system colours are no longer queried.
  38.                     2. Added m_LineDelta, applied when line numbers are formatted.
  39.                     3. Using m_maxval when > 0 to limit the max values and when
  40.                        formatting colomn width.
  41. JRO: Added m_lineDelta as well.
  42.     Usage :         1. Default behaviour is to change colours to reflect CEdit.
  43.                        manually changing the colour will cause the colours to
  44.                        only change to the specified colours.
  45.                     2. SetLineNumberRange sets both min and max values.
  46.                     3. SetLineNumberRange sets both min and max values.
  47.     Comments :      - Perhaps line values should be stored as UINT's as negative
  48.                       values may have unexpected results.
  49.                     - CLineNumberEdit::m_format creates a duplicate of
  50.                       CLineNumberStatic::m_format, is this needed?
  51.   JRO: Even though the the two classes are thightly coupled, 
  52.   this duplication of data makes it easier to decouple them. 
  53.   A small matter, but code reuse is Politically Correct,
  54.   and as such A Desirable Feature.
  55.                     - Added options could allow different system colours to be
  56.                       chosen and updated as system attributes are changed.
  57.                     - if m_maxval is exceeded in the edit box, new lines
  58.                       are added without line numbers. This might not be the
  59.                       desired behaviour.
  60. JRO: I think this is rather nifty, actually. If I, as a 
  61. developer, sets the max number of lines to be numbered, 
  62. I also expect this to be the case :-)))
  63.                     - It's not spelled wrong, just differently. ;0)
  64.    ========================================================================
  65. Update :        Johan Rosengren
  66. Date :          2004-04-14
  67. Purpose : 1. Allow deriving of CLineNumberEdit. 
  68. Description : 1. Made the message handlers virtual.
  69. Usage : 1. Declare message handlers as virtual in derived 
  70.    classes. Note that CLineNumberEdit is not built to 
  71.    be derived from, however.
  72.    ========================================================================
  73. Update : Keith Bowes
  74. Date : 2004-04-22
  75. Purpose : To allow processing of WM_LINESCROLL messages. 
  76. Description : Added OnLineScroll to handle the message.
  77. Usage : Now will call UpdateTopAndBottom if the message is
  78. received.
  79.    ========================================================================
  80. Update : Johan Rosengren
  81. Date : 2004-05-02
  82. Purpose : Select complete line when a line-number is clicked
  83. Description : Added registered user message, sent when the line-
  84. number static is clicked.
  85. Usage : See urm_SELECTLINE in the code.
  86.    ========================================================================*/
  87. #include "stdafx.h"
  88. #include "LineNumberEdit.h"
  89. #ifdef _DEBUG
  90. #define new DEBUG_NEW
  91. #undef THIS_FILE
  92. static char THIS_FILE[] = __FILE__;
  93. #endif
  94. // Registered message to allow selection of complete 
  95. // lines by clicking the line number
  96. UINT urm_SELECTLINE = ::RegisterWindowMessage( _T("_LINE_NUMBER_EDIT_SELECTLINE_") );
  97. /////////////////////////////////////////////////////////////////////////////
  98. // CLineNumberEdit
  99. CLineNumberEdit::CLineNumberEdit()
  100. /* ============================================================
  101. Function : CLineNumberEdit::CLineNumberEdit
  102. Description : constructor
  103.      
  104. Return : void
  105. Parameters : none
  106. Usage :
  107.    ============================================================*/
  108. {
  109. m_hWnd = NULL;
  110. m_line.m_hWnd = NULL;
  111. m_zero.cx = 0;
  112. m_zero.cy = 0;
  113. m_format = _T( "%03i" );
  114. m_LineDelta = 1;
  115. // Could default m_maxval to 99,999, but may cause problems 
  116. // if m_format is changed and m_maxval is not...
  117. m_maxval = 998;
  118. // Setting up so by defult the original hard-coded colour 
  119. // scheme is used when enabled and the system colours are 
  120. // used when disabled.
  121. m_bUseEnabledSystemColours = FALSE;
  122. m_bUseDisabledSystemColours = TRUE;
  123. m_EnabledFgCol = RGB( 0, 0, 0 );
  124. m_EnabledBgCol = RGB( 200, 200, 200 );
  125. m_DisabledFgCol = GetSysColor( COLOR_GRAYTEXT );
  126. m_DisabledBgCol = GetSysColor( COLOR_3DFACE );
  127. SetWindowColour();
  128. }
  129. CLineNumberEdit::~CLineNumberEdit()
  130. /* ============================================================
  131. Function : CLineNumberEdit::~CLineNumberEdit
  132. Description : destructor
  133.  
  134. Return : void
  135. Parameters : none
  136. Usage :
  137.    ============================================================*/
  138. {
  139. }
  140. BEGIN_MESSAGE_MAP(CLineNumberEdit, CEdit)
  141. ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
  142. ON_WM_VSCROLL()
  143. ON_CONTROL_REFLECT(EN_VSCROLL, OnVscroll)
  144. ON_MESSAGE(WM_SETFONT, OnSetFont)
  145. ON_WM_SIZE()
  146. ON_MESSAGE(WM_SETTEXT, OnSetText)
  147. ON_WM_SYSCOLORCHANGE()
  148. ON_WM_ENABLE()
  149. ON_MESSAGE(EM_LINESCROLL, OnLineScroll)
  150. ON_REGISTERED_MESSAGE(urm_SELECTLINE, OnSelectLine)
  151. END_MESSAGE_MAP()
  152. void CLineNumberEdit::PreSubclassWindow() 
  153. /* ============================================================
  154. Function : CLineNumberEdit::PreSubclassWindow
  155. Description : This function is called before the control 
  156. is subclassed for a control on a dialog 
  157. template, and during creation for 
  158. dynamically created controls.
  159. Return : void
  160. Parameters : none
  161. Usage : Called from MFC
  162.    ============================================================*/
  163. {
  164. // Unfortunately, we can't change to ES_MULTILINE
  165. // during run-time.
  166. ASSERT( GetStyle() & ES_MULTILINE );
  167. // Creating the line number control
  168. SetLineNumberFormat( m_format );
  169. }
  170. /////////////////////////////////////////////////////////////////////////////
  171. // CLineNumberEdit message handlers
  172. void CLineNumberEdit::OnSysColorChange() 
  173. /* ============================================================
  174. Function : CLineNumberEdit::OnSysColorChange
  175. Description : Handles WM_SYSCOLORCHANGE. User has changed
  176. the system colours, want to refresh.
  177.  
  178. Return : void
  179. Parameters : void
  180. Usage : Called from Windows
  181.    ============================================================*/
  182. {
  183. CEdit::OnSysColorChange();
  184.     // update the CStatic with the new colours
  185.     SetWindowColour( IsWindowEnabled() );
  186. }
  187. LRESULT CLineNumberEdit::OnSetText( WPARAM wParam, LPARAM lParam )
  188. /* ============================================================
  189. Function : CLineNumberEdit::OnSetText
  190. Description : Handles WM_SETTEXT. We must update the line 
  191. numbers in the line number control as well.
  192.  
  193. Return : LRESULT - From Def proc
  194. Parameters : WPARAM wParam - From Windows
  195. LPARAM lParam - From Windows
  196. Usage : Called from Windows
  197.    ============================================================*/
  198. {
  199. // Default processing
  200. LRESULT retval = DefWindowProc( WM_SETTEXT, wParam, lParam );
  201. UpdateTopAndBottom();
  202. return retval;
  203. }
  204. void CLineNumberEdit::OnChange() 
  205. /* ============================================================
  206. Function : CLineNumberEdit::OnChange
  207. Description : Mapped to EN_CHANGE. We must handle 
  208. EN_CHANGE to let the line-number control 
  209. reflect changes to the edit box content.
  210.  
  211. Return : void
  212. Parameters : none
  213. Usage : Called from Windows
  214.    ============================================================*/
  215. {
  216. UpdateTopAndBottom();
  217. }
  218. void CLineNumberEdit::OnVscroll() 
  219. /* ============================================================
  220. Function : CLineNumberEdit::OnVscroll
  221. Description : Mapped to EN_VSCROLL. We update the line 
  222. numbers in the line number control
  223.  
  224. Return : void
  225. Parameters : none
  226. Usage : Called from Windows
  227.    ============================================================*/
  228. {
  229. UpdateTopAndBottom();
  230. }
  231. void CLineNumberEdit::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar ) 
  232. /* ============================================================
  233. Function : CLineNumberEdit::OnVScroll
  234. Description : Handles WM_VSCROLL. We handle WM_VSCROLL 
  235. in addition to the notification EN_VSCROLL, 
  236. to handle scrollbar dragging as well
  237.  
  238. Return : void
  239. Parameters : UINT nSBCode - From Windows
  240. UINT nPos - From Windows
  241. CScrollBar* pScrollBar - From Windows
  242. Usage : Called from Windows
  243.    ============================================================*/
  244. {
  245. CEdit::OnVScroll( nSBCode, nPos, pScrollBar );
  246. UpdateTopAndBottom();
  247. }
  248. LRESULT CLineNumberEdit::OnLineScroll( WPARAM wParam, LPARAM lParam ) 
  249. /* ============================================================
  250. Function : CLineNumberEdit::OnLineScroll
  251. Description : Mapped to EM_LINESCROLL. We update the line 
  252. numbers in the line number control.
  253.      
  254. Return : void
  255. Parameters : none
  256. Usage : Called from Windows
  257.    ============================================================*/
  258. {
  259. // Default processing
  260. LRESULT retval = DefWindowProc( EM_LINESCROLL, wParam, lParam );
  261. UpdateTopAndBottom();
  262. return retval;
  263. }
  264. LRESULT CLineNumberEdit::OnSetFont( WPARAM wParam, LPARAM lParam )
  265. /* ============================================================
  266. Function : CLineNumberEdit::OnSetFont
  267. Description : Mapped to WM_SETFONT. We must recalculate 
  268. the line number control size as well.
  269.  
  270. Return : LRESULT - Always 0
  271. Parameters : WPARAM wParam - From Windows
  272. LPARAM lParam - From Windows
  273. Usage : Called from Windows
  274.    ============================================================*/
  275. {
  276. DefWindowProc( WM_SETFONT, wParam, lParam );
  277. // We resize the line-number
  278. // field
  279. Prepare();
  280. return 0;
  281. }
  282. void CLineNumberEdit::OnSize( UINT nType, int cx, int cy ) 
  283. /* ============================================================
  284. Function : CLineNumberEdit::OnSize
  285. Description : Handles WM_SIZE. Recalculates the line 
  286. number control size as well.
  287.  
  288. Return : void
  289. Parameters : UINT nType - From Windows
  290. int cx - From Windows
  291. int cy - From Windows
  292. Usage : Called from Windows
  293.    ============================================================*/
  294. {
  295. CEdit::OnSize( nType, cx, cy );
  296. // If we have the line-number
  297. // control, it must be resized 
  298. // as well.
  299. if( m_line.m_hWnd )
  300. Prepare();
  301.  
  302. }
  303. void CLineNumberEdit::OnEnable( BOOL bEnable ) 
  304. /* ============================================================
  305. Function : CLineNumberEdit::OnEnable
  306. Description : Handles WM_ENABLE. Calls to set colours.
  307.  
  308. Return : void
  309. Parameters : BOOL bEnable - From Windows
  310. Usage : Called from Windows.
  311.    ============================================================*/
  312. {
  313. CEdit::OnEnable( bEnable );
  314.     SetWindowColour( bEnable );
  315. }
  316. LRESULT CLineNumberEdit::OnSelectLine(WPARAM wParam, LPARAM /*lParam*/ )
  317. /* ============================================================
  318. Function : CLineNumberEdit::OnSelectLine
  319. Description : Handler for the urm_SELECTLINE registered
  320. message. Will select the line in wParam.
  321. Return : LRESULT - Not used
  322. Parameters : WPARAM wParam - The line to select
  323. LPARAM lParam - Not used
  324. Usage : Called from MFC. Use 
  325. SendMessage( urm_SELECTLINE, line ) from 
  326. code.
  327.    ============================================================*/
  328. {
  329. // Calc start and end position of the line
  330. int lineno = wParam + GetScrollPos( SB_VERT );
  331. int start = LineIndex( lineno );
  332. int end = LineIndex( lineno + 1 );
  333. SetSel( start, end - 1 );
  334. return 0;
  335. }
  336. void CLineNumberEdit::SetWindowColour( BOOL bEnable /*= TRUE*/ )
  337. /* ============================================================
  338. Function : CLineNumberEdit::SetWindowColour
  339. Description : Handles changing window colours.
  340.  
  341. Return : void
  342. Parameters : BOOL bEnable - flag if set enabled/disabled 
  343. colours
  344. Usage : Called to change colours in the edit box.
  345.    ============================================================*/
  346. {
  347.     if (m_bUseEnabledSystemColours)
  348.     {
  349. // re-query the system colours in case they have changed.
  350. m_EnabledFgCol = GetSysColor( COLOR_WINDOWTEXT );
  351. m_EnabledBgCol = GetSysColor( COLOR_WINDOW );
  352.     }
  353.     if (m_bUseDisabledSystemColours)
  354.     {
  355. // re-query the system colours in case they have changed.
  356. m_DisabledFgCol = GetSysColor( COLOR_GRAYTEXT );
  357. m_DisabledBgCol = GetSysColor( COLOR_3DFACE );
  358.     }
  359.     // change the colour based on bEnable
  360.     if (bEnable)
  361.     {
  362.         m_line.SetFgColor( m_EnabledFgCol, TRUE );
  363.         m_line.SetBgColor( m_EnabledBgCol, TRUE );
  364.     } else {
  365.         m_line.SetFgColor( m_DisabledFgCol, TRUE );
  366.         m_line.SetBgColor( m_DisabledBgCol, TRUE );
  367.     }
  368. }
  369. void CLineNumberEdit::UseSystemColours( BOOL bUseEnabled /*= TRUE*/, BOOL bUseDisabled /*= TRUE*/ )
  370. /* ============================================================
  371. Function : CLineNumberEdit::UseSystemColours
  372. Description : Sets the Use*SystemColours flags.
  373.  
  374. Return : void
  375. Parameters : BOOL bEnabled - flag if to use enabled 
  376. system colours
  377. BOOL bDisabled - flag if to use disabled 
  378. system colours
  379. Usage : Called to change colours in the edit box
  380.    ============================================================*/
  381. {
  382.     m_bUseEnabledSystemColours = bUseEnabled;
  383.     m_bUseDisabledSystemColours = bUseDisabled;
  384.     BOOL bEnable = TRUE;
  385.     if (::IsWindow(m_hWnd))
  386.         bEnable = IsWindowEnabled();
  387.     SetWindowColour( bEnable );
  388. }
  389. /////////////////////////////////////////////////////////////////////////////
  390. // CLineNumberEdit private implementation
  391. void CLineNumberEdit::Prepare()
  392. /* ============================================================
  393. Function : CLineNumberEdit::Prepare
  394. Description : Setting the edit rect for the control and 
  395. either create or move the line number 
  396. control. Also sets the top- and bottom 
  397. line numbers.
  398.  
  399. Return : void
  400. Parameters : none
  401. Usage : Must be called to (re)establish the edit 
  402. rect, must also be called as soon as the 
  403. control changes size.
  404.    ============================================================*/
  405. {
  406. // Calc sizes
  407. int width = CalcLineNumberWidth();
  408. CRect rect;
  409. GetClientRect( &rect );
  410. CRect rectEdit( rect );
  411. rect.right = width;
  412. rectEdit.left = rect.right + 3;
  413. // Setting the edit rect and 
  414. // creating or moving child control
  415. SetRect( &rectEdit );
  416. if( m_line.m_hWnd )
  417. m_line.MoveWindow( 0, 0, width, rect.Height() );
  418. else
  419. m_line.Create(NULL,WS_CHILD | WS_VISIBLE | SS_NOTIFY, rect, this, 1 );
  420. GetRect( &rectEdit );
  421. // Update line number control data
  422. m_line.SetTopMargin( rectEdit.top );
  423. UpdateTopAndBottom();
  424. }
  425. int CLineNumberEdit::CalcLineNumberWidth()
  426. /* ============================================================
  427. Function : CLineNumberEdit::CalcLineNumberWidth
  428. Description : Calculates the desired width of the line 
  429. number control, using the current format 
  430. string and the max number of chars allowed 
  431. (pessimistic - assumes one character per 
  432. line).
  433.  
  434. Return : int - The width in pixels
  435. Parameters : none
  436. Usage : Called as soon as the format string is 
  437. changed.
  438.    ============================================================*/
  439. {
  440. CClientDC dc( this );
  441. // If a new font is set during runtime,
  442. // we must explicitly select the font into
  443. // the CClientDC to measure it.
  444. CFont* font = GetFont();
  445. CFont* oldFont = dc.SelectObject( font );
  446. m_zero=dc.GetTextExtent( _T( "0" ) );
  447. CString format;
  448.     // GetLimitText returns the number of bytes the edit box may contain,
  449.     // not the max number of lines...
  450. //... which is the max number of lines, given one character per d:o :-)
  451. int maxval = GetLimitText();
  452.     if (m_maxval > 0)
  453.         maxval = m_maxval + m_LineDelta;
  454. format.Format( m_format, maxval );
  455. CSize fmt = dc.GetTextExtent( format );
  456. dc.SelectObject( oldFont );
  457. // Calculate the size of the line-
  458. // number field. We add a 5 pixel margin
  459. // to the max size of the format string
  460. return fmt.cx + 5;
  461. }
  462. void CLineNumberEdit::UpdateTopAndBottom() 
  463. /* ============================================================
  464. Function : CLineNumberEdit::UpdateTopAndBottom
  465. Description : Updates the top- and bottom line number 
  466. for the line number control.
  467.  
  468. Return : void
  469. Parameters : none
  470. Usage : Should be called as soon as the contents of 
  471. the control is changed.
  472.    ============================================================*/
  473. {
  474. CRect rect;
  475. GetClientRect( &rect );
  476. int maxline = GetLineCount() + m_LineDelta;
  477. // Height for individual lines
  478. int lineheight = m_zero.cy;
  479. // Calculate the number of lines to draw
  480. int topline = GetFirstVisibleLine() + m_LineDelta;
  481. if( ( topline + ( rect.Height() / lineheight ) ) < maxline )
  482. maxline = topline + ( rect.Height() / lineheight );
  483.     if ( m_maxval > 0 && maxline > m_maxval + m_LineDelta )
  484.         maxline = m_maxval + m_LineDelta;
  485. m_line.SetTopAndBottom( topline, maxline );
  486. }
  487. /////////////////////////////////////////////////////////////////////////////
  488. // CLineNumberEdit public implementation
  489. void CLineNumberEdit::SetMarginForegroundColor( COLORREF col, BOOL redraw, BOOL bEnabled /*= TRUE*/ )
  490. /* ============================================================
  491. Function : CLineNumberEdit::SetMarginForegroundColor
  492. Description : Sets the text color for the number 
  493. margin.
  494.  
  495. Return : void
  496. Parameters : COLORREF col - The new text color 
  497. BOOL redraw - TRUE if the control 
  498. should be redrawn 
  499. (default)
  500. Usage : Call to set a new text color for the line
  501. number margin. The control will be redrawn
  502. if it exists.
  503.    ============================================================*/
  504. {
  505. m_line.SetFgColor( col, redraw );
  506.     if (bEnabled)
  507.     {
  508.         m_bUseEnabledSystemColours = FALSE;
  509.         m_EnabledFgCol = col;
  510.     } else {
  511.         m_bUseDisabledSystemColours = FALSE;
  512.         m_DisabledFgCol = col;
  513.     }
  514. }
  515. void CLineNumberEdit::SetMarginBackgroundColor( COLORREF col, BOOL redraw, BOOL bEnabled /*= TRUE*/ )
  516. /* ============================================================
  517. Function : CLineNumberEdit::SetMarginBackgroundColor
  518. Description : Sets the background color for the number 
  519. margin.
  520.  
  521. Return : void
  522. Parameters : COLORREF col - The new background color 
  523. BOOL redraw - TRUE if the control 
  524. should be redrawn 
  525. (default)
  526. Usage : Call to set a new background color for the 
  527. line number margin. The control will be 
  528. redrawn if it exists.
  529.    ============================================================*/
  530. {
  531. m_line.SetBgColor( col, redraw );
  532.     if (bEnabled)
  533.     {
  534.         m_bUseEnabledSystemColours = FALSE;
  535.         m_EnabledBgCol = col;
  536.     } else {
  537.         m_bUseDisabledSystemColours = FALSE;
  538.         m_DisabledBgCol = col;
  539.     }
  540. }
  541. void CLineNumberEdit::SetLineNumberFormat( CString format )
  542. /* ============================================================
  543. Function : CLineNumberEdit::SetLineNumberFormat
  544. Description : Changes the way line numbers are presented 
  545. on screen. 
  546.  
  547. Return : void
  548. Parameters : CString format - The new format string
  549. Usage : Call with a format string using the same 
  550. format as CString::Format. It should contain 
  551. one and only one numeric type.
  552.    ============================================================*/
  553. {
  554. m_format = format;
  555. m_line.SetLineNumberFormat( format );
  556. if( m_hWnd )
  557. Prepare();
  558. }
  559. void CLineNumberEdit::SetLineNumberRange( UINT nMin, UINT nMax /*= 0*/ )
  560. /* ============================================================
  561. Function : CLineNumberEdit::SetLineNumberRange
  562. Description : Changes the default min and max line numbers. 
  563.  
  564. Return : void
  565. Parameters : int nMin - changes the line offset
  566. int nMax - changes the max line number
  567. Usage : Call to set up the min and max line numbers.
  568.    ============================================================*/
  569. {
  570.     m_LineDelta = ( int ) nMin;
  571.     m_maxval = ( int ) nMax;
  572. }
  573. /////////////////////////////////////////////////////////////////////////////
  574. // CLineNumberStatic
  575. CLineNumberStatic::CLineNumberStatic()
  576. /* ============================================================
  577. Function : CLineNumberStatic::CLineNumberStatic
  578. Description : constructor
  579.  
  580. Return : void
  581. Parameters : none
  582. Usage :
  583.    ============================================================*/
  584. {
  585. m_bgcol = RGB( 255, 255, 248 );
  586. m_fgcol = RGB( 0, 0, 0 );
  587.     m_format = _T( "%05i" );
  588.     m_topline = 0;
  589.     m_bottomline = 0;
  590. }
  591. CLineNumberStatic::~CLineNumberStatic()
  592. /* ============================================================
  593. Function : CLineNumberStatic::~CLineNumberStatic
  594. Description : destructor
  595.  
  596. Return : void
  597. Parameters : none
  598. Usage :
  599.    ============================================================*/
  600. {
  601. }
  602. BEGIN_MESSAGE_MAP(CLineNumberStatic, CStatic)
  603. ON_WM_PAINT()
  604. ON_WM_ERASEBKGND()
  605. ON_WM_LBUTTONDOWN()
  606. END_MESSAGE_MAP()
  607. /////////////////////////////////////////////////////////////////////////////
  608. // CLineNumberStatic message handlers
  609. void CLineNumberStatic::OnPaint() 
  610. /* ============================================================
  611. Function : CLineNumberStatic::OnPaint
  612. Description : Handler for WM_PAINT. 
  613.  
  614. Return : void
  615. Parameters : none
  616. Usage : Called from Windows.
  617.    ============================================================*/
  618. {
  619. CPaintDC dcPaint( this );
  620. CRect rect;
  621. GetClientRect( &rect );
  622. // We double buffer the drawing - 
  623. // preparing the memory CDC
  624. CDC dc;
  625. dc.CreateCompatibleDC( &dcPaint );
  626. int saved = dc.SaveDC();
  627. // Create GDI and select objects
  628. CBitmap bmp;
  629. CPen pen;
  630. bmp.CreateCompatibleBitmap( &dcPaint, rect.Width(), rect.Height() );
  631. pen.CreatePen( PS_SOLID, 1, m_fgcol );
  632. dc.SelectObject( &bmp );
  633. dc.SelectObject( &pen );
  634. // Painting the background
  635. dc.FillSolidRect( &rect, m_bgcol );
  636. dc.MoveTo( rect.right - 1, 0 );
  637. dc.LineTo( rect.right - 1, rect.bottom );
  638. // Setting other attributes
  639. dc.SetTextColor( m_fgcol );
  640. dc.SetBkColor( m_bgcol );
  641. dc.SelectObject( GetParent()->GetFont() );
  642. // Output the line numbers
  643. if( m_bottomline )
  644. {
  645. int lineheight = dc.GetTextExtent( _T( "0" ) ).cy;
  646. for( int t = m_topline ; t < m_bottomline ; t++ )
  647. {
  648. CString output;
  649. output.Format( m_format, t );
  650. int topposition = m_topmargin + lineheight * ( t - m_topline );
  651. dc.TextOut( 2, topposition, output );
  652. }
  653. }
  654. dcPaint.BitBlt( 0, 0, rect. right, rect.bottom, &dc, 0, 0, SRCCOPY );
  655. dc.RestoreDC( saved );
  656. }
  657. BOOL CLineNumberStatic::OnEraseBkgnd( CDC* ) 
  658. /* ============================================================
  659. Function : CLineNumberStatic::OnEraseBkgnd
  660. Description : Mapped to WM_ERASEBKGND. Handled to avoid
  661. flicker, as we redraw the complete control 
  662. in OnPaint
  663.  
  664. Return : BOOL  - Always TRUE
  665. Parameters : CDC*  - From Windows
  666. Usage : Called from Windows.
  667.    ============================================================*/
  668. {
  669. return TRUE;
  670. }
  671. void CLineNumberStatic::OnLButtonDown( UINT nFlags, CPoint point )
  672. /* ============================================================
  673. Function : CLineNumberStatic::OnLButtonDown
  674. Description : Called when the control is clicked. Will
  675. send the urm_SELECTLINE registered message 
  676. to the parent to select the line clicked on.
  677. Return : void
  678. Parameters : UINT nFlags - Not used
  679. CPoint point - Position of cursor
  680. Usage : Called from Windows.
  681.    ============================================================*/
  682. {
  683. // Find the line clicked on
  684. CClientDC dc( this );
  685. dc.SelectObject( GetParent()->GetFont() );
  686. int lineheight = dc.GetTextExtent( _T( "0" ) ).cy;
  687. int lineno = ( int ) ( ( double ) point.y / ( double ) lineheight );
  688. // Select this line in the edit control
  689. GetParent()->SendMessage( urm_SELECTLINE, lineno );
  690. CStatic::OnLButtonDown( nFlags, point );
  691. }
  692. /////////////////////////////////////////////////////////////////////////////
  693. // CLineNumberStatic public implementation
  694. void CLineNumberStatic::SetBgColor( COLORREF col, BOOL redraw )
  695. /* ============================================================
  696. Function : CLineNumberStatic::SetBgColor
  697. Description : This function sets the panel background 
  698. color
  699.  
  700. Return : void
  701. Parameters : COLORREF col - New background color
  702. BOOL redraw  - TRUE if the control 
  703. should be redrawn 
  704. (default)
  705. Usage : Called from the parent.
  706.    ============================================================*/
  707. {
  708. m_bgcol = col;
  709. if( m_hWnd && redraw )
  710. RedrawWindow();
  711. }
  712. void CLineNumberStatic::SetFgColor( COLORREF col, BOOL redraw )
  713. /* ============================================================
  714. Function : CLineNumberStatic::SetFgColor
  715. Description : This function sets the panel foreground 
  716. color
  717.  
  718. Return : void
  719. Parameters : COLORREF col - New text color
  720. BOOL redraw  - TRUE if the control 
  721. should be redrawn 
  722. (default)
  723.  
  724. Usage : Called from the parent.
  725.    ============================================================*/
  726. {
  727. m_fgcol = col;
  728. if( m_hWnd && redraw )
  729. RedrawWindow();
  730. }
  731. void CLineNumberStatic::SetTopAndBottom( int topline, int bottomline )
  732. /* ============================================================
  733. Function : CLineNumberStatic::SetTopAndBottom
  734. Description : Sets the top- and bottom line and redraw 
  735. the control (if it exists)
  736.  
  737. Return : void
  738. Parameters : int topline - The top line number
  739. int bottomline - The bottom line number
  740.  
  741. Usage : Called when the top and bottom line is 
  742. changed in the parent.
  743.    ============================================================*/
  744. {
  745. m_topline = topline;
  746. m_bottomline = bottomline;
  747. if( m_hWnd )
  748. RedrawWindow();
  749. }
  750. void CLineNumberStatic::SetTopMargin( int topmargin )
  751. /* ============================================================
  752. Function : CLineNumberStatic::SetTopMargin
  753. Description : Sets the top margin for painting.
  754.  
  755. Return : void
  756. Parameters : int topmargin - The top margin to set
  757.  
  758. Usage : Will be called with the value of GetRect 
  759. from the parent.
  760.    ============================================================*/
  761. {
  762. m_topmargin = topmargin;
  763. }
  764. void CLineNumberStatic::SetLineNumberFormat( CString format )
  765. /* ============================================================
  766. Function : CLineNumberStatic::SetLineNumberFormat
  767. Description : Sets the format string of the control
  768.  
  769. Return : void
  770. Parameters : CString format - Format string to use 
  771.  
  772. Usage : Called from the parent when the format 
  773. string is changed.
  774.    ============================================================*/
  775. {
  776. m_format = format;
  777. if( m_hWnd )
  778. RedrawWindow();
  779. }