在屏幕上繪畫的規則是什麼?在已編譯的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
的這些定義中的任何一個,則在後來調用的方法Update
和Draw
上使用適當的成員訪問操作符,應用程序在將空白TCanvas窗口打印到屏幕後會崩潰。如果我將app
和h
更改爲指針,它也會崩潰。
如果我嘗試使用任何種類的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。
爲什麼要聲明一個'TApplication'如果你不運行它? https://root.cern.ch/root/html/TApplication.html#TApplication:Run –
我不想訪問ROOT事件循環;我只是想加載適當的圖形庫。 – Jordan
所以你不需要實例化'TApplication' –