FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour justify a text
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
justify a text
Posted: Sat May 19, 2012 05:24 PM
For my "dear old friend" Silvio

Maybe my Metro Style Infobox is of any use for you.
Regards,
Otto


Code (fw): Select all Collapse
#define DT_WORDBREAK         16
function MetroMsgInfo2( cTitel, cAnzeige1 )

   local  lVar        := .f.
   local  oDlg, oBTNNaviWeiter
   local  nWidth      := GetSysMetrics( 0 )
   local  nHeight     := GetSysMetrics( 1 )
   local  nLine       := 0
   local  nRowSpace   := 20
   local  nRowOffset  := 20

   local  hOldFont
   local  nTop           := 0
   local  nLeft      := 0
   local  nBottom        := 0
   local  nRight         := nWidth 
   *----------------------------------------------------------
    
    nLeft   := nWidth/7/2.05
    nHeight := (nHeight - 100)/ 3 * 2 - nLine
    
   nLine := 16
      DEFINE DIALOG oDlg ;
           TITLE "Auswahl" ;
            FROM 100, -6 ;
              TO nHeight, nWidth + 6 ;
           PIXEL ;
           STYLE nOr( DS_MODALFRAME, WS_POPUP ) ;
           COLOR CLR_WHITE, CLR_GREEN ;
            FONT Setup():oFntMedium


   nLine := 1
   @ nRowOffset * nLine , nLeft ;
      SAY cTitel ;
      OF oDlg ;
      PIXEL ;
      FONT Setup():oFntMetroGross ;
      COLOR CLR_WHITE, CLR_GREEN

   nLine   := 9
   nTop    := nRowOffset * nLine
   nBottom := nTop + 420/2.05
   nRight  := nLeft + nWidth/2

   *----------------------------------------------------------
   nLine := 9
   @ nRowOffset + nRowSpace * nLine, nLeft  ;
      FLATBTN oBTNNaviWeiter ;
      PROMPT "OK" ;
      FONT Setup():oFntMedium ;
      SIZE 76/2.05, ( 24 ) /2.05 ;
      OF oDlg ;
      ACTION ( lVar := .t., oDlg:End() ) ;
      COLOR CLR_GREEN, RGB( 210, 210, 210 )

   nLeft := nLeft * 2.05
   ACTIVATE DIALOG oDlg ;
          ON PAINT ( SetBkMode( oDlg:hDC, 1 ),;
          hOldFont := SelectObject( oDlg:hDC, Setup():oFntMetroCombo:hFont ),;
          SetTextColor( oDlg:hDC, CLR_WHITE ),;
          DrawTextEx( oDlg:hDC, cAnzeige1, {nTop, nLeft, nBottom, nRight }, DT_WORDBREAK ),;
          SelectObject( oDlg:hDC, hOldFont ) )

RETURN NIL
//--------------------------------------------------------------------






Have you a function to justify a text of a say on a dialog
sample
#include "Fivewin.ch"
#include "constant.ch"

#define LIGHTCYAN nRGB( 203, 225, 252 )

Functiopn test()

Local nBottom := 20
Local nRight := 42
Local nWidth := Max( nRight * DLG_CHARPIX_W, 180 )
Local nHeight := nBottom * DLG_CHARPIX_H

DEFINE DIALOG oDlg ;
SIZE nWidth, nHeight PIXEL ;
TITLE 'Donazione' ;
GRADIENT { { 1,CLR_WHITE, LIGHTCYAN } } TRANSPARENT
oDlg:lHelpIcon := .F.
oDlg:nStyle := nOR( DS_MODALFRAME, WS_POPUP, WS_CAPTION, 4 )

cMessage:= 'Per poter utilizzare il pacchetto è ora necessario indicare la Chiave di Attivazione Procedura. La versione gratuita '+;
'del programma non permette la stampa dei listati, sarà possibile usare la procedura in modo dimostrativo '+;
'non nella completezza delle sue funzionalità. Premi Attiva per indicare la chiave di attivazione. ';

@ 50, 50 SAY oSay VAR cMessage OF oDlg FONT oFont PIXEL

Activate dialog oDlg
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: justify a text
Posted: Thu May 24, 2012 06:28 AM

Did you searching that:

viewtopic.php?f=6t=19174

&

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: justify a text
Posted: Thu May 24, 2012 10:31 AM
Antolin,

thank You very much for the nice function.
I have done some small changes, to make it more flexible.
As well changes needed, to use big fonts.

LOCAL cText := ;
'Word-1 Word-2 Word-3 Word-4 Word-5 Word-6 Word-7 Word-8 Word-9 '+;
'Word-10 Word-11 Word-12 Word-14 Word-15 Word-16 Word-17 Word-18 '+;
'Word-19 Word-20 Word-21 Word-22 Word-23 Word-24 Word-25 Word-26'

DEFINE FONT oFont NAME "Arial" SIZE 0,-24 BOLD



I will create a little painter with frame autoadjust, testing fonts and colors, variable linespaces ...

First results !!!



Any Brush and Text-Color :



A Image :



Maybe a Border needed ?:



Image on Image with splitted Text :



Best Regards
Uwe :-)
Since 1995 ( the first release of FW 1.9 )

i work with FW.

If you have any questions about special functions, maybe i can help.
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: justify a text
Posted: Fri May 25, 2012 06:56 PM
Hello Otto,

I had a look at Your function, but it does just a WORDBREAK no textadjust.
Also the function I'm just testing, doesn't work 100 % because it just includes
blanks, to make shorter lines equal to the longest line.
The only way will be, to change the font char-width of a line to adjust to the needed length.



End of Line of Your Test :



Best regards
Uwe :-)
Since 1995 ( the first release of FW 1.9 )

i work with FW.

If you have any questions about special functions, maybe i can help.
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: justify a text
Posted: Fri May 25, 2012 07:19 PM
Hello Uwe,
thank you. As I am totally focused on metro style I didn’t care about text adjust.
I found this Design Guidelines for Windows 8 Metro apps.
http://msdn.microsoft.com/en-us/library/windows/apps/hh464920.aspx

Best regards,
Otto
Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: justify a text
Posted: Thu May 30, 2013 04:55 PM
ukoenig, perdona por la tardanza, pero he estado muy liado y, la verdad, es que no he vuelto a utilizar esta función hasta hace poco, por lo que no pude comprobar que efectivamente hay situaciones en que el texto no se justifica bien, pero ya lo he solucionado.

En el post:

viewtopic.php?f=6&t=19174

Cambia la función FormatText por esta otra muy similar:

Code (fw): Select all Collapse
FUNCTION FormatText(oDlg,oFont,cText,nAncho)   // SEPARA EL TEXTO EN LINEAS
   LOCAL cTrozo,cLinea,lFinLin                 // Y LAS GUARDA EN UN ARRAY
   LOCAL aTexto := {}
   LOCAL nCrlf  := 0
   LOCAL nTokn  := 0
   LOCAL hDc    := oDlg:GetDc()
   LOCAL nChar  := Int(nAncho/GetTextWidth(hDc,"B",oFont:hFont))
   *
   DO WHILE !Empty(cText)
      lFinLin := .F.
      cLinea  := ""
      nTokn := 0
      *
      cTrozo  := StrToken(cText,1)
      IF Left(cTrozo,2) = CRLF
         cText  := SubStr(cText,3)
         cTrozo := ""
         lFinLin := .T.
      ENDIF
      IF GetTextWidth(hDc,cTrozo,oFont:hFont) > nAncho
     cLinea := Left(cTrozo,nChar)
     cText  := STUFF(cText,1,LEN(cLinea),"")
     cTrozo := ""
      ENDIF
      *
      DO WHILE !Empty(cTrozo) .AND. !Empty(cText)
         cTrozo := StrToken(cText,1)
         nCrLf  := AT( CRLF, cTrozo )
         IF nCrLf > 0
            cTrozo  := Left(cTrozo,nCrLf-1)
            lFinLin := .T. //  <------------  FIN DE PARRAFO
         ENDIF
         *
         IF GetTextWidth(hDc,cLinea+cTrozo,oFont:hFont) > nAncho
        IF GetTextWidth(hDc,cTrozo,oFont:hFont) > (nAncho*0.4)
           cLinea := Left(cLinea+" "+cTrozo,nChar)
           cText  := STUFF(cText,1,LEN(cLinea),"")
        ENDIF 
        lFinLin := .F. //  <------------  NO FIN DE PARRAFO
        cTrozo  := ""
         ELSEIF lFinLin
            cText := STUFF(cText,1,LEN(cTrozo)+2,"")
            cLinea += cTrozo
        cTrozo := ""
            ++nTokn
         ELSE
            cText := LTRIM(STUFF(cText,1,LEN(cTrozo),""))
            cLinea += cTrozo+" "
            ++nTokn
         ENDIF
     *
     IF Empty(cText)    // LA ULTIMA LINEA SIEMPRE HA DE SER FIN DE PARRAFO
        lFinLin := .T.
     ENDIF
      ENDDO
      *
      AADD( aTexto, {RTRIM(cLinea),nTokn,lFinLin} )
   ENDDO
   oDlg:ReleaseDc()
RETURN aTexto


Espero que te funciones.

Un saludo
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Re: justify a text
Posted: Fri May 31, 2013 01:31 AM
Otto,

Well, I'm confused. Are you saying the the Metro Guidelines say to right justify? It appears that they say not to right justify.

6. Use kerning, tracking, hyphenation, and alignment effectively

As any type designer will tell you, the space between letters is just as important as the letter shapes. Kerning (mentioned in the first rule), applies spacing adjustments between specific pairs of letters to improve the letter spacing. We recommend that you apply it to all of your content.

Tracking, on the other hand, adds (or removes) space between all the letters in a string equally. As a font’s default letter spacing is often optimized for readability at a particular size, there are times when it might be appropriate to slightly widen the spacing. Tracking values of .01em or .02em may be helpful.

Using justified text makes it difficult to have good spacing. When text is forced to fit a container through justification, its spacing always suffers. Justified text usually has "rivers" of white space (large gaps between words) running through the content. Avoid fully-justified text and stick with left alignment whenever possible, and apply hyphenation to keep the right edge of the text from appearing too ragged.

http://msdn.microsoft.com/en-us/library ... 53415.aspx


Tracking, I believe, is referring to slightly adding to the kerning in certain situations (nothing to do with right justifying).

Maybe I am misunderstanding...

Regards,
James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Re: justify a text
Posted: Fri May 31, 2013 02:19 AM

Otto,

I re-read the thread and now I get it. You were talking about left-justifying multi-line text in a SAY. Others posted about right-justifying--thus my confusion.

Your example is not compiling due to the missing setup() function. Could we get that?

James

FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Re: justify a text
Posted: Sat Jun 01, 2013 01:18 AM

Otto,

This brings up an issue that I have been meaning to post about. The current TMetropanel and TMetrobutton are only useful for emulating the Windows 8 start screen. Windows 8 apps need much more flexibility such as different button sizes and different alignment. I note that the metrobutton class already has a drawMulitline() method but it depends on CRLF's already in the string. It would be very useful to have a method that would handle long strings automatically similar to your routine.

Otto, I am curious as to how you are building metro style apps without these classes?

I will start another topic about metro app design. I am very interested in this.

Regards,
James

FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: justify a text
Posted: Mon Jun 03, 2013 09:30 AM

Dear James,
Setup() is a function I initially got from you and I use now everywhere.
In this case I only ask the FONT and size.

DEFINE FONT ::oFntMetroMedium NAME cFontName SIZE 0,-26 * ::nFaktor
I calculate a factor for different screen resolutions. As I code all Dialogs “hardcoded” I use the factor for example like this:
nRowOffset := 20 * nFaktor
nRowSpace := 20 * nFaktor
nLine := 2
@ nRowOffset + nRowSpace * nLine, nWidth/5/2.05 * nSpalte;
COMBOMETRO oCbx ;
VAR cCombo ;
PROMPTS aItems ;
OF oDlg ;

I am very confused about Metro. You only read negative news. Users do not like, Start button comes back, …

Best regards,
Otto

Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: justify a text
Posted: Mon Jun 03, 2013 09:33 AM

Dear James,
… BTW, do you know how you can insert a desktop connection in WINDOWS 8 to start metro style Internet explorer or other RT programs.
Best regrads,
Otto

Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Re: justify a text
Posted: Mon Jun 03, 2013 01:26 PM
Otto,

I am very confused about Metro. You only read negative news. Users do not like, Start button comes back, …


Yes, there is a lot of complaining. However, there has been for every new version of Windows. And if we listened to all the negative feedback, we would all still be using DOS.

Also, I note that in general, I find most feedback (on anything) is negative. Happy customers don't spend the time to write up positive feedback like unhappy ones.

This is not to say that negative feedback can't be useful, because sometimes it is warranted.

I also find that most users cannot design good user interfaces (lots of programmers can't either). It takes a lot of real effort and lots of trial and error to come up with good user interfaces.

I see that the largest reason for Microsoft's implementation of Windows 8's new interface is an attempt to provide a similar interface on all devices--PC's, tablets, and phones. Of course, this may require some compromises.

I do not yet have a Windows 8 computer so I have not spent much time with it and I do not really have an opinion. Nevertheless, we programmers have to go with what is available, so we have to go with Windows 8 eventually.

IMHO.

James
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: justify a text
Posted: Mon Jun 03, 2013 01:36 PM

James, totally agree
My experience with Windows 8 is very good, it is fast and does not give any problem
regards

James, totalmente de acuerdo
Mi experiencia con Windows 8 es muy buena, es rápido y no da ningun problema
Saludos

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces

Continue the discussion