Link to home
Start Free TrialLog in
Avatar of Shay050799
Shay050799

asked on

CTabCtrl

Hi All,
i have a tab control, and i want to change the color of the selected item, either the text of the backgound of the text.

i did the following:
InsertItem(0,"Tab Name");

now everytime the user click on a tab, i want the text of the selected one to change its color and font size, i m changing the text like this:

TCITEM     tabItem;
tabItem.mask = TCIF_TEXT ;
abItem.pszText = "New Text";
SetItem(m_tabCurrent,&tabItem);

but how can i change the color ?

thanks \
shay
ASKER CERTIFIED SOLUTION
Avatar of GloriousRain
GloriousRain

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of GloriousRain
GloriousRain

<MSDN>
HOWTO: Change the Background Color of a Tab Control

Q179909


--------------------------------------------------------------------------------
The information in this article applies to:

Microsoft Windows Software Development Kit (SDK)
Microsoft Visual Studio 97

--------------------------------------------------------------------------------


SUMMARY
This article demonstrates how to change the background color of each tab in a Tab control. It assumes that you have a dialog box and have selected and sized a Tab control into the dialog using the Resource Editor.



MORE INFORMATION
To change the background color of each tab you must make the Tab control owner draw and use the FillRect() method to fill the rectangle area of the tab itself with a brush that you create and call the SetBkColor() method before you make a call to the TextOut() method with the text you want to appear on the tab.

First bring up the properties for the tab control in the Resource Editor and select the Styles tab. Select the "Owner draw fixed" check box and save your work. If you are dynamically creating the Tab control during the dialog box's initialization with CreateWindow() or CreateWindowEx() be sure to include the TCS_OWNERDRAWFIXED bit in the dwStyle parameter.

The following #defines are used in the sample:


        #define RED     RGB(255,0,0)
        #define YELLOW  RGB(255,255,0)
        #define MAGENTA RGB(255,0,255)
        #define WHITE   RGB(255,255,255)
        #define BLUE    RGB(0,0,255)
If You Are Using the SDK
The brushes in this sample excerpt were created in WM_INITDIALOG and are static handles.

Add the WM_DRAWITEM message to the dialog box's procedure.
Sample Code

   case WM_DRAWITEM:
      lpdis = (LPDRAWITEMSTRUCT) lParam; // item drawing information
      hTabCtrl = GetDlgItem(hDlg, IDC_TAB1);

      if (hTabCtrl == lpdis->hwndItem)   // is this the tab control?
      {
         // which tab? first, second...fifth
         switch (lpdis->itemID)
         {
         case 0:
            hbr = hbrRed;
            bkColor = RED;
            break;
         case 1:
            hbr = hbrYellow;
            bkColor = YELLOW;
            break;
         case 2:
            hbr = hbrMagenta;
            bkColor = MAGENTA;
            break;
         case 3:
            hbr = hbrWhite;
            bkColor = WHITE;
            break;
         case 4:
            hbr = hbrBlue;
            bkColor = BLUE;
            break;
         }

         memset(szTabText, '\0', sizeof(szTabText));

         tci.mask = TCIF_TEXT;
         tci.pszText = szTabText;
         tci.cchTextMax = sizeof(szTabText)-1;

         TabCtrl_GetItem(hTabCtrl, lpdis->itemID, &tci);

         FillRect(lpdis->hDC, &lpdis->rcItem, hbr);
         SetBkColor(lpdis->hDC, bkColor);

         TextOut(lpdis->hDC,
               lpdis->rcItem.left,
               lpdis->rcItem.top,
               tci.pszText,
               lstrlen(tci.pszText));
      }
      break;
If Your Are Using MFC
The brushes referred to are part of the dialog class and were created when the dialog constructor was called.

Override the OnDrawItem() method for your CDialog derived class using Class Wizard and add the following code, changing variable names as neccessary. It is important to note that a pointer to a CDC object from the handle of the DC passed in via the LPDRAWITEMSTRUCT is required, otherwise only the background of the text will be the desired color.
Sample Code

       void CMFCTabCtrlDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpdis)
       {
          CDialog::OnDrawItem(nIDCtl, lpdis);

          char        szTabText[100];
          RECT        rect;
          UINT        bkColor;
          CBrush      *cbr;
          TC_ITEM     tci;

          CTabCtrl    *pTabCtrl = (CTabCtrl *)GetDlgItem(IDC_TAB1);

          if (pTabCtrl->m_hWnd == lpdis->hwndItem)
          {
              // which tab?
              switch (lpdis->itemID)
              {
              case 0:
                  cbr = &m_brRed;
                  bkColor = RED;
                  break;

              case 1:
                  cbr = &m_brYellow;
                  bkColor = YELLOW;
                  break;

              case 2:
                  cbr = &m_brMagenta;
                  bkColor = MAGENTA;
                  break;

              case 3:
                  cbr = &m_brWhite;
                  bkColor = WHITE;
                  break;

              case 4:
                  cbr = &m_brBlue;
                  bkColor = BLUE;
                  break;
              }

              memset(szTabText, '\0', sizeof(szTabText));

              tci.mask        = TCIF_TEXT;
              tci.pszText     = szTabText;
              tci.cchTextMax  = sizeof(szTabText)-1;

              pTabCtrl->GetItem(lpdis->itemID, &tci);

              CDC *dc = CDC::FromHandle(lpdis->hDC);

              dc->FillRect(&lpdis->rcItem, cbr);
              dc->SetBkColor(bkColor);

              TextOut(lpdis->hDC,
                      lpdis->rcItem.left,
                      lpdis->rcItem.top,
                      tci.pszText,
                      lstrlen(tci.pszText));
          }
       }

Additional query words:

Keywords : kbCtrl kbNTOS kbWinOS2000 kbTabCtrl kbGrpUser kbVS97 kbWinOS
Issue type : kbhowto
Technology : kbvcSearch


Last Reviewed: July 7, 2000
? 2001 Microsoft Corporation. All rights reserved. Terms of Use.
 



--------------------------------------------------------------------------------
Send feedback to MSDN.Look here for MSDN Online resources.
<MSDN>
Avatar of Shay050799

ASKER

my OnItemDraw function, never gets called ?????

shay
i m using CFormView with a CTabCtrl on it, not cpropertypages !!!

Shay
Hi Shay,
Notice to HOWTO: Change the Text Color of the Selected Property Sheet Tab. Remember:

1. Go to Tab Control Properties of your tab control->Styles tab->Check "Owner draw fixed" check box to make your DrawItem function active
2. Just create CMyTabCtrl class as instruction, you needn't create CMyPropertySheet
3. Declare virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS) in CMyTabCtrl class

Now, use CMyTabCtrl instead of CTabCtrl in your application
i m not using property sheets at all !!!!
i m using CTabCtrl on CDialog !!

Shay
Hi Shay,
Have you read my comment carefully?
You needn't create CMyPropertySheet.
You just need create CMyTabCtrl as in article. Check "Owner draw fixed" check box in Tab Control Properties to active DrawItem function. Then use CMyTabCtrl instead of CTabCtrl. Cheers!

Have you done it, Shay?
sorry i was a way !!!
it works great, aparently i need to call OnDrawItem on the dialog, its works great thanks buddy
Shay
Cheers!