Рисование 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&т = 3402&р = 85329&hilit = Вектор + СТЛ + из + TH1F* + Объекты # p85329.

4

Решение

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

1

Другие решения


По вопросам рекламы [email protected]