From $ROOTSYS/tutorials/gui/splitbuttonTest.C

// A simple example that shows the usage of a TGSplitButton.
// The checkbutton is used to change the split state of the button.
//
// author, Roel Aaij 13/07/2007

#include <iostream>
#include <TApplication.h>
#include <TGClient.h>
#include <TGButton.h>
#include <TGFrame.h>
#include <TGLayout.h>
#include <TGWindow.h>
#include <TGLabel.h>
#include <TString.h>
#include <TGMenu.h>

// A little class to automatically handle the generation of unique
// widget ids.
enum EMenuIds {
   ID_1,
   ID_2,
   ID_3,
   ID_4,
   ID_5
};

class IDList {
private:
   Int_t nID ;               // Generates unique widget IDs.
public:
   IDList() : nID(0) {}
   ~IDList() {}
   Int_t GetUnID(void) { return ++nID ; }
} ;


class SplitButtonTest : public TGMainFrame {

private:
   TGSplitButton *fMButton;  // Split Button
   TGPopupMenu   *fPopMenu;  // TGpopupMenu that will be attached to
                             // the button.
   IDList         IDs ;      // Generator for unique widget IDs.

public:
   SplitButtonTest(const TGWindow *p, UInt_t w, UInt_t h) ;
   virtual ~SplitButtonTest() ;

   void DoExit() ;
   void DoSplit(Bool_t split) ;
   void DoEnable(Bool_t on) ;
   void HandleMenu(Int_t id) ;

   ClassDef(SplitButtonTest, 0)
};

SplitButtonTest::SplitButtonTest(const TGWindow *p, UInt_t w, UInt_t h)
   : TGMainFrame(p, w, h)
{
   SetCleanup(kDeepCleanup) ;

   Connect("CloseWindow()", "SplitButtonTest", this, "DoExit()") ;
   DontCallClose() ;

   TGVerticalFrame *fVL = new TGVerticalFrame(this, 100, 100) ;
   TGHorizontalFrame *fHL = new TGHorizontalFrame(fVL, 100, 40) ;

   // Create a popup menu.
   fPopMenu = new TGPopupMenu(gClient->GetRoot());
   fPopMenu->AddEntry("Button &1", ID_1);
   fPopMenu->AddEntry("Button &2", ID_2);
   fPopMenu->DisableEntry(ID_2);
   fPopMenu->AddEntry("Button &3", ID_3);
   fPopMenu->AddSeparator();

   // Create a split button, the menu is adopted.
   fMButton = new TGSplitButton(fHL, new TGHotString("Button &Options"),
                                fPopMenu, IDs.GetUnID());

   // It is possible to add entries later
   fPopMenu->AddEntry("En&try with really really long name", ID_4);
   fPopMenu->AddEntry("&Exit", ID_5);

   // Connect the special signal for the activation of items in a menu
   // that belongs to a split button to the slot.
   fMButton->Connect("ItemClicked(Int_t)", "SplitButtonTest", this,
                     "HandleMenu(Int_t)");

   TGCheckButton *fCButton = new TGCheckButton(fHL, new TGHotString("Split"),
                                               IDs.GetUnID());
   fCButton->SetState(kButtonDown);
   fCButton->Connect("Toggled(Bool_t)", "SplitButtonTest", this, "DoSplit(Bool_t)");

   // Add frames to their parent for layout.
   fHL->AddFrame(fCButton, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY,
                                             0, 10, 0, 0)) ;
   TGCheckButton *fEButton = new TGCheckButton(fHL, new TGHotString("Enable"),
                                               IDs.GetUnID());
   fEButton->SetState(kButtonDown);
   fEButton->Connect("Toggled(Bool_t)", "SplitButtonTest", this, "DoEnable(Bool_t)");

   // Add frames to their parent for layout.
   fHL->AddFrame(fEButton, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY,
                                             0, 10, 0, 0)) ;
   fHL->AddFrame(fMButton, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY));
   fVL->AddFrame(fHL, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY)) ;
   AddFrame(fVL, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY)) ;

   SetWindowName("SplitButton Test") ;
   MapSubwindows() ;
   Resize(GetDefaultSize()) ;
   MapWindow() ;

} ;

SplitButtonTest::~SplitButtonTest()
{
   // Destructor
   Cleanup() ;
}

void SplitButtonTest::DoExit()
{
   // Exit this application via the Exit button or Window Manager.
   // Use one of the both lines according to your needs.
   // Please note to re-run this macro in the same ROOT session,
   // you have to compile it to get signals/slots 'on place'.

   //DeleteWindow();            // to stay in the ROOT session
   gApplication->Terminate();   // to exit and close the ROOT session
}

void SplitButtonTest::DoSplit(Bool_t split)
{
   fMButton->SetSplit(split);
}

void SplitButtonTest::DoEnable(Bool_t on)
{
   if (on)
      fMButton->SetState(kButtonUp);
   else
      fMButton->SetState(kButtonDisabled);
}

void SplitButtonTest::HandleMenu(Int_t id)
{
   // Activation of menu items in the popup menu are handled in a user
   // defined slot to which the ItemClicked(Int_t) signal is
   // connected.

   switch (id) {
   case ID_1:
      std::cout << "Button 1 was activated" << std::endl;
      break;
   case ID_2:
      std::cout << "Button 2 was activated" << std::endl;
      break;
   case ID_3:
      std::cout << "Button 3 was activated" << std::endl;
      break;
   case ID_4:
      std::cout << "Button with a really really long name was activated"
                << std::endl;
      break;
   case ID_5:
      DoExit();
      break;
   }
}
void splitbuttonTest()
{
   new SplitButtonTest(gClient->GetRoot(),100,100);
}

 splitbuttonTest.C:1
 splitbuttonTest.C:2
 splitbuttonTest.C:3
 splitbuttonTest.C:4
 splitbuttonTest.C:5
 splitbuttonTest.C:6
 splitbuttonTest.C:7
 splitbuttonTest.C:8
 splitbuttonTest.C:9
 splitbuttonTest.C:10
 splitbuttonTest.C:11
 splitbuttonTest.C:12
 splitbuttonTest.C:13
 splitbuttonTest.C:14
 splitbuttonTest.C:15
 splitbuttonTest.C:16
 splitbuttonTest.C:17
 splitbuttonTest.C:18
 splitbuttonTest.C:19
 splitbuttonTest.C:20
 splitbuttonTest.C:21
 splitbuttonTest.C:22
 splitbuttonTest.C:23
 splitbuttonTest.C:24
 splitbuttonTest.C:25
 splitbuttonTest.C:26
 splitbuttonTest.C:27
 splitbuttonTest.C:28
 splitbuttonTest.C:29
 splitbuttonTest.C:30
 splitbuttonTest.C:31
 splitbuttonTest.C:32
 splitbuttonTest.C:33
 splitbuttonTest.C:34
 splitbuttonTest.C:35
 splitbuttonTest.C:36
 splitbuttonTest.C:37
 splitbuttonTest.C:38
 splitbuttonTest.C:39
 splitbuttonTest.C:40
 splitbuttonTest.C:41
 splitbuttonTest.C:42
 splitbuttonTest.C:43
 splitbuttonTest.C:44
 splitbuttonTest.C:45
 splitbuttonTest.C:46
 splitbuttonTest.C:47
 splitbuttonTest.C:48
 splitbuttonTest.C:49
 splitbuttonTest.C:50
 splitbuttonTest.C:51
 splitbuttonTest.C:52
 splitbuttonTest.C:53
 splitbuttonTest.C:54
 splitbuttonTest.C:55
 splitbuttonTest.C:56
 splitbuttonTest.C:57
 splitbuttonTest.C:58
 splitbuttonTest.C:59
 splitbuttonTest.C:60
 splitbuttonTest.C:61
 splitbuttonTest.C:62
 splitbuttonTest.C:63
 splitbuttonTest.C:64
 splitbuttonTest.C:65
 splitbuttonTest.C:66
 splitbuttonTest.C:67
 splitbuttonTest.C:68
 splitbuttonTest.C:69
 splitbuttonTest.C:70
 splitbuttonTest.C:71
 splitbuttonTest.C:72
 splitbuttonTest.C:73
 splitbuttonTest.C:74
 splitbuttonTest.C:75
 splitbuttonTest.C:76
 splitbuttonTest.C:77
 splitbuttonTest.C:78
 splitbuttonTest.C:79
 splitbuttonTest.C:80
 splitbuttonTest.C:81
 splitbuttonTest.C:82
 splitbuttonTest.C:83
 splitbuttonTest.C:84
 splitbuttonTest.C:85
 splitbuttonTest.C:86
 splitbuttonTest.C:87
 splitbuttonTest.C:88
 splitbuttonTest.C:89
 splitbuttonTest.C:90
 splitbuttonTest.C:91
 splitbuttonTest.C:92
 splitbuttonTest.C:93
 splitbuttonTest.C:94
 splitbuttonTest.C:95
 splitbuttonTest.C:96
 splitbuttonTest.C:97
 splitbuttonTest.C:98
 splitbuttonTest.C:99
 splitbuttonTest.C:100
 splitbuttonTest.C:101
 splitbuttonTest.C:102
 splitbuttonTest.C:103
 splitbuttonTest.C:104
 splitbuttonTest.C:105
 splitbuttonTest.C:106
 splitbuttonTest.C:107
 splitbuttonTest.C:108
 splitbuttonTest.C:109
 splitbuttonTest.C:110
 splitbuttonTest.C:111
 splitbuttonTest.C:112
 splitbuttonTest.C:113
 splitbuttonTest.C:114
 splitbuttonTest.C:115
 splitbuttonTest.C:116
 splitbuttonTest.C:117
 splitbuttonTest.C:118
 splitbuttonTest.C:119
 splitbuttonTest.C:120
 splitbuttonTest.C:121
 splitbuttonTest.C:122
 splitbuttonTest.C:123
 splitbuttonTest.C:124
 splitbuttonTest.C:125
 splitbuttonTest.C:126
 splitbuttonTest.C:127
 splitbuttonTest.C:128
 splitbuttonTest.C:129
 splitbuttonTest.C:130
 splitbuttonTest.C:131
 splitbuttonTest.C:132
 splitbuttonTest.C:133
 splitbuttonTest.C:134
 splitbuttonTest.C:135
 splitbuttonTest.C:136
 splitbuttonTest.C:137
 splitbuttonTest.C:138
 splitbuttonTest.C:139
 splitbuttonTest.C:140
 splitbuttonTest.C:141
 splitbuttonTest.C:142
 splitbuttonTest.C:143
 splitbuttonTest.C:144
 splitbuttonTest.C:145
 splitbuttonTest.C:146
 splitbuttonTest.C:147
 splitbuttonTest.C:148
 splitbuttonTest.C:149
 splitbuttonTest.C:150
 splitbuttonTest.C:151
 splitbuttonTest.C:152
 splitbuttonTest.C:153
 splitbuttonTest.C:154
 splitbuttonTest.C:155
 splitbuttonTest.C:156
 splitbuttonTest.C:157
 splitbuttonTest.C:158
 splitbuttonTest.C:159
 splitbuttonTest.C:160
 splitbuttonTest.C:161
 splitbuttonTest.C:162
 splitbuttonTest.C:163
 splitbuttonTest.C:164
 splitbuttonTest.C:165
 splitbuttonTest.C:166
 splitbuttonTest.C:167
 splitbuttonTest.C:168
 splitbuttonTest.C:169
 splitbuttonTest.C:170
 splitbuttonTest.C:171
 splitbuttonTest.C:172
 splitbuttonTest.C:173
 splitbuttonTest.C:174
 splitbuttonTest.C:175
 splitbuttonTest.C:176