在编译的ROOT(CERN)应用程序中将TCanvas绘制到屏幕上

什么是画在屏幕上的规则?

我的最终目标是把TCanvas放到一个class级,并从那里画画,但现在我认为也许看一个不那么复杂的例子可能会有所帮助。 下面是一些编译和绘制在我的电脑上的代码。

# include <TApplication.h> # include <TCanvas.h> # include <TH1D.h> # include <thread> # include <chrono> //TCanvas canvas ("fCanvas", "fCanvas", 600, 400); int main ( int argc, char* argv[] ) { TApplication app ("app",&argc,argv); TCanvas canvas ("fCanvas", "fCanvas", 600, 400); //TCanvas* canvas = new TCanvas("fCanvas", "fCanvas", 600, 400); TH1D h ("h","h",10,0,10); h.Fill(1); h.Fill(2); h.Fill(2); h.Fill(2); h.Fill(3); h.Fill(3); h.Draw(); canvas.Update(); canvas.Draw(); std::this_thread::sleep_for( std::chrono::seconds(3) ); return 0; } 

您可能会注意到一些注释掉的线条。 如果我使用canvas的这些定义中的任何一个,在稍后的UpdateDraw方法上使用适当的成员访问操作符,那么在将一个空TCanvas窗口打印到屏幕后,应用程序会崩溃。 它也崩溃,如果我改变apph指针。

如果我尝试使用任何types的ROOT对象来实例化一个类,它会崩溃应用程序。

现在,我正在编译MSVC ++的cl.exe并链接到link.exe 。 我正在开发一个64位的Windows 7企业N.我试图移植一个应用程序,我在Unix中build立一个简单的new TApplication("name",0,0);main开始的一切工作。

所以,重申:我怎样才能得到我的直方图到这个操作系统的屏幕上,也许别人? 我怀疑自己能够理解“为什么”,但是对于那些能够阅读的人来说,写一些关于它的东西可能会很好。 否则,一步一步描述如何使用这些对象来绘画将是美好的。

非常感谢您的帮助。 我会很乐意提供更多的信息/例子,如果这应该是有用的。


更新:如果我用类似的东西进行编译,它在我的特殊情况下工作

 cl -nologo -DWIN32 -W3 -D_WINDOWS -Z7 -MDd -GR -EHsc main.cxx -I %ROOTSYS%\include -FIw32pragma.h /link -debug -LIBPATH:%ROOTSYS%\lib libCore.lib libRIO.lib libHist.lib libGpad.lib 

不知道为什么。

请参阅https://root.cern.ch/phpBB3/viewtopic.php?f=3&t=3402&p=85329&hilit=Vector+stl+of+TH1F *对象#p85329。

我通常使用下面的TApplication s来让TCanvas真正在屏幕上显示为窗口。

 #include "TApplication.h" // other stuff int main(int argc, char** argv) { TApplication theApp("App",&argc, argv); // your code // here you can Draw() things theApp.Run(); return 0; } 

该程序然后停止在Run()并结束与^C的过程。