Announcement

Collapse

Maintenance

The forum could be offline for 30-60 minutes in the very near future for maintenance (said 3pm Pacific). I was behind on getting this notice. I do apologize.
See more
See less

Multiline Frame error

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

  • Dave Biggs
    replied
    I'm with Charles on this one - Multiline applied to a frame, is kind of flakey.

    Using Control Add Frame or the equivalent Control Add "Button" with %BS_GROUPBOX style, the same problems are visible. Seperating the application of the styles with SetWindowLong doesn't change the way that CLIPCHILDREN chops the top half of the first of two 'Multilines'.
    This DDT sample shows a partial work-around that puts up a (sacrificial) blank first line which CLIPCHILDREN removes, leaving the two lines both visible. CLIPCHILDREN does stop the frame label 'beeding' past the side of the frame but the top line of the frame box is not shown as you would expect.
    Code:
    #COMPILE EXE
    #DIM ALL
     
    #INCLUDE "WIN32API.INC"
     
    FUNCTION PBMAIN()
     LOCAL hDlg, hCtrl AS DWORD
     DIALOG FONT DEFAULT "Arial" ,10 , 0 , 1
     
      DIALOG NEW PIXELS, 0, "Frame Test", 178, 185, 201, 140, %WS_CAPTION OR %WS_SYSMENU, TO hDlg
      DIALOG SET COLOR hDlg, -1, %WHITE
     
      CONTROL ADD FRAME, hDlg, 504, "", 40, 20, 70, 90, %BS_MULTILINE
      CONTROL HANDLE hDlg, 504 TO hCtrl
      SetWindowLong hCtrl, %GWL_STYLE, GetWindowLong(hCtrl, %GWL_STYLE) OR %WS_CLIPSIBLINGS
     
      CONTROL SET TEXT hDlg, 504, " " & $CR & "Title" & $CR & "Rocks"    ' 1st line 'clipped'
     
      DIALOG SHOW MODAL hDlg
     
    END Function
    I don't think it's a DDT issue either - see this pretty clumsy SDK sample that shows the same issues.
    Code:
    #COMPILE EXE
    #INCLUDE "WIN32API.INC"
    '
    FUNCTION WINMAIN (BYVAL hInstance AS LONG, BYVAL hPrevInstance AS LONG, _
                      BYVAL lpCmdLine AS ASCIIZ PTR, BYVAL iCmdShow AS LONG) AS LONG
      LOCAL hWnd&, My_wclass AS WndclassEx, szAppName AS ASCIIZ * 80, Msg AS tagMsg
      szAppName               = "MY_PBFAQ_SDK"
      My_wclass.cbSize        = SIZEOF(My_wclass)
      ' ---------------------------------------
      My_wclass.STYLE         = %CS_DBLCLKS                                 ' class styles effect how some things work (different than window styles)
      ' ---------------------------------------
      My_wclass.lpfnWndProc   = CODEPTR(My_WndProc)
      ' ---------------------------------------
      My_wclass.cbClsExtra    = 0                                           ' define extra data storage for class
      My_wclass.cbWndExtra    = 4                                           ' define extra data storage per each window instance (4 bytes can store 1 Long)
      My_wclass.hInstance     = GetModulehandle(BYVAL %NULL)                ' define handle to process (EXE)
      My_wclass.hIcon         = LoadIcon(0, BYVAL MAKLNG(%IDI_QUESTION,0))   ' default Icon displayed on ALT+TAB Dialogbox
      My_wclass.hCursor       = LoadCursor(0, BYVAL MAKLNG(%IDC_HELP,0))    ' default Cursor for window
      My_wclass.hbrBackground = GetStockObject(%GRAY_BRUSH)                 ' define window background brush
      My_wclass.lpszMenuName  = 0                                           ' define default menu (0= no default menu)
      ' ---------------------------------------
      My_wclass.lpszClassName = VARPTR(szAppName)
      ' ---------------------------------------
      My_wclass.hIconSm       = LoadIcon(0, BYVAL MAKLNG(%IDI_QUESTION,0))      ' default Icon displayed in window caption bar
      ' ---------------------------------------
      '
      RegisterClassEx My_wclass
      hWnd = CreateWindowEx(0, szAppName, "Naff SDK Dialog", _
                          %WS_overlappedwindow, 50, 50, 400, 300, _
                          %HWND_DESKTOP, %null, hInstance&, BYVAL %NULL)
      ShowWindow hWnd&, iCmdShow
      UpdateWindow hWnd&
      WHILE GetMessage(Msg, %NULL, 0, 0)
        TranslateMessage Msg
        DispatchMessage Msg
      WEND
    END Function 
    '------------------/WinMain
    '
    FUNCTION My_WndProc (BYVAL hWnd AS LONG, BYVAL wMsg AS LONG, _
                      BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG
        SELECT CASE wMsg  '----------- start message handling ----------
            Case %WM_CREATE
              hFram1& =CreateWindow("BUTTON", "Initial" & $CR & "Label" & $CR & "+ Multiline?", _
                %WS_CHILD OR %WS_VISIBLE OR %BS_GROUPBOX OR %BS_MULTILINE, _
                50, _
                50, _
                100, _
                100, _
                hWnd, BYVAL %NULL, GetModuleHandle(BYVAL %NULL), BYVAL %NULL)
              hFram2& =CreateWindow("BUTTON", "1" & $CR & "Title" & $CR & "CLIPSIBLINGS" & $CR & "Clip Top?", _
                %WS_CHILD OR %WS_VISIBLE OR %BS_GROUPBOX OR %BS_MULTILINE OR %WS_CLIPSIBLINGS, _
                250, _
                50, _
                100, _
                100, _
                hWnd, BYVAL %NULL, GetModuleHandle(BYVAL %NULL), BYVAL %NULL)
            Case %WM_SYSCOMMAND
              If (WParam AND &HFFF0) = %SC_CLOSE Then 
                'WinBeep 900, 500
                '%WM_CLOSE comes next unless..
                'Function = 1
              End If
            Case %WM_CLOSE
              'WinBeep 300, 500
              'Exit Function      ' DOES work here in SDK
            CASE %WM_DESTROY
              'WinBeep 100, 500
              PostQuitMessage 0
            EXIT FUNCTION
        END SELECT        '-----------  end message handling  ----------
      FUNCTION = DefWindowProc(hWnd&, wMsg&, wParam&, lParam&)
    END Function 
    '------------------/My_WndProc
    It's as if the frame control is displaying two superimposed labels.
    The first label is just a background but is what you would get if the frame was not Multiline - it grows as more text is added and obscures the top line of the frame box, evetually extending beyond it if not truncated with CLIPCHILDREN.
    The multiline text is displayed as you would expect but is chopped above the top of the frame if CLIPCHILDREN is applied.

    Leave a comment:


  • Gösta H. Lovgren-2
    replied
    I'm missing something here. You guys are creating a custom control called "button" not a frame control. At least as I see it. Here's a FRAME (using Charles's code):
    '
    Code:
    #Compile Exe
    #Dim All
    #Include "win32api.inc"
    Function PBMain()
       Local hDlg, nStyle As Long, s As String
       Local boundry As Long
       nStyle = %WS_SYSMENU Or %WS_MINIMIZEBOX
       Dialog New Pixels, 0, "Frame Title", , , 700, 300, nStyle To hDlg
       
       s =   "Title" & $CrLf & "Rocks At PowerBASIC"
       's = "Rocks At PowerBASIC"
       Control Add "BUTTON", hdlg, 504, s, 200, 100, 200, 100, _
                %BS_MULTILINE Or %WS_CHILD Or %WS_VISIBLE Or %WS_CLIPSIBLINGS Or %BS_GROUPBOX
    '
    '<<<<<<<<<<<<<<<<<<<<<<<<< Frame 
       boundry = 25
       Control Add Frame, hdlg, 505, " Frame around Button", _
                          200 - Boundry, _  'start left
                          100 - boundry, _  'start higher
                          200 + boundry + boundry, _ 'make wider
                          100 + boundry + boundry, _    'make deeper
                          %BS_Center
       Control Set Color hdlg, 505, %Yellow, %Red                   
    '>>>>>>>>>>>>>>>>>>>>>>>>>>>>   
       Dialog Show Modal hDlg
    End Function
    '

    Leave a comment:


  • Dominic Mitchell
    replied
    it looks to me like the frame control is designed only for one line titles
    No, the CONTROL ADD FRAME statement is broken. It cannot be used to create frames on a
    resizeable dialog unless a workaround is applied. Controls on a resizeable dialog must have the
    WS_CLIPSIBLINGS style, otherwise the dialog will look awful when it is resized.

    A frame belongs to the button class and has the BS_GROUPBOX style, therefore,
    this code
    Code:
    CONTROL ADD FRAME, hDlg, 504, "Title" & $CRLF & "Rocks At Grenada", 340,20,70,90, %BS_MULTILINE
    is the same as this code
    Code:
    CONTROL ADD "BUTTON", hdlg, 504, "Title" & $CRLF & "Rocks At Grenada", 340,20,70,90, _
                          %BS_GROUPBOX OR %BS_MULTILINE OR %WS_CHILD OR %WS_VISIBLE
    If you don't want to use the CONTROL ADD statement, you can add the WS_CLIPSIBLINGS style after the
    control is created like this
    Code:
     
    LOCAL hCtrl AS DWORD
    ...
    CONTROL ADD FRAME, hDlg, 504, "Title" & $CRLF & "Rocks At Grenada", 340,20,70,90, %BS_MULTILINE
    CONTROL HANDLE hDlg, 504 TO hCtrl
    SetWindowLong hCtrl, %GWL_STYLE, GetWindowLong(hCtrl, %GWL_STYLE) OR %WS_CLIPSIBLINGS
    Last edited by Dominic Mitchell; 22 Jan 2009, 04:14 AM.

    Leave a comment:


  • Charles Dietz
    replied
    Using Dominic's suggestion, it looks to me like the frame control is designed only for one line titles.

    Code:
    #COMPILE EXE
    #DIM ALL
    #INCLUDE "win32api.inc"
    
    FUNCTION PBMAIN()
       LOCAL hDlg, nStyle AS LONG, s AS STRING
       nStyle = %WS_SYSMENU OR %WS_MINIMIZEBOX
       DIALOG NEW PIXELS, 0, "Frame Title", , , 700, 300, nStyle TO hDlg
       
       s = "Title" & $CRLF & "Rocks At PowerBASIC"
       's = "Rocks At PowerBASIC"
       CONTROL ADD "BUTTON", hdlg, 504, s, 200, 100, 200, 100, _
                %BS_MULTILINE OR %WS_CHILD OR %WS_VISIBLE OR %WS_CLIPSIBLINGS OR %BS_GROUPBOX
    
       
       DIALOG SHOW MODAL hDlg
    END FUNCTION
    Of course you could work around it by placing a label control next to a frame with no title.

    Leave a comment:


  • Gösta H. Lovgren-2
    replied
    Gary, you don't show enough code so it's hard to tell but my guess is you make the frame smaller than the textbox (unless I'm not undersatanding the problem). See frame code below.

    '
    Code:
    'PBWIN 9.00 - WinApi 05/2008 - XP Pro SP3
    #Dim All 
    #Compile Exe  
    #Include "WIN32API.INC"
    '
    Global hdlg As Dword                
    %Id_Exit_Btn = 1000
    %Id_Sample_Textbox = 1001
    %Id_Show_Result_Btn = 1002
    ' 
    Macro Common_Locals 'Macro easier than retyping and maintains coding consistency
      Global Dlg_hght, Dlg_Wd As Long 'Global in case want to use in Controls
      Local Row, col, hght, tb_hght, wd, Longest,ctr, ln, ln1, i As Long
      Local  l, s As String
    End Macro  
    '
    CallBack Function Dialog_Processor              
      Common_Locals
      Select Case CbMsg     'This is TO determine the message TYPE 
         '       
         Case %WM_INITDIALOG'<- Initialiaton when the program loads 
         '
         Case %WM_SYSCOMMAND 'Traps Any Alt key but only F4 closes              
         '
         Case %WM_COMMAND  'This processes command messages
           Select Case CbCtl
             Case %Id_Show_Result_Btn 
                Control Get Text CbHndl, %Id_Sample_Textbox To l$
                  ? l$, , FuncName$
             Case %Id_Exit_Btn
               Select Case CbCtlMsg        
                  Case 0
                    Dialog End CbHndl 'Applikation beenden
               End Select
           End Select
      End Select
    End Function
    '
    Function PBMain
      Common_Locals
      Dlg_hght = 400
      Dlg_Wd = 400
      Dialog New Pixels, hdlg, "Demo", , , Dlg_Wd, Dlg_Hght, %WS_SYSMENU To hdlg 'centered
    '
      col = 10
      Wd = 40
      Hght = 12
      Row = hght * 5
    '  
      s$ = "Brown, Kevin" & $CrLf & _
           "123 PBWin Avenue" & $CrLf & _
           "PowerBasic, FL 12345"
    '         
      Tb_Hght = Hght * 10 'Plenty room for 10 lines of text
      Wd = Dlg_Wd - 20 'minus the label and leave a little
      Control Add TextBox, hdlg, %Id_Sample_Textbox, s$, Col, Row, Wd, TB_Hght, %ES_WantReturn Or %ES_MultiLine
    '
      '>>>>>>>>>>> Frame Code
      s$ = Trim$("Title") & $CrLf & Trim$("Rocks")
      Row = Row - 25 ' room for title above tb      
      Col = Col - 4 'start left of tb
      Wd = Wd + 8 'extend past TB
      TB_hght = TB_hght + 40 'extend below TB
      Control Add Frame, hdlg, 504, s$, Col, Row, Wd, TB_hght, %bs_left Or %bs_multiline
      '>>>>>>>>>>>> Ebd frame code
    '
       hght = 25   
       Wd = Dlg_Wd - 20
       Col = 10 'center
    '
       Row = Dlg_hght - (Hght * 2) - 4 'Just off bottom
         Control Add Button, hdlg, %Id_Show_Result_Btn, "Show Textbox Results", col, row, Wd, Hght
    '
       Row = Dlg_hght - Hght - 2 'Just off bottom
         Control Add Button, hdlg, %Id_Exit_Btn, "Abandon Ship", col, row, Wd, Hght
    '  
         Dialog Show Modal hDlg   Call Dialog_Processor
    End Function  'Applikation beenden
    '
    ========================
    Remember that lost time
    does not return.
    Thomas a Kempis
    ========================

    Leave a comment:


  • Walt Thompson
    replied
    Hi Gary;

    I'm sorry to hear that my suggestion didn't work for you.

    Leave a comment:


  • Dominic Mitchell
    replied
    Trust me, the information I posted works. What you are seeing is DDT not honouring the
    styles you set for the frame.
    CONTROL ADD FRAME does not set the WS_CLIPSIBLINGS style for the control. You will have
    to ask PowerBASIC why this statement ignores such an important style.

    Give CONTROL ADD the boot and use the following instead:
    Code:
     
    CONTROL ADD "BUTTON", hdlg, 504, "Title" & $CRLF & "Rocks At PowerBASIC", 340,20,70,90, _
                %BS_GROUPBOX OR %BS_MULTILINE OR %WS_CHILD OR %WS_VISIBLE OR %WS_CLIPSIBLINGS

    Leave a comment:


  • Gary Beene
    replied
    Hi Walter,

    Thanks for the comment, but I'm not sure you're right. In my example, the frame was wider than the longest word, but still got bleed over onto the dialog.

    Did I misunderstand your comment?
    Last edited by Gary Beene; 21 Jan 2009, 05:28 PM.

    Leave a comment:


  • Walt Thompson
    replied
    This works correctly. However, the width of the frame must be greater the length of the longest word in the caption.

    Code:
        CONTROL ADD FRAME, hDlg, %FrameD, "Checkstand" & $CRLF & "Teststand", 840, 600, 100, 100, %BS_MULTILINE
        CONTROL SET COLOR  hDlg, %FrameD,  %BLACK, %CYAN
        CONTROL ADD FRAME, hDlg, %FrameD, "", 840, 600, 100, 100
    Attached Files

    Leave a comment:


  • Gary Beene
    replied
    Hi Dominic,

    That didn't seem to work. Here's the code:

    Code:
        Control Add Frame, hdlg, 504, "Title" & $CrLf & "Rocks", 340,20,70,90, %bs_multiline Or %ws_clipsiblings
    I get this:



    I'll look at MSDN for any other nuances of using ws_clipsiblings.

    Leave a comment:


  • Dominic Mitchell
    replied
    Add the WS_CLIPSIBLINGS style to the control.
    When a control has the WS_CLIPSIBLINGS style, it does not paint areas of its
    client area that are overlapped by other controls. It also does not paint
    outside its boundaries when the device context it uses is that of its parent window.
    That is, when its class is created with the CS_PARENTDC style.

    Leave a comment:


  • Gary Beene
    replied
    Thanks for the response, Walter.

    But try your example with longer text, such as

    Code:
    "Checkstand" & $crlf & "StandAlone"
    It will still exhibit the problem I mention.

    Even if I match text background color to the dialog color, the problem is that I cannot bring
    a control adjacent to the frame (well, at least not without having to worry about the order
    of placement).

    I'd think that the control would not try to place colors outside the bounds of the control.
    Last edited by Gary Beene; 20 Jan 2009, 11:25 PM.

    Leave a comment:


  • Walt Thompson
    replied
    Frame with Multi Line Text

    This will draw frame with multiline text. the CONTROL SET COLOR is used to match the text background to the dialog.


    Code:
        CONTROL ADD FRAME, hDlg, %FrameD, "Check" & CHR$(13) & "Stand", 840, 600, 100, 100, %BS_MULTILINE
        CONTROL SET COLOR  hDlg, %FrameD,  %BLACK, %CYAN
        CONTROL ADD FRAME, hDlg, %FrameD, "", 840, 600, 100, 100 '880, 607, 32, 1, ,

    Leave a comment:


  • Gary Beene
    started a topic Multiline Frame error

    Multiline Frame error

    When I use a multiline style on a frame, I get this mangled result.



    The multiline works, but the text background extends to the right beyond the border of the frame.

    Here's the line of code that generated it.

    Code:
        Control Add Frame, hdlg, 504, "Title" & $CrLf & "Rocks", 340,20,70,90, %bs_left Or %bs_multiline
    Changing text justification just changes where the excess background is found.

    Has anyone seen this?
    Last edited by Gary Beene; 20 Jan 2009, 05:51 PM.
Working...
X