【发布时间】:2015-09-05 02:48:25
【问题描述】:
在屏幕上绘画的规则是什么?
我的最终目标是将 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 Enterprise N。我正在尝试移植一个我在 Unix 中构建的应用程序,为此,main 开头的简单 new TApplication("name",0,0); 使一切正常。
所以,重申一下:我怎样才能将我的直方图显示在这个操作系统的屏幕上,也许还有其他的?我怀疑我是否能够理解“为什么”,但是为其他阅读这篇文章的人写一些关于这个的东西可能会很好。否则,只是一步一步地描述如何使用这些对象进行绘画会很棒。
非常感谢您对此提供的任何帮助;如果证明有用,我很乐意提供更多信息/示例。
更新:如果我使用类似的东西进行编译,它适用于我的特殊情况
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。
【问题讨论】:
-
如果不运行它,为什么要声明
TApplication? root.cern.ch/root/html/TApplication.html#TApplication:Run -
我不想访问 ROOT 事件循环;我只是想加载适当的图形库。
-
所以你不需要实例化
TApplication -
不,我很确定完全有必要显示画布。 . .自从我使用它已经有一段时间了,我目前无法对其进行测试,但这就是我记得的。
标签: c++ windows visual-c++ root-framework tcanvas