Рисование TCanvas на экране в скомпилированном приложении ROOT (CERN)

Каковы правила рисования на экране?

Моя конечная цель — поместить 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, для которого простая 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 .


person Jordan    schedule 19.06.2015    source источник
comment
зачем объявлять TApplication, если вы его не запускаете? root.cern.ch/root/html/TApplication.html#TApplication: Выполнить   -  person Ruggero Turra    schedule 14.07.2015
comment
Я не хотел получать доступ к циклу событий ROOT; Я просто хотел загрузить соответствующие графические библиотеки.   -  person Jordan    schedule 15.07.2015
comment
поэтому вам не нужно создавать экземпляр TApplication   -  person Ruggero Turra    schedule 15.07.2015
comment
Нет, я почти уверен, что холст вообще необходимо отображать. . . я давно не работал с этим, и я не могу проверить это в данный момент, но это то, что я помню.   -  person Jordan    schedule 16.07.2015


Ответы (1)


Обычно я использую 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.

person pseyfert    schedule 31.03.2016