TCanvas*¶
继承 TPad
A Canvas is an area mapped to a window directly under the control of the display manager. A ROOT session may have several canvases open at any given time.
A Canvas may be subdivided into independent graphical areas: the Pads. A canvas has a default pad which has the name of the canvas itself.
class¶
public:
// TCanvas status bits
enum {
kShowEventStatus = BIT(15),
kAutoExec = BIT(16),
kMenuBar = BIT(17),
kShowToolBar = BIT(18),
kShowEditor = BIT(19),
kMoveOpaque = BIT(20),
kResizeOpaque = BIT(21),
kIsGrayscale = BIT(22),
kShowToolTips = BIT(23)
};
TCanvas(Bool_t build=kTRUE);
TCanvas(const char *name, const char *title="", Int_t form=1);
/// Create a new canvas with a predefined size form.
/// If form < 0 the menubar is not shown.
/// - form = 1 700x500 at 10,10 (set by TStyle::SetCanvasDefH,W,X,Y)
/// - form = 2 500x500 at 20,20
/// - form = 3 500x500 at 30,30
/// - form = 4 500x500 at 40,40
/// - form = 5 500x500 at 50,50
/// If "name" starts with "gl" the canvas is ready to receive GL output.
TCanvas(const char *name, const char *title, Int_t ww, Int_t wh);
/// Create a new canvas at a random position.
/// \param[in] name canvas name
/// \param[in] title canvas title
/// \param[in] ww is the canvas size in pixels along X
/// (if ww < 0 the menubar is not shown)
/// \param[in] wh is the canvas size in pixels along Y
/// If "name" starts with "gl" the canvas is ready to receive GL output.
TCanvas(const char *name, const char *title, Int_t wtopx, Int_t wtopy,
Int_t ww, Int_t wh);
/// Create a new canvas.
/// \param[in] name canvas name
/// \param[in] title canvas title
/// \param[in] wtopx,wtopy are the pixel coordinates of the top left corner of
/// the canvas (if wtopx < 0) the menubar is not shown)
/// \param[in] ww is the canvas size in pixels along X
/// \param[in] wh is the canvas size in pixels along Y
/// If "name" starts with "gl" the canvas is ready to receive GL output.
TCanvas(const char *name, Int_t ww, Int_t wh, Int_t winid);
/// Create an embedded canvas, i.e. a canvas that is in a TGCanvas widget
/// which is placed in a TGFrame. This ctor is only called via the
/// TRootEmbeddedCanvas class.
/// If "name" starts with "gl" the canvas is ready to receive GL output.
virtual ~TCanvas();
//-- used by friend TThread class
void Constructor();
void Constructor(const char *name, const char *title, Int_t form);
/// Create a new canvas with a predefined size form.
/// If form < 0 the menubar is not shown.
/// - form = 1 700x500 at 10,10 (set by TStyle::SetCanvasDefH,W,X,Y)
/// - form = 2 500x500 at 20,20
/// - form = 3 500x500 at 30,30
/// - form = 4 500x500 at 40,40
/// - form = 5 500x500 at 50,50
void Constructor(const char *name, const char *title, Int_t ww, Int_t wh);
/// Create a new canvas at a random position.
/// \param[in] name canvas name
/// \param[in] title canvas title
/// \param[in] ww is the canvas size in pixels along X
/// (if ww < 0 the menubar is not shown)
/// \param[in] wh is the canvas size in pixels along Y
void Constructor(const char *name, const char *title,
Int_t wtopx, Int_t wtopy, Int_t ww, Int_t wh);
/// Create a new canvas.
/// \param[in] name canvas name
/// \param[in] title canvas title
/// \param[in] wtopx,wtopy are the pixel coordinates of the top left corner of
/// the canvas (if wtopx < 0) the menubar is not shown)
/// \param[in] ww is the canvas size in pixels along X
/// \param[in] wh is the canvas size in pixels along Y
void Destructor();/// Actual canvas destructor.
TVirtualPad *cd(Int_t subpadnumber=0);
/// Set current canvas & pad. Returns the new current pad,
/// or 0 in case of failure.
/// See TPad::cd() for an explanation of the parameter.
virtual void Browse(TBrowser *b);
void Clear(Option_t *option="");
// Remove all primitives from the canvas.
// If option "D" is specified, direct subpads are cleared but not deleted.
// This option is not recursive, i.e. pads in direct subpads are deleted.
void Close(Option_t *option="");/// Close canvas. Delete window/pads data structure
virtual void Delete(Option_t * = "") { MayNotUse("Delete()"); }
void DisconnectWidget(); // used by TCanvasImp /// Used by friend class TCanvasImp.
virtual void Draw(Option_t *option="");
/// Draw a canvas.
/// If a canvas with the name is already on the screen, the canvas is repainted.
/// This function is useful when a canvas object has been saved in a Root file.
virtual TObject *DrawClone(Option_t *option="") const; // *MENU*
/// Draw a clone of this canvas
/// A new canvas is created that is a clone of this canvas
virtual TObject *DrawClonePad(); // *MENU*
/// Draw a clone of this canvas into the current pad
/// In an interactive session, select the destination/current pad
/// with the middle mouse button, then point to the canvas area to select
/// the canvas context menu item DrawClonePad.
/// Note that the original canvas may have subpads.
virtual void EditorBar();/// Get editor bar.
void EmbedInto(Int_t winid, Int_t ww, Int_t wh);
/// Embedded a canvas into a TRootEmbeddedCanvas. This method is only called
/// via TRootEmbeddedCanvas::AdoptCanvas.
void EnterLeave(TPad *prevSelPad, TObject *prevSelObj);
/// Generate kMouseEnter and kMouseLeave events depending on the previously
/// selected object and the currently selected object. Does nothing if the
/// selected object does not change.
void FeedbackMode(Bool_t set);/// Turn rubberband feedback mode on or off.
void Flush();/// Flush canvas buffers.
void UseCurrentStyle(); // *MENU* /// Force a copy of current style for all objects in canvas.
void ForceUpdate() { fCanvasImp->ForceUpdate(); }
const char *GetDISPLAY() const {return fDISPLAY.Data();}
TContextMenu *GetContextMenu() const {return fContextMenu;};
Int_t GetDoubleBuffer() const {return fDoubleBuffer;}
Int_t GetEvent() const { return fEvent; }
Int_t GetEventX() const { return fEventX; }
Int_t GetEventY() const { return fEventY; }
Color_t GetHighLightColor() const { return fHighLightColor; }
TVirtualPad *GetPadSave() const { return fPadSave; }
void ClearPadSave() { fPadSave = 0; }
TObject *GetSelected() const {return fSelected;}
TObject *GetClickSelected() const {return fClickSelected;}
Int_t GetSelectedX() const {return fSelectedX;}
Int_t GetSelectedY() const {return fSelectedY;}
Option_t *GetSelectedOpt() const {return fSelectedOpt.Data();}
TVirtualPad *GetSelectedPad() const { return fSelectedPad; }
TVirtualPad *GetClickSelectedPad() const { return fClickSelectedPad; }
Bool_t GetShowEventStatus() const { return TestBit(kShowEventStatus); }
Bool_t GetShowToolBar() const { return TestBit(kShowToolBar); }
Bool_t GetShowEditor() const { return TestBit(kShowEditor); }
Bool_t GetShowToolTips() const { return TestBit(kShowToolTips); }
Bool_t GetAutoExec() const { return TestBit(kAutoExec); }
Size_t GetXsizeUser() const {return fXsizeUser;}
Size_t GetYsizeUser() const {return fYsizeUser;}
Size_t GetXsizeReal() const {return fXsizeReal;}
Size_t GetYsizeReal() const {return fYsizeReal;}
Int_t GetCanvasID() const {return fCanvasID;}
TCanvasImp *GetCanvasImp() const {return fCanvasImp;}
Int_t GetWindowTopX();/// Returns current top x position of window on screen.
Int_t GetWindowTopY();/// Returns current top y position of window on screen.
UInt_t GetWindowWidth() const { return fWindowWidth; }
UInt_t GetWindowHeight() const { return fWindowHeight; }
UInt_t GetWw() const { return fCw; }
UInt_t GetWh() const { return fCh; }
virtual void GetCanvasPar(Int_t &wtopx, Int_t &wtopy, UInt_t &ww, UInt_t &wh)
{wtopx=GetWindowTopX(); wtopy=fWindowTopY; ww=fWindowWidth; wh=fWindowHeight;}
virtual void HandleInput(EEventType button, Int_t x, Int_t y);
/// Handle Input Events.
/// Handle input events, like button up/down in current canvas.
Bool_t HasMenuBar() const { return TestBit(kMenuBar); }
void Iconify() { fCanvasImp->Iconify(); }
Bool_t IsBatch() const { return fBatch; }
Bool_t IsDrawn() { return fDrawn; }
Bool_t IsFolder() const;/// Is folder ?
Bool_t IsGrayscale();/// Check whether this canvas is to be drawn in grayscale mode.
Bool_t IsRetained() const { return fRetained; }
virtual void ls(Option_t *option="") const;/// List all pads.
void MoveOpaque(Int_t set=1);
/// Set option to move objects/pads in a canvas.
/// - set = 1 (default) graphics objects are moved in opaque mode
/// - set = 0 only the outline of objects is drawn when moving them
/// The option opaque produces the best effect. It requires however a
/// a reasonably fast workstation or response time.
Bool_t OpaqueMoving() const { return TestBit(kMoveOpaque); }
Bool_t OpaqueResizing() const { return TestBit(kResizeOpaque); }
virtual void Paint(Option_t *option="");/// Paint canvas.
virtual TPad *Pick(Int_t px, Int_t py, TObjLink *&pickobj) { return TPad::Pick(px, py, pickobj); }
virtual TPad *Pick(Int_t px, Int_t py, TObject *prevSelObj);
/// Prepare for pick, call TPad::Pick() and when selected object
/// is different from previous then emit Picked() signal.
virtual void Picked(TPad *selpad, TObject *selected, Int_t event); // *SIGNAL*
/// Emit Picked() signal.
virtual void ProcessedEvent(Int_t event, Int_t x, Int_t y, TObject *selected); // *SIGNAL*
/// Emit ProcessedEvent() signal.
virtual void Selected(TVirtualPad *pad, TObject *obj, Int_t event); // *SIGNAL*
/// Emit Selected() signal.
virtual void Cleared(TVirtualPad *pad); // *SIGNAL*
/// Emit pad Cleared signal.
virtual void Closed(); // *SIGNAL*
/// Emit Closed signal.
void RaiseWindow() { fCanvasImp->RaiseWindow(); }
void ResetDrawn() { fDrawn=kFALSE; }
virtual void Resize(Option_t *option="");/// Recompute canvas parameters following a X11 Resize.
void ResizeOpaque(Int_t set=1);
/// Set option to resize objects/pads in a canvas.
/// - set = 1 (default) graphics objects are resized in opaque mode
/// - set = 0 only the outline of objects is drawn when resizing them
/// The option opaque produces the best effect. It requires however a
/// a reasonably fast workstation or response time.
void SaveSource(const char *filename="", Option_t *option="");
// Save primitives in this canvas as a C++ macro file.
// This function loops on all the canvas primitives and for each primitive
// calls the object SavePrimitive function.
// When outputing floating point numbers, the default precision is 7 digits.
// The precision can be changed (via system.rootrc) by changing the value
// of the environment variable "Canvas.SavePrecision"
void SavePrimitive(std::ostream &out, Option_t *option = "");
// Save primitives in this canvas in C++ macro file with GUI.
virtual void SetCursor(ECursor cursor);/// Set cursor.
virtual void SetDoubleBuffer(Int_t mode=1);/// Set Double Buffer On/Off.
virtual void SetFixedAspectRatio(Bool_t fixed = kTRUE); // *TOGGLE*
/// Fix canvas aspect ratio to current value if fixed is true.
void SetGrayscale(Bool_t set = kTRUE); // *TOGGLE* *GETTER=IsGrayscale
/// Set whether this canvas should be painted in grayscale, and re-paint
/// it if necessary.
void SetWindowPosition(Int_t x, Int_t y) { fCanvasImp->SetWindowPosition(x, y); }
void SetWindowSize(UInt_t ww, UInt_t wh) { fCanvasImp->SetWindowSize(ww, wh); }
void SetCanvasSize(UInt_t ww, UInt_t wh); // *MENU*
/// Set Width and Height of canvas to ww and wh respectively. If ww and/or wh
/// are greater than the current canvas window a scroll bar is automatically
/// generated. Use this function to zoom in a canvas and navigate via
/// the scroll bars. The Width and Height in this method are different from those
/// given in the TCanvas constructors where these two dimension include the size
/// of the window decoration whereas they do not in this method.
void SetHighLightColor(Color_t col) { fHighLightColor = col; }
void SetSelected(TObject *obj);/// Set selected canvas.
void SetClickSelected(TObject *obj) { fClickSelected = obj; }
void SetSelectedPad(TPad *pad) { fSelectedPad = pad; }
void SetClickSelectedPad(TPad *pad) { fClickSelectedPad = pad; }
void Show() { fCanvasImp->Show(); }
virtual void Size(Float_t xsizeuser=0, Float_t ysizeuser=0);
/// Set the canvas scale in centimeters.
/// This information is used by PostScript to set the page size.
/// \param[in] xsize size of the canvas in centimeters along X
/// \param[in] ysize size of the canvas in centimeters along Y
/// if xsize and ysize are not equal to 0, then the scale factors will
/// be computed to keep the ratio ysize/xsize independently of the canvas
/// size (parts of the physical canvas will be unused).
/// if xsize = 0 and ysize is not zero, then xsize will be computed
/// to fit to the current canvas scale. If the canvas is resized,
/// a new value for xsize will be recomputed. In this case the aspect
/// ratio is not preserved.
/// if both xsize = 0 and ysize = 0, then the scaling is automatic.
/// the largest dimension will be allocated a size of 20 centimeters.
void SetBatch(Bool_t batch=kTRUE);
/// Toggle batch mode. However, if the canvas is created without a window
/// then batch mode always stays set.
static void SetFolder(Bool_t isfolder=kTRUE);
/// If isfolder=kTRUE, the canvas can be browsed like a folder
/// by default a canvas is not browsable.
void SetPadSave(TPad *pad) {fPadSave = pad;}
void SetRetained(Bool_t retained=kTRUE) { fRetained=retained;}
void SetTitle(const char *title="");/// Set canvas title.
virtual void ToggleEventStatus();/// Toggle event statusbar.
virtual void ToggleAutoExec();/// Toggle pad auto execution of list of TExecs.
virtual void ToggleToolBar();/// Toggle toolbar.
virtual void ToggleEditor();/// Toggle editor.
virtual void ToggleToolTips();/// Toggle tooltip display.
virtual void Update();/// Update canvas pad buffers. 刷新画板
Bool_t UseGL() const { return fUseGL; }
void SetSupportGL(Bool_t support) {fUseGL = support;}
TVirtualPadPainter *GetCanvasPainter();/// Access and (probably) creation of pad painter.
void DeleteCanvasPainter();///assert on IsBatch() == false?
static TCanvas *MakeDefCanvas();/// Static function to build a default canvas.
static Bool_t SupportAlpha();/// Static function returning "true" if transparency is supported.
code¶
//判断画板是否已经存在
TCanvas *c = ((TCanvas *)(gROOT->GetListOfCanvases()->FindObject("c")));
if (c) { c->Clear(); } else { c = new TCanvas("c", "c"); }
TCanvas *MyC = new TCanvas("MyC","Test canvas",1) //新建画板
MyC->SetFillColor(42); //设置画板背景颜色
MyC->Divide(2,2); //将画板分成2*2四个区域
MyC->cd(1); //指向第一个区域
f1->Draw(); //在第一个区域画图f1
MyC->SaveAs("");
TH1* hc = (TH1*)f1->Clone(); //克隆直方图
//设置画板
TCanvas *c1 = new TCanvas("c1","画板标题在这",200,10,700,700);
TCanvas *c1 = new TCanvas("c1","画板标题在这",900,700);
c1->Divide(2,2);//将画板分成四份,2*2
c1->SetFillColor(40);//设置画板背景颜色
TCanvas *canv = new TCanvas("image", "ccc");
canv->ToggleEventStatus();
canv->SetRightMargin(0.2);
canv->SetLeftMargin(0.01);
canv->SetTopMargin(0.01);
canv->SetBottomMargin(0.01);
// At creation time, no matter if in interactive or batch mode, the canvas size
// defines the size of the canvas window (including the size of the window
// manager's decoration). To define precisely the graphics area size of a canvas in
// the interactive mode, the following four lines of code should be used:
Double_t w = 600;
Double_t h = 600;
TCanvas * c1 = new TCanvas("c", "c", w, h);
c->SetWindowSize(w + (w - c->GetWw()), h + (h - c->GetWh()));
// and in the batch mode simply do:
c->SetCanvasSize(w,h);
// 不能手动关闭画板
((TRootCanvas *)c1->GetCanvasImp())->SetMWMHints(kMWMDecorAll, kMWMFuncResize | kMWMFuncMaximize | kMWMFuncMinimize | kMWMFuncMove, kMWMInputModeless);
example¶
Canvas *statsEditing() {
// - how to remove a stat element from the stat box
// - how to add a new one
//如何除去图上右上角box中的信息已经添加信息
// Create and plot a test histogram with stats
TCanvas *se = new TCanvas;
TH1F *h = new TH1F("h","test",100,-3,3);
h->FillRandom("gaus",3000);
gStyle->SetOptStat();
h->Draw();
se->Update();
// Retrieve the stat box
TPaveStats *ps = (TPaveStats*)se->GetPrimitive("stats");
ps->SetName("mystats");
TList *list = ps->GetListOfLines();
// Remove the RMS line
TText *tconst = ps->GetLineWith("RMS");
list->Remove(tconst);
// Add a new line in the stat box.
// Note that "=" is a control character
TLatex *myt = new TLatex(0,0,"Test = 10");
myt ->SetTextFont(42);
myt ->SetTextSize(0.04);
myt ->SetTextColor(kRed);
list->Add(myt);
// the following line is needed to avoid that the automatic redrawing of stats
h->SetStats(0);
se->Modified();
return se;
}
// Event
// kNoEvent = 0,
// kButton1Down = 1, kButton2Down = 2, kButton3Down = 3, kKeyDown = 4,
// kWheelUp = 5, kWheelDown = 6, kButton1Shift = 7, kButton1ShiftMotion = 8,
// kButton1Up = 11, kButton2Up = 12, kButton3Up = 13, kKeyUp = 14,
// kButton1Motion = 21, kButton2Motion = 22, kButton3Motion = 23, kKeyPress = 24,
// kArrowKeyPress = 25, kArrowKeyRelease = 26,
// kButton1Locate = 41, kButton2Locate = 42, kButton3Locate = 43, kESC = 27,
// kMouseMotion = 51, kMouseEnter = 52, kMouseLeave = 53,
// kButton1Double = 61, kButton2Double = 62, kButton3Double = 63
#include "TObject.h"
#include "TH1.h"
#include "TPad.h"
#include "TCanvas.h"
#include "TLine.h"
#include "TRandom.h"
#include <iostream>
using namespace std;
void DynamicExec()
{
// int pe = gPad->GetEvent();
TObject *select = gPad->GetSelected();
if(!select) return;
// 拿到鼠标放置位置的TH1
if (!select->InheritsFrom(TH1::Class())) {gPad->SetUniqueID(0); return;}
TH1 *h = (TH1*)select;
gPad->GetCanvas()->FeedbackMode(kTRUE);
//erase old position and draw a line at current position
int pold = gPad->GetUniqueID();
int px = gPad->GetEventX();
int py = gPad->GetEventY();
float uxmin = gPad->GetUxmin();
float uxmax = gPad->GetUxmax();
float uymin = gPad->GetUymin();
float uymax = gPad->GetUymax();
int pxmin = gPad->XtoAbsPixel(uxmin);
int pxmax = gPad->XtoAbsPixel(uxmax);
int pymin = gPad->YtoAbsPixel(uymin);
int pymax = gPad->YtoAbsPixel(uymax);
// 画出本画板的线
if(pold) gVirtualX->DrawLine(pold,pymin,pold,pymax);
gVirtualX->DrawLine(px,pymin,px,pymax);
gPad->SetUniqueID(px);
Float_t upx = gPad->AbsPixeltoX(px);
Float_t x = gPad->PadtoX(upx);
// 当前TH1 x位置坐标
cout<<px<<endl;
// 当前指向的子画板
// cout<<gPad->GetName()<<endl;
// 取得最外面的画板 c1
// cout<<gPad->GetMother()<<endl;
// gPad->GetMother()->cd(1)->GetListOfPrimitives()->Last()->Print();
// 画出第一个画板的线
gPad->GetMother()->cd(1);
TLine *ll;
if(gPad->GetMother()->cd(1)->GetListOfPrimitives()->FindObject("TLine"))
{
TLine *lll =(TLine*)gPad->GetMother()->cd(1)->GetListOfPrimitives()->FindObject("TLine");
lll->PaintLine(x,gPad->GetMother()->cd(1)->GetUymin(),x,gPad->GetMother()->cd(1)->GetUymax());
}
else
{
ll = new TLine;
ll->PaintLine(x,gPad->GetMother()->cd(1)->GetUymin(),x,gPad->GetMother()->cd(1)->GetUymax());
}
gPad->GetMother()->Update();
}
void dynamic()
{
TCanvas* c1 = new TCanvas("c1","c1");
TH1D *h1 = new TH1D("h1","",4096,0,2048);
TH1D *h2 = new TH1D("h2","",4096,0,2048);
Double_t px,py;
for (Int_t i = 0; i < 50000; i++)
{
gRandom->Rannor(px,py);
h1->Fill(px*100+1024);
h2->Fill(py*200+1024);
}
c1->Divide(1,2);
c1->cd(1);
h1->Draw();
c1->cd(2);
h2->Draw();
// 开启画板响应
c1->cd(2)->AddExec("asasdsfdgdggd","DynamicExec()");
// 关闭画板响应
// c1->cd(2)->DeleteExec("asasdsfdgdggd");
}