enum ELayoutHints {
kLHintsNoHints = 0,
kLHintsLeft = BIT(0),
kLHintsCenterX = BIT(1),
kLHintsRight = BIT(2),
kLHintsTop = BIT(3),
kLHintsCenterY = BIT(4),
kLHintsBottom = BIT(5),
kLHintsExpandX = BIT(6),
kLHintsExpandY = BIT(7),
kLHintsNormal = (kLHintsLeft | kLHintsTop)
// bits 8-11 used by ETableLayoutHints
};
から指定する。kLHintsLeft | kLHintsTop | kLHintsExpandY というように、or ビット演算子 | を用いて複数指定できる。BIT は
fLbl1 = new TGLabel(this, "Label1"); AddFrame(fLbl1, new TGLayoutHints(kLHintsExpandX, 5, 5, 3, 4)); fLbl2 = new TGLabel(this, "Label2"); AddFrame(fLbl2, new TGLayoutHints(kLHintsExpandX, 5, 5, 3, 4));
のように書いていけば良い。横に widget を横に並べるには、
TGHorizontalFrame *hframe = new TGHorizontalFrame(this, 300, 20, kFixedWidth); fLbl1 = new TGLabel(hframe, "Label1"); hframe->AddFrame(fLbl1, new TGLayoutHints(kLHintsExpandX, 5, 5, 3, 4)); fLbl2 = new TGLabel(hframe, "Label2"); hframe->AddFrame(fLbl2, new TGLayoutHints(kLHintsExpandX, 5, 5, 3, 4)); AddFrame(hframe, new TGLayoutHints(kLHintsExpandX, 10, 10, 2, 2));
のように書く。TGLabel を new するとき、 this ではなく hframe とするので注意。
Error: Symbol h4 is not defined in current scope (tmpfile):1:
Error: Failed to evaluate h4->Draw("colz")
*** Interpreter error recovered ***
これは、TGFileBrowser::DoubleClicked の問題と言えるかもしれないが、.root.mimes を
[root/th2]
pattern = TH2[CSFDI]
icon = h2_s.xpm h2_t.xpm
action = ->Draw("colz")
と編集し、さらに現在いるディレクトリからヒストグラム h4 が見えない (すなわち、h4 が違う TFile や TDirectoryFile にいて、現在のディレクトリで gApplication→ProcessLine(act.Data()) (ただし、act.Data() = “h4→Draw(\”colz\“);”) を実行しても h4 を参照できない) ときに生じるエラーである。(TH2 の action を .root.mimes から gClient→GetMimeTypeList()→GetAction(obj→IsA()→GetName(), action) という関数で取得し、“→Draw()” という文字列が action 内に含まれるかを act.Contains(“→Draw()”) という関数で判別している。) 解決方法としては、.root.mimes を編集することを諦め、
[root/th2] pattern = TH2[CSFDI] icon = h2_s.xpm h2_t.xpm action = ->Draw()
というようにデフォルトに戻すか、TGListTreeItem をクリックした際に発生する DoubleClick のシグナルをフックし、current directory (gDirectory) を変更し h4 を見えるようにする。必要であれば、TGFileBrowser.cxx を書き換えても良い。もしこれがただのバグであれば、ROOT 開発チームに要望を出す。