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

Painting a TCanvas to the screen in a compiled ROOT (CERN) application

本文关键字:TCanvas 绘制 屏幕 应用程序 编译 CERN      更新时间:2023-10-16

着屏幕绘画的规则是什么?

我的最终目标是将 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的这些定义中的任何一个,在后面称为UpdateDraw方法上使用适当的成员访问运算符,则应用程序在将空白的 TCanvas 窗口打印到屏幕后崩溃。如果我将apph更改为指针,它也会崩溃。

如果我尝试使用任何类型的 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,以使TCanvas es真正显示为屏幕上的窗口。

#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结束该过程。