2015-06-19 65 views
3

在屏幕上繪畫的規則是什麼?在已編譯的ROOT(CERN)應用程序中將TCanvas繪製到屏幕上

我的最終目標是將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企業版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 * +對象#p85329。

+0

爲什麼要聲明一個'TApplication'如果你不運行它? https://root.cern.ch/root/html/TApplication.html#TApplication:Run –

+0

我不想訪問ROOT事件循環;我只是想加載適當的圖形庫。 – Jordan

+0

所以你不需要實例化'TApplication' –

回答

0

我通常使用TApplication s like below 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過程。