Page 1 of 1

Border around focused line in browse?

Posted: Fri May 12, 2006 2:11 pm
by modicr
Hello!

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

Thanks, Roman

Posted: Fri May 12, 2006 5:13 pm
by James Bott
You can't.

Posted: Fri May 12, 2006 5:24 pm
by Antonio Linares
Roman, James,

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

Posted: Fri May 12, 2006 7:47 pm
by James Bott
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

Posted: Wed May 17, 2006 11:04 am
by modicr
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:

Code: Select all

               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:

Code: Select all

               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:

Code: Select all

**************************************************************************
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: :)
Image

Regards, Roman

Posted: Wed May 17, 2006 11:43 am
by Enrico Maria Giordano
Great, Roman!

EMG

Posted: Wed May 17, 2006 3:52 pm
by James Bott
Good work Roman.

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

James

Posted: Thu May 18, 2006 9:39 am
by modicr
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": :)
Image
Image
Image


Cheers, Roman

Posted: Thu May 18, 2006 9:58 am
by Antonio Linares
Roman,

Excellent :)