在屏幕上绘画的规则是什么?
我的最终目标是将TCanvas放入一个类并从那里绘制,但是现在我认为可能看一个不那么复杂的例子可能有所帮助。下面是一些代码,可以在我的计算机上编辑和绘制到屏幕上。
# 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
的这些定义中的任何一个,在后面调用的Update
和Draw
方法上使用适当的成员访问运算符,则应用程序在将空白TCanvas窗口打印到屏幕。如果我将app
和h
更改为指针,它也会崩溃。
如果我尝试使用任何类型的ROOT对象来实例化一个类,它会使应用程序崩溃。
现在,我正在使用MSVC ++的cl.exe
进行编译并与link.exe
建立链接。我正在使用64位Windows 7企业版N.我正在尝试移植我在Unix中构建的应用程序,在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 * + Objects#p85329。
答案 0 :(得分:2)
我通常使用下面的TApplication
来让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
结束了该过程。