Announcement

Collapse
No announcement yet.

How to get lpFaceName from choosefont

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • How to get lpFaceName from choosefont

    I want to use a user selectable font option and choosefont is easy to
    use. I can't seem to figure out, though how to get the chosen lpfacename
    from the choosefontapi.lplogfont pointer to lpfacename
    in the logfont type def.
    Client Writeup for the CPA

    buffs.proboards2.com

    Links Page

  • #2
    lfFaceName As Asciiz * %LF_FACESIZE
    and thus no pointer..

    If lplogfont in choosefontapi.lplogfont is a pointer use @

    A$ = [email protected]
    hellobasic

    Comment


    • #3
      Thanks edwin, I had the @ sign in the wrong place. Thanks.

      Well, it didnt come back with anything.
      Here is the code (from Michael's example)
      Code:
      #COMPILE EXE
      #DEBUG ERROR ON
      #REGISTER NONE
      
      #INCLUDE  "WIN32API.INC"    ' file date: 2/25/02 (PB version date).
      #INCLUDE "COMDLG32.INC"
      #RESOURCE "CHOOSE_FONT.PBR"
      
      
      FUNCTION WINMAIN (BYVAL hInstance     AS LONG, _
                        BYVAL hPrevInstance AS LONG, _
                        BYVAL lpCmdLine     AS ASCIIZ PTR, _
                        BYVAL iCmdShow      AS LONG) AS LONG
        ' and the incredibly complicated code for what WinMain does:
        LOCAL cf AS choosefontapi       ' comdlg32
        cf.lstructSize  = SIZEOF(cf)
        cf.flags        = %CF_BOTH OR %CF_EFFECTS
      
        FUNCTION = ChooseFont(cf)
        ips&=cf.ipointsize
        fcnm$ = [email protected]
        MSGBOX STR$(ips&)+fcnm$
      
        FUNCTION = 5
      
      
      END FUNCTION
      but the fcnm$ returns nothing. The ips& comes back correctly as point size in decipoints (140 for 14 etc)
      Last edited by Fred Buffington; 12 Apr 2009, 02:13 PM.
      Client Writeup for the CPA

      buffs.proboards2.com

      Links Page

      Comment


      • #4
        Hi Fred,

        You need to provide the LOGFONT structure for the API to populate with data (currently the lpLogFont member points nowhere). Try this:

        Code:
        #COMPILE EXE
        #DEBUG ERROR ON
        #REGISTER NONE
        
        #INCLUDE  "WIN32API.INC"    ' file date: 2/25/02 (PB version date).
        #INCLUDE "COMDLG32.INC"
        #RESOURCE "CHOOSE_FONT.PBR"
        
        
        FUNCTION WINMAIN (BYVAL hInstance     AS LONG, _
                          BYVAL hPrevInstance AS LONG, _
                          BYVAL lpCmdLine     AS ASCIIZ PTR, _
                          BYVAL iCmdShow      AS LONG) AS LONG
          ' and the incredibly complicated code for what WinMain does:
          LOCAL cf AS choosefontapi       ' comdlg32
          LOCAL lf AS LOGFONT         '<---- added
          cf.lpLogFont = VARPTR(lf)         '<---- added
          cf.lstructSize  = SIZEOF(cf)
          cf.flags        = %CF_BOTH OR %CF_EFFECTS
        
          FUNCTION = ChooseFont(cf)
          ips&=cf.ipointsize
          fcnm$ = [email protected]
          MSGBOX STR$(ips&)+fcnm$
        
          FUNCTION = 5
        
        
        END FUNCTION
        Regards,

        Pete.

        Comment


        • #5
          You get a gpf, this seems to work but i didn't check msdn to verify all poss. errors:

          Code:
            ' and the incredibly complicated code for what WinMain does:
            Local cf As choosefontapi       ' comdlg32
            Local lf As logfont
          
            cf.lstructSize  = SizeOf(cf)
            cf.flags        = %CF_BOTH Or %CF_EFFECTS
          
            cf.lplogfont = VarPtr( lf )
          
            Function = ChooseFont(cf)
            Local  ips&, fcnm$
            
            ips&=cf.ipointsize
            fcnm$ = [email protected]
            MsgBox Str$(ips&)+fcnm$
          
            Function = 5
          Edit: crosspost, similar answer as above
          hellobasic

          Comment


          • #6
            Thanks edwin. I didnt get a GPF and it does work. Using version 8.01 for this instead of 9.01.

            I had put in the
            local lf as logfont

            but failed to add
            cf.lpLogFont = VARPTR(lf)

            Thanks also to Peter and Michael.
            Last edited by Fred Buffington; 13 Apr 2009, 12:30 PM.
            Client Writeup for the CPA

            buffs.proboards2.com

            Links Page

            Comment


            • #7
              You get/don't get a GPF depending on your #DEBUG ERROR setting.

              This line...
              Code:
              fcnm$ = cf.[COLOR="Red"]@lplogfont[/COLOR].lfFaceName
              .. is the crux of the issue.

              When you don't set the LOGFONT PTR member of the CHOOSEFONT structure, you have a null pointer at "@plogFont".

              With #DEBUG ERROR ON, because the pointer is null the statement is not attempted and ERROR 9 is set. Without this setting, the program attempts to read memory using a null pointer... which is a protection fault since you don't own the memory at 0x00000000

              MCM
              Michael Mattias
              Tal Systems (retired)
              Port Washington WI USA
              [email protected]
              http://www.talsystems.com

              Comment


              • #8
                Of course everything should be set 100% but it might be a better idea to read the contents from lf and not via the pointer.
                It more logical since you pass this pointer only to set this lf type var. but not to use it.
                But then, if it crashes or not, it should be written correctly after all.
                hellobasic

                Comment


                • #9
                  I just posted a Choose Font Include file which may answer some questions:

                  PowerBASIC and related source code. Please do not post questions or discussions, just source code.


                  ================================================
                  "If you want to make an apple pie from scratch,
                  you must first create the universe."
                  Carl Sagan
                  ================================================
                  It's a pretty day. I hope you enjoy it.

                  Gösta

                  JWAM: (Quit Smoking): http://www.SwedesDock.com/smoking
                  LDN - A Miracle Drug: http://www.SwedesDock.com/LDN/

                  Comment

                  Working...
                  X