WndSplitterについての質問

このQ&Aのポイント
  • WndSplitterを使用してウィンドウを分割する方法について質問です。
  • 現在、WinXP Visual Studio 2005 MFC SDI プログラムでWndSplitterクラスを使用してウィンドウを複数分割していますが、4分割する方法がわかりません。
  • 増やしたWndSplitter変数が正しく機能せず、プログラムが停止してしまいます。助けていただける方はいらっしゃいますか?
回答を見る
  • ベストアンサー

WndSplitterについて

現在 winXP VisualStudio2005 MFC SDI プログラムにおいてWndSplitterクラスを使って複数のウィンドウにしているのですが、 //////////////////ウィンドウ分割/////////////////////////////      m_wndSplitter.CreateStatic(this,1,2); m_wndSplitter1.CreateStatic(&m_wndSplitter,2,1,WS_CHILD | WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,1)); 上記の様な記述で、ウィンドウを3分割にしています。 考え方として、まずはウィンドウをA,Bと2分割にして、Bの領域をC,Dとまた2分割していて計3分割にしています。 これを4分割(Dの領域をE,Fに分割)したいのですが、上手くいきません。 m_wndSplitter2という変数を増やして m_wndSplitter2.CreateStatic(&m_wndSplitter1,3,1,WS_CHILD | WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0,1)); としているのですが、プログラムを実行すると、プログラムが停止します。サイトなどを参考にしてやっているのですが、3分割ウィンドウまでは 載っているのですが、それ以上は載っていません。 どなたか、わかるかたご教示していただけないでしょうか。 宜しくお願いいたします。

  • MON-Q
  • お礼率81% (13/16)

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.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)
回答No.2

文章で説明するのは難しいですが 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クラスを作れば終わりです。

MON-Q
質問者

お礼

丁寧に回答くださってありがとうございます。 IdFromRowColの引数の使い方、又分割する際のCreateStaticの引数に関しても、よくわかりました。 本当にありがとうございました

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

参考に 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クラスを作成して割り当ててください。

MON-Q
質問者

補足

ご回答ありがとうございます。 上記の記述で、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分割目の領域を縦割りではなく、横割りにしようと チャレンジしてみましたが、プログラムが停止してしまいます。 初心者で申し訳ないですが、宜しくお願いいたします。

関連するQ&A

  • MFC 分割ウィンドウのそれぞれ窓の描画に関して

    MFCプログラミング初心者ですが、宜しくお願いいたします。 ---------------プログラム環境--------------- WinXP2 Visula Studio 2005 Pro -------------------------------------------- 現在、上記の環境で、SDIプログラムを書いています。 ご教示していただきたいことは、分割ウィンドウにおけるそれぞれの窓の 表示内容を変えたいということです。TCP/IPのプログラムで、受信したMessageをstrstrなどで振り分けて、各々の窓に表示したいのですが、 どういう風にやればいいのですか?? なお、一つのViewに受信メッセージを表示させることは出来ました。 非常に困っています。 現在、CMainFrame::OnCreateClient(~~~)とMainFrame.cppに書き、 ウィンドウを3分割にしております。 m_wndSplitter.CreateStatic(this,1,2); m_wndSplitter.CreateStatic(&m_wndSplitter,2,1,WS_CHILD | WS_VISIBLE,WS_BORDER,m_wndSplitter.IdFromRowCol(0,1)); m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(??View)),~~ m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(??View)),~~ m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(??View)),~~ この用に記述しております。 説明しずらいのですが、??Viewの箇所にスケルトンの時にできていたView クラスを入れてやると、そのエリアに受信メッセージが表示されます。 初心者なので、まと外れかもしれませんが、新しいViewクラスを作成して なにかやれば、よいのでしょうか?? 現在3つのウィンドウにそれぞれの メッセージを表示させたいので、Viewクラスはそれぞれ3個なければ、いけないのでしょうか?? わかりずらい説明で申し訳ないですが、宜しくお願いいたします。

  • 親ウィンドウの領域外でも表示されるエディットボックスについて

    親ウィンドウの領域外でも表示されるエディットボックスについて VisualStudio2005でMFCアプリを作っています。 親ウィンドウに指定したコントロールの領域外でも 表示されるようなエディットボックスを作りたいのですが、方法はありますか? イメージとしては、ダイアログ上にボタンがあって、 そのボタンを押すとエディットコントロールが表示され、入力待ちとなるようなものです。 このエディットには改行を入力させるのですが、改行してウィンドウサイズを大きくしていくと、 ダイアログの下の端でエディットボックスが途切れてしまいます。 ダイアログの下より大きくなっても全体が表示されるようにしたいんです。 このエディットの生成は次のような感じで行っています。 DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN; m_edit.Create(dwStyle, rect, this/*ダイアログ*/, -1); よろしくお願いします。

  • MFCでのボタン配置

    ダイアログではなく、直接Windowにボタンを貼り付けるために、AppWizaerdを使用して、MyAppというプロジェクトをつくり、MyAppクラスのヘッダに CButton mybutton を定義し、cppファイルのInitInstance関数内の m_pMainWnd->UpdateWindow();の下に、以下のように記述したところ、 mybutton.Create(_T("OK"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,100), m_pMainWnd, 1); ボタンは表示されるのですが、押しても凹んでくれません。どうしてなのでしょうか?? 環境はWinXP VisualStudio.Net2003です。

  • Formにエディットボックスを貼りたい

    環境はWIN98 VC++6.0 MFC SDIです。 クラスウィザードのデフォルトでSDIを作ります。 但し、6/6ページの基本クラスはCFormViewにします。 このForm上にプログラム上からエディットボックスを貼りつけるために、以下のようにしましたが、エディットボックスらしき白い四角は出来ましたが文字の入力が出来ません。 どうすればよいのでしょうか? static contID = 4000; ///////////////////////////////////////////////// int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略   CRect rect;   // CTestWndの上にCEditを貼り付ける   rect.top = 30;   rect.left = 30;   rect.bottom = 100;   rect.right = 100;   CEdit* edit = new CEdit();      if( edit->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP,   rect,   this,   contID++ ) != TRUE ){     throw new CException();   }   return 0; }

  • マウスポインタの形状

    よろしくお願いします。 環境 WIN98 VC++6.0 MFC SDIにて http://www.net24.ne.jp/~kenji/s_swin/swin.htmlにあるウィンドウを生成した場合、 クライアント領域にあるマウスポインタの形が、エッジを触ってウィンドウの大きさを変える上下矢印や左右矢印に変わってしまうことがあります。 マウスポインタがクライアント領域にある時は、常に一般的な形(左上をさす白く太い形)にするにはどうすれば良いのですか? お分かりの方よろしくお願いいたします。 *********************** ウィンドウのスタイル LPCTSTR lpszClassName; CRect rect( 0, 0, 640, 480); HCURSOR hCursor = 0; DWORD dwStyle, dwExStyle; lpszClassName = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW, hCursor); dwExStyle = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE; dwStyle = WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_SYSMENU | WS_BORDER | WS_THICKFRAME; CreateEx( dwExStyle, lpszClassName, _T("Test window"), dwStyle, rect, parent, NULL, NULL);

  • ウィンドウ生成時の不具合について

    VC++6.0 WIN98 MFCにて ウィザードを使ってSDIにてウィンドウ1を作成し、メニューをクリックすることで、ウィンドウ2が新たに生成されるプログラムを書きました。 ウィンドウ2が生成されたときに、ウィンドウ1に重なっていると、ウィンドウ2を閉じてもウィンドウ1のクライアント領域にウィンドウ2の形が残ったままになってしまいます。 どうしてこうなるのでしょうか?

  • ウインドウ位置の自動移動の解除

    winXP VS2005 MFC SDI クライアント領域をクリックしてウインドウの移動を出来るようにしたのですが、 クライアント領域をクリックしながらウインドウを移動し、 ウインドウのタイトルバーがデスクトップ外に出た状態で 移動をやめる(マウスのクリックをやめる)とウインドウが自動で タイトルバーが表示されるところまで移動してしまいます。 (マウスを放した位置で止まってくれない) この自動的な動きを止める方法をよろしくお願いします。

  • ステータスバーを作ろうとしてもリンクエラー

     WindowsのWin32APIだけを用いてプログラムを作成中なのですが、どうしてもステータスバーは作成されません。  ステータスバーを作る(はず)の関数をコメントアウトするとステータスバーがないプログラムができます。 環境---- Windows2000Pro VisualStudio .NET 2003 Academic ソース------ (ユーザー関数は別の名前です。) #include<commctrl.h> HWND hStatus; //ステータスバー用のウィンドウハンドル int Proc(HWND hwnd, ... )//親ウィンドウ、ほかにも引数あり { : : InitCommonContorls(); hStatus=CreateStatusWindow(WS_CHILD|WS_VISIBLE, "AAAAAAAAAA",//適当な文字列 hwnd, ID_STATUS);//#define...で定義済みの定数 : : } エラー----- LNK2019:未解決のシンボル"InitCommonControls"がProcで参照されました。 LNK2019:未解決のシンボル"CreateStatusWindow"がProcで参照されました。

  • エディットの複数行化が反映されない

    VC++2008 MFCで開発を行っています。 ダイアログに、マルチラインでなくかつ改行を受け付けないエディットを配置しています。 このエディットのエディットスタイルを条件に合わせてマルチライン、改行受付にしたいのですが、 反映されません。実現方法のご教示をお願い致します。 現状の私は以下のコードを、OnInitDialog()内に書いています。 SetWindowLong(GetDlgItem(IDC_EDIT1)->GetSafeHwnd(), GWL_STYLE, WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE); ちなみにWS_VISIBLEやWS_CHILD の有り無しは反映されます。 反映されないというのは、入力中にエンターキーを押した直後にダイアログが閉じられることから判断しています。

  • ウィンドウにボタンを配置するには?

    VC++6.0、WinXPです CMainFrame::CMainFrame() { CButton myButton1; myButton1.Create( _T("Button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,100),this, 100); myButton1.ShowWindow(SW_SHOW); myButton1.UpdateData(); } としてますがビルドはできますが実行中にエラーがでます。何がおかしいのでしょうか? よろしくお願いします。