4

画面に描画するためのルールは何ですか?

私の最終的な目標は、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適切なメンバー アクセス演算子を使用すると、空白の TCanvas ウィンドウを画面に出力した後にアプリケーションがクラッシュします。また、ポインターを変更するとクラッシュします。UpdateDrawapph

なんらかの ROOT オブジェクトを使用してクラスをインスタンス化しようとすると、アプリケーションがクラッシュします。

現在、MSVC++ でコンパイルしcl.exelink.exe. 私は64ビットのWindows 7 Enterprise Nで作業しています.Unixで構築したアプリケーションを移植しようとしていnew TApplication("name",0,0);ますmain.

繰り返しになりますが、この OS やその他の OS でヒストグラムを画面に表示するにはどうすればよいでしょうか? 「なぜ」を理解できるかどうかは疑問ですが、これを読んで理解できる他の人のために、それについて何か書くといいかもしれません. それ以外の場合は、これらのオブジェクトを使用してペイントする方法を段階的に説明するだけでも素晴らしいでしょう.

これについて助けてくれてありがとう。それが有用であることが判明した場合、私は喜んでより多くの情報/例を提供します.


更新:次のようなものでコンパイルすると、私の特定のケースで機能します

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を参照してください。

4

1 に答える 1

2

私は通常、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

于 2016-03-31T19:03:15.210 に答える