How to Embed a TCanvas in External Applications

Here is a short HOWTO showing the few steps required to embed a TCanvas in an application created with toolkits as QT, FOX, MFC, and probably many more.

*** IMPORTANT: Do not call TApplication::Run() ***

  • In the application constructor or in main(), create a TApplication
       // create an instance of TApplication
     
       gMyRootApp = new TApplication("My ROOT Application", &argc, argv);
     
       // tell application to return from run
       gMyRootApp->SetReturnFromRun(true);
  • Create a timer to process Root events, e.g.:
       void MyWindow::OnRefreshTimer() {
     
          // Process Root events when a timer message is received
     
          gApplication->StartIdleing();
          gSystem->InnerLoop();
          gApplication->StopIdleing();
       }
  • Get the id of the window where you want to embed the TCanvas :
       void MyWindow::Create() {
     
          // Add this window to TVirtualX list of windows
          // in return get its TVirtualX identifier
          int wid = gVirtualX->AddWindow((ULong_t)getid(), getWidth(), getHeight());
     
          // Create a new TCanvas, specifying this window's id as parent
          fCanvas = new TCanvas("fCanvas", getWidth(), getHeight(), wid);
       }
  • Forward messages to the Canvas, e.g.:
       void MyWindow::OnPaint() {
     
          // Handle Paint events
     
          if (fCanvas) fCanvas->Update();
       }
     
       void MyWindow::OnSize() {
     
          // Handle Resize events
     
          if (fCanvas) fCanvas->Resize();
       }
     
       void MyWindow::OnMouseMove() {
     
          // Handle Mouse move events
     
          if (!fCanvas) return;
     
          if (ev->state & LEFTBUTTONMASK)
             fCanvas->HandleInput(kButton1Motion, ev->win_x, ev->win_y);
          else 
             fCanvas->HandleInput(kMouseMotion, ev->win_x, ev->win_y);
       }
     
       void MyWindow::OnLMouseDown() {
     
          // Handle Mouse Left button down event
     
          if (fCanvas) fCanvas->HandleInput(kButton1Down, ev->x, ev->y);
       }
  • Screenshots of TCanvas embedded in external application

    MFC Application
    MFC & ROOT

    Qt Application
    Qt & ROOT

    FOX Application
    FOX & ROOT