CFormViewに子ウィンドウの貼り付け

[戻る]
mina 2003/02/27(木) 18:39:20
お世話になります。
VC++6.0 MFC にてSDIのプログラムを作成しています。
ViewはCFormViewにしています。

このCFormViewにダイアログを複数貼り付け用途に合わせ動作させたい
のですがうまく動作しません。
タブコントロールやプロパティシートが便利ではありますが画面の使用上
向かないので使用しておりません。

貼り付けるダイアログはチャイルド指定にしており,プログラム
起動時の見た目は問題ないのですが,貼り付けたダイアログ上の
コントロールListViewの操作が全くできません。

マウスでアイテムをクリックしても反応がありません。
どうも,ListViewにメッセージが飛んでいないように思えるのですが
何か問題があるのでしょうか?

どなたかご存じの方がおられたらご教授願います。
よろしくお願いします。

Shimira 2003/02/27(木) 23:27:13
貼り付けたダイアログが、WS_DISABLE スタイルを持ってたりしない?

mina 2003/02/28(金) 10:24:23
いえ,WS_DISABLEはついていません。
spy++でメッセージをチェックしてみたところ,やはり子ウィンドウには
メッセージが届いていないようです。(親にはメッセージが行っています)

そこで,親から子ウィンドウにメッセージを渡せば良いかと思い,
親のPreTranslateMessageにて子ウィンドウに対し IsDialogMessageを
実行するようにもしてみましたがだめでした。

子ウィンドウの指定を「チャイルド」から「ポップアップ」にすれば
子ウィンドウ上のコントロールは問題なく動作するのですが,親の移動に
子ウィンドウはついていけません。

どなたかご存じの方おられたらアドバイスお願いします。

dairygoods 2003/02/28(金) 10:56:59
子ダイアログの親はちゃんとViewになってますか。

mina 2003/02/28(金) 12:03:46
確認してみたところ,親ウインドウはViewのようでした。
「ようでした」と書いたのは,View(MainFrameでしょうか?)の
ウインドウの子に「ダイアログ」と言う名前のウィンドウが存在し
これがどうやらCFormViewで使用するダイアログであることがわかりました。

CFormViewに貼り付けるダイアログを生成するときにOnInitialUpdate内で
thisを引数に生成してCreateしていますが,thisではいけないのでしょうか?

前述のCFormViewで使用するダイアログを親にする必要があるのかとも考え
いまトライして見ていますが,このダイアログのクラスへのポインタの取得
方法を模索しています。

たびたび申し訳ありませんが,私の考えが誤っているようならご指摘願います。

dairygoods 2003/02/28(金) 13:43:26
>CFormViewに貼り付けるダイアログを生成するときにOnInitialUpdate内で
>thisを引数に生成してCreateしていますが,thisではいけないのでしょうか?

あっています。

>前述のCFormViewで使用するダイアログを親にする必要があるのかとも考え
>いまトライして見ていますが,このダイアログのクラスへのポインタの取得
>方法を模索しています。

いえ、CFormViewがダイアログそのものです。

りんご 2003/02/28(金) 19:12:17
minaさんがやりたいこととおなじように、
CListCtrlをCFormView上にCListCtrl::Create()を使用して表示していますが
問題なく動作しています。

void CxxxView::OnInitialUpdate()
{
    CFormView::OnInitialUpdate();
//  GetParentFrame()->RecalcLayout();
//  ResizeParentToFit(FALSE);   CRect rect;
    
    GetClientRect(&rect);

    rect.DeflateRect(0, 30, 0, 0);

    m_pList->Create(WS_VISIBLE | WS_TABSTOP | WS_CHILD |LVS_REPORT, rect, this, 0);
}

なぜなんでしょうね?
ちなみにCFormView以外だとイベントが飛ばな現象が起きたことがあります。
CViewにCListCtrlを貼り付けたとき、LVN_GETDISPINFOが飛んできませんでした。
ご参考になれば。

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