You are here

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

embedded_mfc.png

MFC & ROOT

embedded_qt.gif

Qt & ROOT

embedded_fox.gif

FOX & ROOT