- ベストアンサー
WndSplitterについての質問
- WndSplitterを使用してウィンドウを分割する方法について質問です。
- 現在、WinXP Visual Studio 2005 MFC SDI プログラムでWndSplitterクラスを使用してウィンドウを複数分割していますが、4分割する方法がわかりません。
- 増やしたWndSplitter変数が正しく機能せず、プログラムが停止してしまいます。助けていただける方はいらっしゃいますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
CreateStatic(分割するウィンドウ, 横の分割数, 縦の分割数, 分割する領域のID) ではなくて CreateStatic(分割するウィンドウ, 横の分割数, 縦の分割数, ウィンドウスタイル, 分割する領域のID) ですね 4分割目を横にした場合は F = m_wndSplitter2, 1, 0 になるので m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CMBrowserView), CSize(100, 100), pContext) を m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CMBrowserView), CSize(100, 100), pContext) に修正する必要があります。 最も m_wndSplitter1.CreateStatic(&m_wndSplitter, 3, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0,1)) で最初から3分割にした方が早いですが
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
文章で説明するのは難しいですが CreateStatic(分割するウィンドウ, 横の分割数, 縦の分割数, 分割する領域のID) で最初の2分割は元のウィンドウが1面しかないので分割する領域のIDは省略できます。 3分割目はA,Bどちらを分割するかを指定しないといけないので m_wndSplitter.IdFromRowCol(0,1) でB領域を指定しています。最初の0は1行目、次の1が2列目の意味です(プログラムの世界では0から始まるのでそれぞれ1少なく指定します)。 もしA領域を分割する場合は m_wndSplitter.IdFromRowCol(0,0) になりますね。 4分割目のD領域は2行目、1列目なので m_wndSplitter1.IdFromRowCol(1,0) としています。 ここでそれぞれの領域をウィンドウと行、列で表すと A = m_wndSplitter, 0, 0 B = m_wndSplitter, 0, 1 C = m_wndSplitter1, 0, 0 D = m_wndSplitter1, 1, 0 E = m_wndSplitter2, 0, 0 F = m_wndSplitter2, 0, 1 BとDは分割に使ってるので実際に表示されている領域はA, C, E, Fになります。 この領域にViewクラスを作れば終わりです。
- php504
- ベストアンサー率42% (926/2160)
参考に MainFrm.h CSplitterWnd m_wndSplitter; CSplitterWnd m_wndSplitter1; CSplitterWnd m_wndSplitter2; MainFrm.cpp // 分割ウィンドウを作成します if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; if (!m_wndSplitter1.CreateStatic(&m_wndSplitter, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0,1))) return FALSE; if (!m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitter1.IdFromRowCol(1,0))) return FALSE; if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext) || !m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMBrowserView), CSize(100, 100), pContext) || !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CMBrowserView), CSize(100, 100), pContext) || !m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CMBrowserView), CSize(100, 100), pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; } サンプルですのでRUNTIME_CLASSのViewは同じものを割り当てていますが実際は違うViewクラスを作成して割り当ててください。
補足
ご回答ありがとうございます。 上記の記述で、4分割ウィンドウが出来ました。CreateStaticの引数について、疑問がいくつかあります。上記の &m_wndSplitter,2,1の部分の2,1と &m_wndSplitter1,1,2の1,2の部分はどの部分を分割するのかを指定して いるのですよね?? 流れとしては、 (1)まず最初に1行2列 A,Bの分割ウィンドウを作成しています。 (2)次に、2行1列の場所(Bの領域)をC,Dに分割しています。 (3)次に、???////ここら辺でわからなくなってしまいます。 IdFromRowColの引数もMSDNなどで見ましたが、しっくり来なかったです。 試しにここで言う、4分割目の領域を縦割りではなく、横割りにしようと チャレンジしてみましたが、プログラムが停止してしまいます。 初心者で申し訳ないですが、宜しくお願いいたします。
お礼
丁寧に回答くださってありがとうございます。 IdFromRowColの引数の使い方、又分割する際のCreateStaticの引数に関しても、よくわかりました。 本当にありがとうございました