Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. How to add tabs to CView Class?

How to add tabs to CView Class?

Scheduled Pinned Locked Moved C / C++ / MFC
c++tutorialquestion
31 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Sampath579

    Hey sorry for the wrong indentation. Its working absolutely fine with same piece of code. The problem is what i mentioned earlier i.e., the coordinates what i provided does not show the tab control in my split window. I changed the values with hit and trail and some portion of tab control is visible on split window.

    if (!m_tab.Create(CMFCTabCtrl::STYLE_3D, CRect(500, -500, 900, 300), this, 1, CMFCTabCtrl::LOCATION_BOTTOM))
    {
    TRACE(_T("Failed to create output tab window\n"));
    return -1;
    }

    The values 500,-500,900,300 shown the control on my window. I need to write logic to show this control at the bottom of split window. Thanks for your support. Now, i will tweak this and try to add tabs to it. In case of any block i will post it back.

    _ Offline
    _ Offline
    _Flaviu
    wrote on last edited by
    #18

    Sure. In my code I give it an empty CRect, and it work fine.

    S 1 Reply Last reply
    0
    • _ _Flaviu

      Sure. In my code I give it an empty CRect, and it work fine.

      S Offline
      S Offline
      Sampath579
      wrote on last edited by
      #19

      Please correct me if i am wrong. While creating a Split window using below statement.

      bStatus = GetSplitterObj()->CreateView
      			(
      				1,
      				1,
      				RUNTIME\_CLASS(CMyTabClass),
      				sizeView,
      				pContext
      			);
      

      Above call create Split Window. CMyTabClass is derived from CTabView. So, by default the split window should contain tab splitter at the bottom of the window. Am i right? Because this is how it working in my sample application. In sample i created a Class which derives from CTabView and the window is created with tab splitter in the bottom by default. Later i started adding view using addview(). Then why in my application, splitter is not visible in bottom of the splitter window? why should i explicitly create it using Create()..?

      _ 1 Reply Last reply
      0
      • S Sampath579

        Please correct me if i am wrong. While creating a Split window using below statement.

        bStatus = GetSplitterObj()->CreateView
        			(
        				1,
        				1,
        				RUNTIME\_CLASS(CMyTabClass),
        				sizeView,
        				pContext
        			);
        

        Above call create Split Window. CMyTabClass is derived from CTabView. So, by default the split window should contain tab splitter at the bottom of the window. Am i right? Because this is how it working in my sample application. In sample i created a Class which derives from CTabView and the window is created with tab splitter in the bottom by default. Later i started adding view using addview(). Then why in my application, splitter is not visible in bottom of the splitter window? why should i explicitly create it using Create()..?

        _ Offline
        _ Offline
        _Flaviu
        wrote on last edited by
        #20

        The code:

        bStatus = GetSplitterObj()->CreateView
        (
        1,
        1,
        RUNTIME_CLASS(CMyTabClass),
        sizeView,
        pContext
        );

        it is only put CMyTabClass view into your splitter window. The creation of the tabs inside this CMyTabClass should be done in CMyTabClass::OnCreate, where AddView(...) calling is mandatory. So, you should add at least one tab in order to see something inside your splitter window :)

        S 1 Reply Last reply
        0
        • _ _Flaviu

          The code:

          bStatus = GetSplitterObj()->CreateView
          (
          1,
          1,
          RUNTIME_CLASS(CMyTabClass),
          sizeView,
          pContext
          );

          it is only put CMyTabClass view into your splitter window. The creation of the tabs inside this CMyTabClass should be done in CMyTabClass::OnCreate, where AddView(...) calling is mandatory. So, you should add at least one tab in order to see something inside your splitter window :)

          S Offline
          S Offline
          Sampath579
          wrote on last edited by
          #21

          Then how come in sample application, below code itself creating a tab bar (horizontal with arrow buttons) in window?

          if (CTabView::OnCreate(lpCreateStruct) == -1)
          return -1;

          The same above piece of code in my application not creating that horizontal tab bar unless i create MFCTabCtl tab; tab.create()....

          1 Reply Last reply
          0
          • _ _Flaviu

            First of all, create an CTabbedView derived from CTabView.

            class CTabbedView : public CTabView
            {
            protected: // create from serialization only
            CTabbedView();
            DECLARE_DYNCREATE(CTabbedView)
            ...
            };

            Then, in OnCreate:

            int CTabbedView::OnCreate(LPCREATESTRUCT lpCreateStruct)
            {
            if (CTabView::OnCreate(lpCreateStruct) == -1)
            return -1;

            m\_wndTabs.DestroyWindow();
            if (! m\_wndTabs.Create(CMFCTabCtrl::STYLE\_3D, CRect(0, 0, 0, 0), this, 1, CMFCTabCtrl::LOCATION\_BOTTOM))
            {
            	TRACE(\_T("Failed to create output tab window\\n"));
            	return -1;
            }
            
            m\_wndTabs.SetFlatFrame();
            m\_wndTabs.SetTabBorderSize(0);
            m\_wndTabs.AutoDestroyWindow(TRUE);
            
            AddView(RUNTIME\_CLASS(CYourView1), \_T("Title 1"));
            AddView(RUNTIME\_CLASS(CYourView2), \_T("Title 2"));
            
            return 0;
            

            }

            and in your childframe, where you create the view inside your splitter, you can put this CTabbedView as any CView:

            if(! m\_wndSplitterTab.CreateView(1, 0, RUNTIME\_CLASS(CTabbedView), CSize(0, 0), pContext))
            {
            	m\_wndSplitterTab.DestroyWindow();
            	return FALSE;
            }
            

            Tell me if is not clear.

            S Offline
            S Offline
            Sampath579
            wrote on last edited by
            #22

            In above provided sample code, i have some doubts. When i created a class CTabbedView which is inherited from CTabView, in OnCreate(), the below call it self created a tab control (horizontal splitter) without any tabs.

            if (CTabView::OnCreate(lpCreateStruct) == -1)
            return -1;

            Then what is the use of below call?

            if (!m_tab.Create(CMFCTabCtrl::STYLE_3D, CRect(0, 0, 500, 100), this, 1, CMFCTabCtrl::LOCATION_BOTTOM))
            {
            TRACE(_T("Failed to create output tab window\n"));
            return -1;
            }

            What is the exact difference between AddTab and AddView.?

            _ 1 Reply Last reply
            0
            • S Sampath579

              In above provided sample code, i have some doubts. When i created a class CTabbedView which is inherited from CTabView, in OnCreate(), the below call it self created a tab control (horizontal splitter) without any tabs.

              if (CTabView::OnCreate(lpCreateStruct) == -1)
              return -1;

              Then what is the use of below call?

              if (!m_tab.Create(CMFCTabCtrl::STYLE_3D, CRect(0, 0, 500, 100), this, 1, CMFCTabCtrl::LOCATION_BOTTOM))
              {
              TRACE(_T("Failed to create output tab window\n"));
              return -1;
              }

              What is the exact difference between AddTab and AddView.?

              _ Offline
              _ Offline
              _Flaviu
              wrote on last edited by
              #23

              AddTab call is creating the tab area: "Call this method to add a pane as a new tab on a tabbed pane" CBaseTabbedPane Class[^] and AddView call is creating the view which are hosted by CTabView: "Call this function to add a view to the tab control that is embedded in a frame" CTabView Class[^]

              S 2 Replies Last reply
              0
              • _ _Flaviu

                AddTab call is creating the tab area: "Call this method to add a pane as a new tab on a tabbed pane" CBaseTabbedPane Class[^] and AddView call is creating the view which are hosted by CTabView: "Call this function to add a view to the tab control that is embedded in a frame" CTabView Class[^]

                S Offline
                S Offline
                Sampath579
                wrote on last edited by
                #24

                In my case, i need to create tabs dynamically. Lets say. When my application starts user will input a value between 1 to 10. Based on user input i need to create the tabs (no. of tabs). later in each tab in need to display different images. In this case, should i create my class which is inheriting from CTabView or CTabPane?

                _ 1 Reply Last reply
                0
                • S Sampath579

                  In my case, i need to create tabs dynamically. Lets say. When my application starts user will input a value between 1 to 10. Based on user input i need to create the tabs (no. of tabs). later in each tab in need to display different images. In this case, should i create my class which is inheriting from CTabView or CTabPane?

                  _ Offline
                  _ Offline
                  _Flaviu
                  wrote on last edited by
                  #25

                  " should i create my class which is inheriting from CTabView or CTabPane?" Definitely from CTabView. And this CMyTabClass, should include at least one tab, with one view.

                  S 1 Reply Last reply
                  0
                  • _ _Flaviu

                    " should i create my class which is inheriting from CTabView or CTabPane?" Definitely from CTabView. And this CMyTabClass, should include at least one tab, with one view.

                    S Offline
                    S Offline
                    Sampath579
                    wrote on last edited by
                    #26

                    If i call AddView(), this itself is creating a tab. Is this not enough? No need to call AddTab() right?

                    _ 1 Reply Last reply
                    0
                    • S Sampath579

                      If i call AddView(), this itself is creating a tab. Is this not enough? No need to call AddTab() right?

                      _ Offline
                      _ Offline
                      _Flaviu
                      wrote on last edited by
                      #27

                      Yes, AddView() is creating a tab, so, it is enough.

                      1 Reply Last reply
                      0
                      • _ _Flaviu

                        Dear member, in order to read easily, please format your code (use "code" button from above edit area). And, yes, m_tab.Create(...) return TRUE, but further more, you do nothing ...

                        S Offline
                        S Offline
                        Sampath579
                        wrote on last edited by
                        #28

                        If i call AddView() and run my program, it working absolutely fine with a window and a view(tab). But instead of calling AddView() initially, at runtime i based on user input, i called addview() which leads to a crash. What could be the reason.

                        class View : public CScrollView
                        {

                        }

                        //below is my main class
                        class MyTabClass : public CTabView
                        {
                        //this function gets called automatically during creation of window.
                        void OnCreate(LPCREATESTRUCT lpCreateStruct)
                        {
                        if (CTabView::OnCreate(lpCreateStruct) == -1)
                        return -1;
                        AddView(RUNTIME_CLASS(View),_T("Sheet1")); //this works fine.
                        }

                        //this function i will call based on user input and hence its crashing during addView call.
                        void RunTimeBasedOnUserInput()
                        {
                        	for(int i = 0 ; i < userinput; i++)
                        	{
                        		AddView(RUNTIME\_CLASS(View),\_T("sheet %d",i));
                        	}
                        
                        }
                        

                        }

                        After investigation, what i found is, During creation of window itself, OnInitUpdate function in class View is getting called each time when AddView() is called. But if i create the views dynamically, then AddView() wont call OnInitUpdate of my View class and hence the crash occurs. Exception as follows: --------------------------- Microsoft Visual C++ Runtime Library --------------------------- Debug Assertion Failed! Program: C:\Windows\SYSTEM32\mfc140d.dll File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxtabview.cpp Line: 102 For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) --------------------------- Abort Retry Ignore --------------------------- Can you let me know how to get rid of this problem?

                        1 Reply Last reply
                        0
                        • _ _Flaviu

                          Dear member, in order to read easily, please format your code (use "code" button from above edit area). And, yes, m_tab.Create(...) return TRUE, but further more, you do nothing ...

                          S Offline
                          S Offline
                          Sampath579
                          wrote on last edited by
                          #29

                          If i call AddView() and run my program, its working absolutely fine with a window and a view(tab). But instead of calling AddView() initially, at runtime based on user input, i called addview() which leads to a crash. What could be the reason.

                          class View : public CScrollView
                          {

                          }

                          //below is my main class
                          class MyTabClass : public CTabView
                          {
                          //this function gets called automatically during creation of window.
                          void OnCreate(LPCREATESTRUCT lpCreateStruct)
                          {
                          if (CTabView::OnCreate(lpCreateStruct) == -1)
                          return -1;
                          AddView(RUNTIME_CLASS(View),_T("Sheet1")); //this works fine.
                          }

                          //this function i will call based on user input and hence its crashing during addView call.
                          void RunTimeBasedOnUserInput()
                          {
                          	for(int i = 0 ; i < userinput; i++)
                          	{
                          		AddView(RUNTIME\_CLASS(View),\_T("sheet %d",i));
                          	}
                          
                          }
                          

                          }

                          1 Reply Last reply
                          0
                          • _ _Flaviu

                            AddTab call is creating the tab area: "Call this method to add a pane as a new tab on a tabbed pane" CBaseTabbedPane Class[^] and AddView call is creating the view which are hosted by CTabView: "Call this function to add a view to the tab control that is embedded in a frame" CTabView Class[^]

                            S Offline
                            S Offline
                            Sampath579
                            wrote on last edited by
                            #30

                            If i call AddView() and run my program, its working absolutely fine with a window and a view(tab). But instead of calling AddView() initially, at runtime based on user input, i called addview() which leads to a crash. What could be the reason.

                            class View : public CScrollView
                            {

                            }

                            //below is my main class
                            class MyTabClass : public CTabView
                            {
                            //this function gets called automatically during creation of window.
                            void OnCreate(LPCREATESTRUCT lpCreateStruct)
                            {
                            if (CTabView::OnCreate(lpCreateStruct) == -1)
                            return -1;
                            AddView(RUNTIME_CLASS(View),_T("Sheet1")); //this works fine.
                            }

                            //this function i will call based on user input and hence its crashing during addView call.
                            void RunTimeBasedOnUserInput()
                            {
                            	for(int i = 0 ; i < userinput; i++)
                            	{
                            		AddView(RUNTIME\_CLASS(View),\_T("sheet %d",i));
                            	}
                            
                            }
                            

                            }

                            _ 1 Reply Last reply
                            0
                            • S Sampath579

                              If i call AddView() and run my program, its working absolutely fine with a window and a view(tab). But instead of calling AddView() initially, at runtime based on user input, i called addview() which leads to a crash. What could be the reason.

                              class View : public CScrollView
                              {

                              }

                              //below is my main class
                              class MyTabClass : public CTabView
                              {
                              //this function gets called automatically during creation of window.
                              void OnCreate(LPCREATESTRUCT lpCreateStruct)
                              {
                              if (CTabView::OnCreate(lpCreateStruct) == -1)
                              return -1;
                              AddView(RUNTIME_CLASS(View),_T("Sheet1")); //this works fine.
                              }

                              //this function i will call based on user input and hence its crashing during addView call.
                              void RunTimeBasedOnUserInput()
                              {
                              	for(int i = 0 ; i < userinput; i++)
                              	{
                              		AddView(RUNTIME\_CLASS(View),\_T("sheet %d",i));
                              	}
                              
                              }
                              

                              }

                              _ Offline
                              _ Offline
                              _Flaviu
                              wrote on last edited by
                              #31

                              Hi. Have you solved this ?

                              1 Reply Last reply
                              0
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • World
                              • Users
                              • Groups