分割ウィンドウ(CSplitterWnd)についての質問

このQ&Aのポイント
  • 開発環境はVC++2003で、分割ウィンドウ(CSplitterWnd)について、左側に別画面(CCmdForm)を作成する際に問題が発生しています。
  • 初期状態では左の画面だけ表示され、作業ビューの縦方向の分割は正しくされていますが、横方向のビューサイズが0になって隠れてしまいます。
  • CSplitterWnd::SetColumnInfo() を試しましたが、効果がありませんでした。解決策を教えてください。
回答を見る
  • ベストアンサー

分割ウィンドウ(CSplitterWnd)について

分割ウィンドウ(CSplitterWnd)についての質問です。開発環境はVC++2003です。 右側に2X2の4つの作業用のビュー(CWorkView)、左側に別画面(CCmdForm)を作成したいのですが、画面サイズが指定通りに表示されません。初期状態では左の画面だけ表示されます。作業ビューの縦方向の分割は正しくされていますが、横方向のビューサイズが0になって隠れた状態になります。後から分割枠を移動させて作業ビューを表示させることはできます。またCMainFrame::RecalcLayout() の中でCSplitterWnd::SetColumnInfo() で調整を試みましたが効果がありませんでした。 ちなみにCCmdFormを左にして、作業ビュー(CWorkView) を右にすると問題なく表示されます。どうしてもこの画面構成でなければならないため困っています。何かいい方法は無いでしょうか? 以下参考までにソース CMainFrame::OnCreateClient() で if(!_Splitter.CreateStatic(this, 1, 2, WS_CHILD | WS_VISIBLE)) return FALSE; if(!_Splitter2.CreateStatic(&_Splitter, 2, 2, WS_CHILD | WS_VISIBLE | WS_BORDER, _Splitter.IdFromRowCol(0,0))) return FALSE; if( !_Splitter.CreateView(0, 1, RUNTIME_CLASS(CCmdForm), CSize(100, 100), pContext)) return FALSE; if(!_Splitter2.CreateView(0, 0, RUNTIME_CLASS(CWorkView), CSize(100, 100), pContext)) return FALSE; if(!_Splitter2.CreateView(0, 1, RUNTIME_CLASS(CWorkView), CSize(100, 100), pContext)) return FALSE; if(!_Splitter2.CreateView(1, 0, RUNTIME_CLASS(CWorkView), CSize(100, 100), pContext)) return FALSE; if(!_Splitter2.CreateView(1, 1, RUNTIME_CLASS(CWorkView), CSize(100, 100), pContext)) return FALSE; (画面サイズ CSize(100, 100) はあくまで仮の値です) 以上、宜しくお願いします。

noname#81756
noname#81756

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

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

ベースの分割ウィンドウで0番カラムの幅を指定したらよさそうな気がします _Splitter.SetColumnInfo(0, 100*2, 0);

noname#81756
質問者

お礼

うまくいきました。ありがとうございました。 たいへんたすかりました。

関連するQ&A

  • MFC CSplitter内にコントロールを表示させるには

    Viewクラスを作り中に表示させる方法はわかったのですが、 分割ウィンドウ内にListCtrlなどを表示させるにはどうすればいいのでしょうか? コンパイルはできるのですが、afxcmn.inl Line:266の ASSERT(::IsWindow(m_hWnd));でエラーが出てしまいます。 何がいけないのか教えてください。お願いします。 //.h CSplitterWnd m_wndSplitter; virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext); //.cpp BOOL CWnd::OnCreateClient(LPCREATESTRUCT /*lpcs*/,CCreateContext* pContext) { if(!m_wndSplitter.CreateStatic( this, 1, 2, WS_CHILD | WS_VISIBLE ) ) return FALSE; if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CListCtrlA),CSize(200,300),pContext)) return FALSE; if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CListCtrlB) ,CSize( 200,300),pContext)) return FALSE; }

  • 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個なければ、いけないのでしょうか?? わかりずらい説明で申し訳ないですが、宜しくお願いいたします。

  • ツールバーから選択でウィンドウ生成

    下記URLのサンプルコード http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MDI1.html​ を参考に、VC++2005(MFC)にてMDIアプリケーションを作成しています。 サンプルを参照にソースコードを記述し、プログラム起動時に MDIウィンドウを生成することは出来ましたが、 これを『ツールバーからメニューを選択し、ウィンドウを出す』ように 改良したいのです。 下記に起動時にMDIウィンドウを生成するソースコードを記載します。 「☆☆☆追加☆☆☆」で囲まれた箇所が、 上記URL解説を元に自分で追加した箇所で、それ以外はスケルトンです。 解決策ご存知の方おられましたら、お手数ですがご教授お願い致します。 【呼び出し元クラス:CMDITest1App】 BOOL CMDITest1App::InitInstance(){ INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション")); LoadStdProfileSettings(4); // 標準の INI ファイルのオプションをロードします (MRU を含む) // アプリケーション用のドキュメント テンプレートを登録します。ドキュメント テンプレート // はドキュメント、フレーム ウィンドウとビューを結合するために機能します。 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MDITest1TYPE, RUNTIME_CLASS(CMDITest1Doc), RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム RUNTIME_CLASS(CMDITest1View)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); //☆☆☆追加☆☆☆ CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate(IDR_MDITest1TYPE2, RUNTIME_CLASS(CMDITest1Doc), RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム RUNTIME_CLASS(CMDITest1View2)); if (!pDocTemplate2) return FALSE; AddDocTemplate(pDocTemplate2); //☆☆☆追加☆☆☆ // メイン MDI フレーム ウィンドウを作成します。 CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME)) { delete pMainFrame; return FALSE; } m_pMainWnd = pMainFrame; // 接尾辞が存在する場合にのみ DragAcceptFiles を呼び出します。 // MDI アプリケーションでは、この呼び出しは、m_pMainWnd を設定した直後に発生しなければなりません。 // DDE、file open など標準のシェル コマンドのコマンド ラインを解析します。 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // コマンド ラインで指定されたディスパッチ コマンドです。アプリケーションが // /RegServer、/Register、/Unregserver または /Unregister で起動された場合、False を返します。 if (!ProcessShellCommand(cmdInfo)) return FALSE; // メイン ウィンドウが初期化されたので、表示と更新を行います。 pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); //☆☆☆追加☆☆☆ pMainFrame->OpenView(pDocTemplate2); //☆☆☆追加☆☆☆ return TRUE; } 【呼び出し先クラス:CMainFrame】 //☆☆☆追加☆☆☆ void CMainFrame::OpenView(CDocTemplate *pTemplate){ CDocument* pDoc = MDIGetActive()->GetActiveDocument(); CMDIChildWnd* pNewFrame = (CMDIChildWnd*)pTemplate->CreateNewFrame(pDoc, NULL); if( pNewFrame ) pTemplate->InitialUpdateFrame(pNewFrame, pDoc); } //☆☆☆追加☆☆☆

  • ウィンドウ生成時にアクセス違反エラー

    下記URLのサンプルコード http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MDI1.html を参考に、VC++2005(MFC)にてMDIアプリケーションを作成しています。 正常に動作すれば、プログラム起動時に2つのウィンドウが表示されるはずですが、 問題箇所「DEBUG!!!」にて、 「MDITest1.exe の 0x00416420 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。」 といったエラーが発生し、実行が出来ない状態です。 下記にソースコードを記載します。ベタ貼りで申し訳ありません。。 「☆☆☆追加☆☆☆」で囲まれた箇所が上記URL解説を元に自分で追加した箇所で、 それ以外はスケルトンなので、基本的にサンプルコードと同じです。 解決策ご存知の方おられましたら、お手数ですがご教授お願い致します。 【呼び出し元クラス:CMDITest1App】 BOOL CMDITest1App::InitInstance(){ INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション")); LoadStdProfileSettings(4); // 標準の INI ファイルのオプションをロードします (MRU を含む) // アプリケーション用のドキュメント テンプレートを登録します。ドキュメント テンプレート // はドキュメント、フレーム ウィンドウとビューを結合するために機能します。 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MDITest1TYPE, RUNTIME_CLASS(CMDITest1Doc), RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム RUNTIME_CLASS(CMDITest1View)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); //☆☆☆追加☆☆☆ CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate(IDR_MDITest1TYPE2, RUNTIME_CLASS(CMDITest1Doc), RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム RUNTIME_CLASS(CMDITest1View2)); if (!pDocTemplate2) return FALSE; AddDocTemplate(pDocTemplate2); //☆☆☆追加☆☆☆ // メイン MDI フレーム ウィンドウを作成します。 CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME)) { delete pMainFrame; return FALSE; } m_pMainWnd = pMainFrame; // 接尾辞が存在する場合にのみ DragAcceptFiles を呼び出します。 // MDI アプリケーションでは、この呼び出しは、m_pMainWnd を設定した直後に発生しなければなりません。 //☆☆☆追加☆☆☆ pMainFrame->OpenView(pDocTemplate2); //☆☆☆追加☆☆☆ // DDE、file open など標準のシェル コマンドのコマンド ラインを解析します。 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // コマンド ラインで指定されたディスパッチ コマンドです。アプリケーションが // /RegServer、/Register、/Unregserver または /Unregister で起動された場合、False を返します。 if (!ProcessShellCommand(cmdInfo)) return FALSE; // メイン ウィンドウが初期化されたので、表示と更新を行います。 pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); return TRUE; } 【呼び出し先クラス:CMainFrame】※問題箇所有り void CMainFrame::OpenView(CDocTemplate *pTemplate){ CDocument* pDoc = MDIGetActive()->GetActiveDocument();   //DEBUG!!! CMDIChildWnd* pNewFrame = (CMDIChildWnd*)pTemplate->CreateNewFrame(pDoc, NULL); if( pNewFrame ) pTemplate->InitialUpdateFrame(pNewFrame, pDoc); }

  • タブコントロールが表示できない

    どうしてタブコントロールがこれでは表示されないのでしょうか m_TabはCTabCtrlです。 <CMainFrame::OnCreate内> ------------------------------------------------------ CRect rcClient; GetClientRect(rcClient); if(!m_Tab.Create(TCS_TABS | TCS_FIXEDWIDTH | WS_CHILD | WS_VISIBLE,rcClient,this,0x1006)) { return -1; } m_Tab.InsertItem( 0, _T("test"));

  • ツールバーから選択で一つだけウィンドウ生成

    VC++2005(MFC)にてMDIアプリケーションを作成しております。 前回当サイトの質問 http://oshiete1.goo.ne.jp/qa4708537.html にて、参照URL(http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MDI1.html)と、 回答者様のご指摘により問題解決したのですが、 このままだと、メニュー選択するとウィンドウ1とウィンドウ2が 再び現れてしまい、合計4つのウィンドウが現れることになります。 (ウィンドウ1:2個、ウィンドウ2:2個) 起動時にウィンドウ1のみ表示させる方法は自力で作成したのですが、 メニュー選択でウィンドウを一つ(ウィンドウ2)だけ 追加生成するようにし、合計2つの別々のウィンドウが現れるようにしたいのです。 下記に改良した現時点でのソースコードを記載します。 「☆☆☆追加☆☆☆」で囲まれた箇所が、上記質問URLを元に改変した ソースコードになります。他はスケルトンです。 【呼び出し元クラス:CMDITest1App】 CMDITest1App::CMDITest1App(){ //コンストラクタ //☆☆☆追加☆☆☆ m_WndFlg == false; //☆☆☆追加☆☆☆ } BOOL CMDITest1App::InitInstance(){ ・・・ //スケルトン //☆☆☆追加☆☆☆ CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate(IDR_MDITest1TYPE2, RUNTIME_CLASS(CMDITest1Doc), RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム RUNTIME_CLASS(CMDITest1View2)); if (!pDocTemplate2) return FALSE; AddDocTemplate(pDocTemplate2); m_pDocTemplate2 = pDocTemplate2; //☆☆☆追加☆☆☆ ・・・ return TRUE; } 【オーバーライドした関数:OnFileNew()】 //☆☆☆追加☆☆☆ void CMDITest1App::OnFileNew(){ CWinApp::OnFileNew(); if( m_WndFlg == true ){ //初回起動時は生成しない ((CMainFrame*)m_pMainWnd)->OpenView( m_pDocTemplate2 ); } m_WndFlg = true; } //☆☆☆追加☆☆☆ 何か良い方法ございましたら、ご教授お願い致します。 また、現在MDIでのアプリケーション作成について作成手順が分からず大変苦戦しております。 何か順序を追って作成していけるような参考サイト・文献などあれば、 そちらの方もご教授頂けますと幸いです。

  • OnDestroy() について

    環境 WIN98 VC++6.0 MFC SDIにて アプリ起動と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } <質問1> このような場合に、CInputクラスに以下のようにOnDestroy()を追加しましたが、 ダイアログを閉じた時もアプリ終了時にもメッセージが飛んできません。 どうしてなのですか? void CInput::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox("789"); } <質問2> 更に、以下のように新規にダイアログバーを追加したところ、メッセージが飛ぶようになりました。 どうしてなのでしょうか? int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 if (!m_wndMyDialogBar.Create(this, CG_IDD_MYDIALOGBAR, WS_VISIBLE , CG_ID_VIEW_MYDIALOGBAR)) { TRACE0("Failed to create dialog bar m_wndMyDialogBar\n"); return -1; // 作成に失敗 } dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; }

  • エクセルVBAでShapesまたはDrawingObjects

    シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub

  • 1つのウィンドウに2つのエディット

    case WM_CREATE:  GetClientRect(hWnd, &rc);  EditL = CreateWindow(  TEXT("EDIT") , NULL ,  WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |  ES_AUTOHSCROLL | ES_AUTOVSCROLL |  ES_LEFT | ES_MULTILINE ,  0 , 0 , rc.right / 2 , rc.bottom , hWnd , (HMENU)1 ,  ((LPCREATESTRUCT)(lParam))->hInstance , NULL);  EditR = CreateWindow(  TEXT("EDIT") , NULL ,  WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |  ES_AUTOHSCROLL | ES_AUTOVSCROLL |  ES_LEFT | ES_MULTILINE ,  rc.left / 2 , 0 , rc.right , rc.bottom , hWnd , (HMENU)2 ,  ((LPCREATESTRUCT)(lParam))->hInstance , NULL);  return FALSE; とすると、1つのエディットしか表示されません。 また、 case WM_SIZE:  GetClientRect(edit, &rc); MoveWindow(edit, rc.left, rc.top, rc.right, rc.bottom, TRUE); として、ウィンドウサイズが変更された時に どちらのエディットもクライアント領域にあわせたつもりなのですが、 サイズ変更で左側のエディットがスクロールバーの幅の分だけ 縮小されてしまいます。 どこをどのように直したらよろしいのでしょうか? 宜しくお願いします。 #Win98 & VC++6.0 & SDK で作成しています。

  • 実行時エラー

    先日はご回答いただきありがとうございました。 ご回答いただいた構文を採用してテストしてみましたところ、特定の操作時にエラーが発生してしまいました。 発生条件:「管理」部署のユーザー・シート3人と「総務」部署のユーザー・シート2人を用意      「管理」の管理職でログインしたあと、「総務」の管理職でログインを試みるとエラーが発生 発生エラー:実行時エラー'1004' 'Visible' メソッドは失敗しました: '_Worksheet' オブジェクト エラー発生箇所:ws.Visible = False(下から4行目) お手すきの時で構いませんので、宜しければご回答お願いいたします。 ElseIf isManage Then '管理職なら Dim i As Integer For i = 1 To login.Cells(Rows.Count, eColIndex.depcode).End(xlUp).Row On Error Resume Next 'エラートラップ開始 Set ws = Sheets(login.Cells(i, eColIndex.name).Value) 'Sheets("氏名") On Error GoTo 0 'エラートラップ終了 If login.Cells(i, eColIndex.depcode).Value = depcode Then If ws Is Nothing Then 'シートが無いなら MsgBox "ユーザーシートがありません", vbExclamation, "警告" Application.Visible = True 'ブックを表示 End End If ws.Visible = True 'ユーザーのシート表示 Set ws = Nothing ElseIf Not ws Is Nothing Then ws.Visible = False Set ws = Nothing End If Next

専門家に質問してみよう