c – 在编译的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",400); //TCanvas* canvas = new TCanvas("fCanvas",400); TH1D h ("h","h",10,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中构建的应用程序,其中有一个简单的新TApplication(“名称”,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. 解决方法
我通常使用如下的TApplications让TCanvases真正出现在屏幕上.
#include "TApplication.h" // other stuff int main(int argc,char** argv) { TApplication theApp("App",argv); // your code // here you can Draw() things theApp.Run(); return 0; } 程序然后在Run()停止,我用^ C结束进程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |