Announcement

Collapse
No announcement yet.

Coloring tabs with the new tab feature in PB 9

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

  • Charles Dietz
    replied
    Here is some code to highlight the raised tab portion. I have stripped out all of the extraneous font and color stuff from PowerBasic's tab control example in the Samples folder, and added a routine originally written by, I think, Borje Hagsten. Note that the resource reference has been omitted, #INCLUDE "commCtrl.inc" is needed, %TCS_OWNERDRAWFIXED style added to CONTROL ADD TAB, and Borje's ColorTab() routine is added at the end.

    Code:
    #COMPILE EXE
    #DIM ALL
    #INCLUDE "win32api.inc"
    #INCLUDE "commCtrl.inc"
    
    ' Control equates
    %ID_TAB            = 1000
    %ID_TAB1_TBFIRST   = 1001
    %ID_TAB1_LBFIRST   = 1002
    %ID_TAB1_LBLAST    = 1003
    %ID_TAB1_TBLAST    = 1004
    %ID_TAB1_BNSUBMIT  = 1005
    %ID_TAB2_CBCHOICES = 1006
    %ID_TAB3_LBCHOICES = 1007
    %ID_TAB3_TEXTBOX   = 1008
    
    GLOBAL hDlg AS LONG
    
    FUNCTION PBMAIN () AS LONG
      LOCAL hTab1     AS LONG
      LOCAL hTab2     AS LONG
      LOCAL hTab3     AS LONG
      DIALOG NEW 0, "Tab Control Example", , , 300, 140, %WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION OR _
        %WS_SYSMENU OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _
        %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
    
      ' Add a Tab control to the main dialog box
      CONTROL ADD TAB, hDlg, %ID_TAB, "", 1, 1, 298, 138, %TCS_OWNERDRAWFIXED
    
      ' Build the Tab 1 dialog and it's controls
      TAB INSERT PAGE hDlg, %ID_TAB, 1, 0, "Tab 1", CALL TabProc TO hTab1
      CONTROL ADD LABEL,   hTab1, %ID_TAB1_LBFIRST,  "First name", 2, 6, 100, 12
      CONTROL ADD TEXTBOX, hTab1, %ID_TAB1_TBFIRST, "", 60, 6, 100, 12
      CONTROL ADD LABEL,   hTab1, %ID_TAB1_LBLAST,  "Last name", 2, 20, 100, 12
      CONTROL ADD TEXTBOX, hTab1, %ID_TAB1_TBLAST, "", 60, 20, 100, 12
      CONTROL ADD BUTTON,  hTab1, %ID_TAB1_BNSUBMIT, "Submit", 235, 100, 50, 14
    
      ' Build the Tab 2 dialog and it's controls
      TAB INSERT PAGE hDlg, %ID_TAB, 2, 0, "Tab 2", CALL TabProc TO hTab2
      CONTROL ADD COMBOBOX, hTab2, %ID_TAB2_CBCHOICES, , 2, 6, 100, 40, %CBS_DROPDOWNLIST OR %WS_TABSTOP OR %WS_CHILD
      COMBOBOX ADD          hTab2, %ID_TAB2_CBCHOICES, "Choice 1"
      COMBOBOX ADD          hTab2, %ID_TAB2_CBCHOICES, "Choice 2"
      COMBOBOX ADD          hTab2, %ID_TAB2_CBCHOICES, "Choice 3"
      COMBOBOX ADD          hTab2, %ID_TAB2_CBCHOICES, "Choice 4"
      COMBOBOX ADD          hTab2, %ID_TAB2_CBCHOICES, "Choice 5"
      COMBOBOX SELECT       hTab2, %ID_TAB2_CBCHOICES, 1
    
      ' Build the Tab 3 dialog and it's controls
      TAB INSERT PAGE hDlg, %ID_TAB, 3, 0, "Tab 3", CALL TabProc TO hTab3
      CONTROL ADD LISTBOX,  hTab3, %ID_TAB3_LBCHOICES, , 2, 6, 100, 60
      LISTBOX ADD           hTab3, %ID_TAB3_LBCHOICES, "Item 1"
      LISTBOX ADD           hTab3, %ID_TAB3_LBCHOICES, "Item 2"
      LISTBOX ADD           hTab3, %ID_TAB3_LBCHOICES, "Item 3"
      LISTBOX ADD           hTab3, %ID_TAB3_LBCHOICES, "Item 4"
      LISTBOX ADD           hTab3, %ID_TAB3_LBCHOICES, "Item 5"
      LISTBOX ADD           hTab3, %ID_TAB3_LBCHOICES, "Item 6"
      LISTBOX ADD           hTab3, %ID_TAB3_LBCHOICES, "Item 7"
      CONTROL ADD TEXTBOX,  hTab3, %ID_TAB3_TEXTBOX, "", 120, 6, 100, 12, %WS_CHILD OR %WS_TABSTOP OR %WS_VISIBLE OR %ES_READONLY
    
      ' Display the main dialog box
      DIALOG SHOW MODAL hDlg CALL tabCtrlProc
    END FUNCTION
     
    ' Callback function used by all Tab dialogs
    CALLBACK FUNCTION TabCtrlProc()
       SELECT CASE AS LONG CB.MSG
          CASE %WM_DRAWITEM 'draw tab item text in different color on select
             IF CB.WPARAM = %ID_Tab THEN colorTab CBHNDL, CBWPARAM, CBLPARAM
       END SELECT 
    END FUNCTION 
     
    ' Callback function used by all Tab dialogs
    CALLBACK FUNCTION TabProc
      LOCAL i    AS LONG
      LOCAL s    AS STRING
    
      SELECT CASE AS LONG CB.MSG
        CASE %WM_COMMAND
          SELECT CASE AS LONG CB.CTL
    
            CASE %ID_TAB1_BNSUBMIT
              IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
                MSGBOX "Submit button on Tab 1 clicked", %MB_TASKMODAL
              END IF
    
            CASE %ID_TAB2_CBCHOICES
              IF CB.CTLMSG = %CBN_SELCHANGE THEN
                COMBOBOX GET SELECT CB.HNDL, %ID_TAB2_CBCHOICES TO i
                COMBOBOX GET TEXT   CB.HNDL, %ID_TAB2_CBCHOICES, i TO s
                ? "You selected "+s
              END IF
    
            CASE %ID_TAB3_LBCHOICES
              IF CB.CTLMSG = %LBN_SELCHANGE THEN
                LISTBOX GET SELECT CB.HNDL, %ID_TAB3_LBCHOICES TO i
                LISTBOX GET TEXT   CB.HNDL, %ID_TAB3_LBCHOICES, i TO s
                CONTROL SET TEXT   CB.HNDL, %ID_TAB3_TEXTBOX, s
              END IF
          END SELECT
      END SELECT
    END FUNCTION
    
    SUB colorTab(hDlg AS LONG, wParm AS LONG, lParm AS LONG)
       LOCAL lDISPtr AS DRAWITEMSTRUCT PTR, zCap AS ASCIIZ * 50
       LOCAL ti AS TC_ITEM, TextDrawFlag AS LONG
       LOCAL nColor, hBrush AS LONG
    
       lDisPtr = lparm
       nColor = RGB(220, 220&, 240&)
       hBrush = CreateSolidBrush(nColor)
       SelectObject @lDisptr.hDc, hBrush
       
       @lDisptr.rcItem.nTop = @lDisptr.rcItem.nTop + 4
       IF @lDisPtr.ItemState = %ODS_SELECTED THEN
          SetTextColor @lDisPtr.hDc, %BLUE
          SetBkColor @lDisPtr.hDc, nColor
          FillRect @lDisptr.hDc, @lDisptr.rcItem, hBrush
       ELSE
          SetTextColor @lDisPtr.hDc, %BLACK
          SetBkColor @lDisPtr.hDc, GetSysColor(%COLOR_3DFACE)
          FillRect @lDisptr.hDc, @lDisptr.rcItem, GetSysColorBrush(%COLOR_3DFACE)
       END IF
    
       ti.mask = %TCIF_TEXT
       ti.pszText = VARPTR(zCap)
       ti.cchTextMax = SIZEOF(zCap)
       CALL TabCtrl_GetItem(GetDlgItem(hDlg, wParm), @lDisptr.itemID, ti)
       DrawText @lDisptr.hDc, zCap, LEN(zCap), @lDisptr.rcItem, %DT_SINGLELINE OR %DT_CENTER
       DeleteObject hBrush
    END SUB

    Leave a comment:


  • Barry Marks
    replied
    I saw the reference to XP styles but I didn't really understand that. I've never really paid much attention to the different GUI styles and I'm using Vista so I wasn't sure that applied to me anyway.

    I tried commenting it out and I couldn't see any difference so I left it commented.

    I'm finding that I like to write very simple and straightforward interfaces. Since I'm only writing very simple programs anyway that works fine for me. Most just have a simple window with the few controls I've learned to deal with. The fun part has been to try to find ways to turn that into something amusing to write and to use. The writing has been fun but the audience I have in mind for this, the others at this retirement home, don't seem interested in the programs, at least not yet. I'm having furn writing them so that's minor.

    Barry

    Leave a comment:


  • George Bleck
    replied
    I never throw away old junk code... It gets filed away and possibly used again later.

    Think of it this way... even if it's "crap" that's fertilizer for something better later, it feeds ideas

    Leave a comment:


  • Charles Dietz
    replied
    Barry, I was trying something similar, just today. I was trying to find some way to color the raised part of the tab pages since it is difficult for the user to know which tab page has been selected. The tab control example in the Samples folder uses a reference to xp themes in the resource file to highlight the selected page. I was trying to find another way of doing this, but haven't had any success yet.

    Leave a comment:


  • Barry Marks
    replied
    Originally posted by Cliff Nichols View Post
    never NEVER NEVER delete code you are working on!!!!
    I'm a well retired programmer and all I do is play around with it now so if I lose all my code it's no big deal.

    I like to learn with little experiments and the confidence that it'll be thrown away when I'm done helps me feel a little freer to experiment and I find that I'm a little more imaginative. I've always done that when I could and I find it works well for me.

    Anyway, the point of what I was doing was just to try to understand how tabbed interfaces work. The painting was a trivial part of it. I was curious so I tried CONTROL ADD COLOR and it didn't work so after a few different attempts I put it back like it was and went on with my learning.

    That little experiment did point out to me that the tab's ID could be used as the parent for controls. I have almost no GUI experience so that was a surprise to me. I'm sure I'd have eventually seen that anyway but this helped me to understand it when I did.

    Barry

    Leave a comment:


  • Rodney Hicks
    replied
    never NEVER NEVER delete code you are working on!!!!
    This already sounds like one of those personal choices.

    But Michael,
    If you delete the crap, giving you a clean page, isn't that what you started with when you created the crap?

    Leave a comment:


  • Michael Mattias
    replied
    >never NEVER NEVER delete code you are working on!!!!

    ???

    What if it's crap?

    When I create crap, I delete it immediately so I'm not tempted to use any of it. Forces me to start over with a clean page, which will surely result in something better than crap.

    Leave a comment:


  • Cliff Nichols
    replied
    never NEVER NEVER delete code you are working on!!!!

    You may need a concept you are working on that crops up again later

    You never know....sometimes it all boils down to "Well this worked, but this didn't....How come????" and compare the 2 and realize the differences

    Leave a comment:


  • Barry Marks
    replied
    I'd like to have posted some code but by the time it occurred to me to post a message about this I'd already deleted that and started playing with using the SDK to do it as in the provided example.

    I may give it another try tomorrow and post some code.

    Barry

    Leave a comment:


  • Theo Gottwald
    replied
    Or at least you post some compilable code.
    I didn't say something new here .

    Leave a comment:


  • Michael Mattias
    replied
    Sounds like a question which will get a much better and faster response were it directly sent to [email protected]

    Leave a comment:


  • Barry Marks
    started a topic Coloring tabs with the new tab feature in PB 9

    Coloring tabs with the new tab feature in PB 9

    I've been playing with the tab example in PB 9 and it uses a subroutine with SDK functions to paint a gradient on each tab. I tried to remove that and use CONTROL SET COLOR instead, not for any good reason but just to learn the ins and outs of it. But I can't seem to get it to work.

    Is that something that just isn't going to work? Or am I missing something?

    Barry
Working...
X