FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Border around focused line in browse?
Posts: 207
Joined: Fri Oct 07, 2005 07:58 AM
Border around focused line in browse?
Posted: Fri May 12, 2006 02:11 PM

Hello!

How to draw a box - border around
current/focused line in TWBrowse.

Thanks, Roman

© I'm not patented!
Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Border around focused line in browse?
Posted: Fri May 12, 2006 05:13 PM

You can't.

FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Border around focused line in browse?
Posted: Fri May 12, 2006 05:24 PM

Roman, James,

Class TWBrowse Method Paint() can be easily modified to paint a dotted line or similar around the focused line.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Border around focused line in browse?
Posted: Fri May 12, 2006 07:47 PM

Antonio,

Well, easy for you probably, but I remember spending quite some time trying to get it working without success. I think part of the problem was that the cells are kind of still 3d from the old days. There are actually two lines around each cell. Maybe one is drawn in the background color. I don't remember exactly, but there were issues.

I'd be happy if someone proved me wrong.

James

FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 207
Joined: Fri Oct 07, 2005 07:58 AM
Border around focused line in browse?
Posted: Wed May 17, 2006 11:04 AM
Hello!

I try to draw a box around the line and there are problems when I
move to the next line - the previous one is not redrawn correctly.

IMHO there is a (optimization) bug in static function WBrwLine (which is called from Paint method), because only left (gray) and bottom edge of each cell are redrawn:
               case nLineStyle == LINES_GRAY
                    hPen = CreatePen( PS_SOLID, 1, CLR_GRAY )
                    hOld = SelectObject( hDC, hPen )
                    MoveTo( hDC, nLeft - 2, nTop - 2 )
                    LineTo( hDC, nLeft - 2, nBottom )
                    LineTo( hDC, nRight , nBottom )
                    SelectObject( hDC, hOld )
                    DeleteObject( hPen )


One solution is to create subclass of TWBrowse, copy WBrwLine and all methods which are calling WBrwLine (DrawLine, DrawSelect, Paint and LButtonDown) and then change WBrwLine to something like that:
               case nLineStyle == LINES_GRAY
                    hPen = CreatePen( PS_SOLID, 1, CLR_GRAY )
                    hOld = SelectObject( hDC, hPen )
                    MoveTo( hDC, nLeft - 2, nTop - 1 )
                    LineTo( hDC, nLeft - 2, nBottom )
                    LineTo( hDC, nRight , nBottom )
                    MoveTo( hDC, nLeft - 2, nTop - 1 )
                    LineTo( hDC, nRight , nTop - 1 )
                    SelectObject( hDC, hOld )
                    DeleteObject( hPen )

                    hPen = CreatePen( PS_SOLID, 1, CLR_WHITE )
                    hOld = SelectObject( hDC, hPen )
                    MoveTo( hDC, nLeft - 1, nTop  )
                    LineTo( hDC, nLeft - 1, nBottom )
                    SelectObject( hDC, hOld )
                    DeleteObject( hPen )


The next step is to create function based on wBrwLine that draws frame around selected line, which is to be called after wBrwLine in DrawSelect method:

**************************************************************************
static function wBrwSimple( hWnd, hDC, nRowPos, aValues, aColSizes,;
                          nColPos, nClrText, nClrPane,;
                          hFont, lTree, aJustify, nPressed, nLineStyle,;
                          nColAct, lFocused, oVScroll, bLogicLen )
**************************************************************************

   local nTxtHeight, hOldFont
   local nColStart  := -1
   local nWidth     := WndWidth( hWnd ) - If( oVScroll != nil .and. ;
                       Eval( bLogicLen ) > 1,;
                       GetSysMetrics( SM_CYHSCROLL ) + 3, 0 )
   local nRow := nRowPos, nTop, nBottom, nLeft, nRight, n
   local lReleaseDC := .f.
   local nForeColor, nBackColor
   local  hPen, hOld, hBrush

   DEFAULT lTree := .f.

   if Empty( hDC )
      hDC = GetDC( hWnd )
      lReleaseDC = .t.
   endif

   hOldFont   = SelectObject( hDC, hFont )
   nTxtHeight = GetTextHeight( hWnd, hDC ) + 1

   nTop    = nTxtHeight * nRow
   nBottom = nTop + nTxtHeight - 1
   for n := nColPos to Len( aValues )
      nLeft   = nColStart + 1
      nRight  = Min( nColStart := ( nLeft + aColSizes[ n ] - 1 ), nWidth )
      if nLeft > nWidth
         exit
      endif
      if n == Len( aValues )
         nRight = nWidth
      endif
            if lFocused
                    hPen = CreatePen( PS_SOLID, 1, CLR_BLACK )
                    hOld = SelectObject( hDC, hPen )
                    MoveTo( hDC, nLeft-1 , nBottom-1 )
                    LineTo( hDC, nRight, nBottom-1 )
                    MoveTo( hDC, nRight-1, nTop )
                    LineTo( hDC, nLeft-2 , nTop )
                    SelectObject( hDC, hOld )
                    DeleteObject( hPen )
             else
                    hPen = CreatePen( PS_DOT, 1, CLR_BLACK )
                    hOld = SelectObject( hDC, hPen )
                    MoveTo( hDC, nLeft-1 , nBottom )
                    LineTo( hDC, nRight, nBottom )
                    MoveTo( hDC, nRight-1, nTop-1 )
                    LineTo( hDC, nLeft-2 , nTop-1 )
                    SelectObject( hDC, hOld )
                    DeleteObject( hPen )
            endif
      if nColPos > nWidth
         exit
      endif
   next
return NIL   // wBrwSimple


Here is the result: :-)


Regards, Roman
© I'm not patented!
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Border around focused line in browse?
Posted: Wed May 17, 2006 11:43 AM

Great, Roman!

EMG

Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Border around focused line in browse?
Posted: Wed May 17, 2006 03:52 PM

Good work Roman.

One question. Why a static function rather than a method?

James

FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 207
Joined: Fri Oct 07, 2005 07:58 AM
Border around focused line in browse?
Posted: Thu May 18, 2006 09:39 AM
Hello!

Because that's the way how wBrwLine is implemented in WBROWSE.PRG and I just copied code from it.

BTW, I created three more "skins": :-)







Cheers, Roman
© I'm not patented!
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Border around focused line in browse?
Posted: Thu May 18, 2006 09:58 AM

Roman,

Excellent :)

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion