分割ウィンドウ+CDlgBar?(+CToolBar?)

[戻る]
もんもん [E-Mail] 2003/10/06(月) 11:35:09
先日、ここのラウンジにて分割ウィンドウにツールバー等をつけるために
各ペインに子フレームWndを乗せる方法が記述されてあったので試してみました。
(Win2K、VC++6.0、MFC、WizardでSDI作成)
以下、MainFrameのOnCreateClientです。

// 2 列、1 行のスプリッターを作成
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
    TRACE0("Failed to CreateStaticSplitter\n");
    return FALSE;
}
    
// 子フレームの作成
CSumnailFrame* pFrame1 = (CSumnailFrame*)RUNTIME_CLASS(CSumnailFrame)-
>CreateObject();
if (!pFrame1->CWnd::Create(NULL, NULL, WS_CHILD | WS_VISIBLE,
    CRect(0, 0, 0, 0), &m_wndSplitter, m_wndSplitter.IdFromRowCol(0,0)))
{
    return FALSE;
}

// ビューの作成
CSumnailView* pView1 = (CSumnailView*)RUNTIME_CLASS(CSumnailView)->CreateObject
();
if (!pView1->Create(NULL, NULL, WS_CHILD | WS_VISIBLE,
    CRect(0, 0, 0, 0), pFrame1, AFX_IDW_PANE_FIRST, pContext))
{
    return FALSE;
}

// 子フレームの作成2
CPreviewFrame* pFrame2 = (CPreviewFrame*)RUNTIME_CLASS(CPreviewFrame)-
>CreateObject();
if (!pFrame2->CWnd::Create(NULL, NULL, WS_CHILD | WS_VISIBLE,
    CRect(0, 0, 0, 0), &m_wndSplitter, m_wndSplitter.IdFromRowCol(0,1)))
{
    return FALSE;
}

// ビューの作成2
CPrevViews* pView2 = (CPrevViews*)RUNTIME_CLASS(CPrevViews)->CreateObject();
if (!pView2->Create(NULL, NULL, WS_CHILD | WS_VISIBLE,
    CRect(0, 0, 0, 0), pFrame2, AFX_IDW_PANE_FIRST, pContext))
{
    return FALSE;
}

これで一応できることはできるのですが、終了時に例外(Access Vioration)になってしまうん
ですよね。どういうことでしょう?

また、結局のところ、Windowsエクスプローラ的ウィンドウを作りたいのですが、
フォルダ表示の時、左ペインの「フォルダ」と書いてあるタイトルらしきバーは何で出来ている
のでしょう?「ラベル」があったりするが「終了(×)ボタン」もフラットな表示でツールバー的
だし。

お手数ですが、お解りになる方がいらっしゃいましたら、
ご回答いただけると助かります。よろしくお願いします。

秋衛門 2003/10/07(火) 18:30:16
pView1 とpView2 のCreate時にpContextを渡さない。
または、頭でCreateView とかしちゃうと回避できるよん(多分)

>フォルダ表示の時、左ペインの「フォルダ」と書いてあるタイトルらしきバーは何で出
来ている

spy++でみたらクラス名にReBarとか書いてあったよ。
いや、それが何なのか参考になるかは分かれへんけど、まーほら、あれだよ。結婚したか
らって人生終わったわけじゃないよな、うん。がんばるよ俺(謎)

もんもん [E-Mail] 2003/10/08(水) 11:17:40
秋衛門様
回答ありがとうございます。

pContextを渡さない方法でうまくいきました。ありがとうございます。
頭でCreateViewのパターンは、以前2002/03/29のスプリッターウィンドウ問題の回答にて
「m_wndSplitterのCreateViewを呼び出す必要はない」とありましたが、
それをあえて行う、ということでしょうか?

左ペインのバーについては、なるほど、ReBarにToolBarが乗っているようですね。

ただ、今度は「フォルダ」というReBarのスタイルでlpTextに設定したと思われる文字列と、
「×」ボタンの位置、境界線の描画で悩んでしまいました…。

REBARBANDINFOにて、fStyleにRBBS_CHILDEDGEを指定してもバー下部に境界線は出ず、
RBBS_NOGRIPPERやlpTextの指定は効くのですが、タイトルと「×」ボタンは隣接してしまい、
「×」ボタンだけ右寄せにならないことに困っています。

別バンドとして「×」ボタンだけのToolBarを載せるのかもしれない、とやってみるも
なかなかうまくいきません。何かコツがあるのでしょうか?

一つで済まず申し訳ないのですが、どなたかご回答いただければ幸いです。

もんもん [E-Mail] 2003/10/08(水) 11:27:03
もんもんです。補足します。
問題のスタイル指定のソースは下記のとおりです。
初めて使うReBarなもので、おかしい指定が含まれているかもしれません…。
ちなみに、「×」ボタンはBitmapButton(幅8pixel、高さ6pixel)

// ×ボタンのベース作成
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(14, 13);    //ボタンの幅+6、高さ+7
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);

// デフォルト時、ButtonDown時のBitmapの設定
img.Create(IDB_SUMNAILCLOSETOOL, 8, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
img.Detach();
img.Create(IDB_SUMNAILCLOSETOOL2, 8, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
img.Detach();

// ツールバーのスタイル設定
m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | WS_EX_RIGHT);
// ボタンの数 = 1
m_wndToolBar.SetButtons(NULL, 1);

CRect rectToolBar;

// set up toolbar button sizes
m_wndToolBar.GetItemRect(0, &rectToolBar);
m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(8,6));

// add the toolbar to the rebar
m_wndReBar.AddBar(&m_wndToolBar);

REBARBANDINFO rbbi;

// ReBarのスタイル設定
rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE
    | RBBIM_STYLE | RBBIM_TEXT;
rbbi.fStyle = RBBS_NOGRIPPER | RBBS_CHILDEDGE | RBBS_FIXEDSIZE | RBBS_NOVERT;

rbbi.lpText = "フォルダ";

rbbi.hwndChild  = m_wndToolBar;

// Set values unique to the band with the BitmapButton.
CRect    rc;
m_wndToolBar.GetWindowRect( &rc );
rbbi.cxMinChild = rc.right - rc.left;
rbbi.cyMinChild = rc.bottom - rc.top;
rbbi.cx         = 0;

BOOL    setInfo;
setInfo = m_wndReBar.GetReBarCtrl().SetBandInfo(0, &rbbi);

秋衛門 2003/10/10(金) 13:00:10
>「m_wndSplitterのCreateViewを呼び出す必要はない」とありましたが、
>それをあえて行う、ということでしょうか?

うにゃにゃ、CMainFrame の CreateViewらよ。

なんかね、終わったときに CDocTemplate がフレームを壊しにいくっぽい。
そんで、CMainFrame は View がないのに壊されそーになっちゃうからおかしくなるとか
なんかそんなん。じゃあ CreateView しとけばいいじゃん、くらいのお話。

テキトーに見ただけだからなんかテキトーなことテキトーに言ってるように思うかも知れ
へんけど、そーです。ごめんね、テキトーなの。嫁にプロポーズした時だってホントは
(以下略)

もんもん [E-Mail] 2003/10/10(金) 15:03:31
[[解決]]
度々の回答ありがとうございますー>秋衛門さま

テキトーとはいえ、納得しました(笑)。
もう手探りなもんだから「WHY?の嵐」状態でして。

とりあえず、今回「×」ボタンまではつけないこととしました。
(別件でCListViewの表示方法で悩みつつあるけど…)

一旦、この件に関してはクローズします。
お忙しいところ、ありがとうございました。

古いスレッドには追加発言できません。