#include "TApplication.h" #include "TGFrame.h" #include "TRootEmbeddedCanvas.h" #include "TCanvas.h" #include "TVirtualPad.h" #include "TTimer.h" #include "Riostream.h" void SetMargins(TVirtualPad *pad) { // keep square frame double h = pad->GetWh(); double w = pad->GetWw(); double topMargin, botMargin, leftMargin, rightMargin; if (w > h) { topMargin = 0.1; botMargin = 0.1; const double rightMarginRatio = 0.6; double spaceW = (w - h * (1. - topMargin - botMargin)) / w; rightMargin = spaceW * rightMarginRatio; leftMargin = spaceW * (1. - rightMarginRatio); } else { leftMargin = 0.1; rightMargin = 0.1; const double topMarginRatio = 0.5; double spaceH = (h - w * (1. - leftMargin - rightMargin)) / h; topMargin = spaceH * topMarginRatio; botMargin = spaceH * (1. - topMarginRatio); } pad->SetTopMargin(topMargin); pad->SetBottomMargin(botMargin); pad->SetLeftMargin(leftMargin); pad->SetRightMargin(rightMargin); pad->GetCanvas()->Modified(); pad->GetCanvas()->Update(); } void HandleResizing(Event_t *e) { if (e->fType == kConfigureNotify) { std::cout << "window resized !" << std::endl; TTimer::SingleShot(50, 0, 0, "SetMargins(=gPad)"); } } void TestMargins() { TGMainFrame * w = new TGMainFrame (gClient->GetRoot(), 600, 400); TRootEmbeddedCanvas *ec = new TRootEmbeddedCanvas("Ecanvas1", w, 600, 400); w->AddFrame(ec, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY)); w->Connect("CloseWindow()", "TApplication", gApplication, "Terminate()"); w->DontCallClose(); w->Connect("ProcessedEvent(Event_t*)", 0, 0, "HandleResizing(Event_t*)"); w->SetWindowName("Example Macro"); w->MapSubwindows(); w->MapWindow(); ec->GetCanvas()->cd(); gPad->DrawFrame(-100, -100, 100, 100); SetMargins(gPad); }