むーと申します。初めて利用させていただきます。
環境
・VC++6.0 (MFC)
・Windows XP
現在、CColorDialogを用いてカラーダイアログを表示するプログラムを作成中ですが、うまくいきません。
呼び出し方ですが、
親ウィンドウ:CFormViewクラスベースのウィンドウ
↓
トップメニューからモーダルダイアログをプロパティーシート(P1とします)として表示。
↓
P1内のあるページをクリックすると、その中にも
プロパティシート(P2とします)が表示されている。
↓
P2内のボタンからカラーダイアログを呼び出す。
という具合で呼び出しています。おそらく、カラーダイアログ自体は呼び出されていると思うのですが、P2の裏に隠れているようで選択することができません。このカラーダイアログのZ順を変えることはできるのでしょうか?とにかく、どのような方法でもかまいませんので、カラーダイアログを選択可能な状態にするのが目的です。ご教授のほどよろしくお願いいたします。
本当にP2の裏?
本当にウィンドウ作れてる?
親を指定してあれば親の背後にはなれないはず。
後から作ったウィンドウって手前になるんじゃなかった?
SetWindowPosでZオーダー変えられる。
wclrp ( 'o')様
たとえば、AfxMessageBox関数をP2内から呼んだとしても裏に隠れているようです。ですから、カラーダイアログも同じような状況に有ると推測しました。
SetWindowPosを使う場合、親のウィンドウハンドルを渡す必要があるようですが、入れ子になってるプロパティシートの場合どのハンドルを渡せばよいのでしょうか?
CColorDialogの第3引数、何を入れてます?
入れてなかったら「this」入れて試してみて下さい。
みい様
CColorDialogの第3引数には,thisが指定してありました.また,ほかのコモンダイアログで試しても同じ結果でした.
少し長いですが,大まかに必要な部分の実装手順を説明させてください.
1.MFC CFormViewベースでプロジェクト作成 - CPropertyViewとします.
2. 各種クラスの作成
・CRootPropertySheet - CPropertyViewから呼ばれる親となるプロパティシート
・CRootPropertyPage - CRootPropertySheet内に生成されるプロパティページ
・CSubPropertySheet - CRootPropertyPage内に生成されるプロパティシートの土台
・CSubPropertyPage - CSubPropertySheet内に生成されるプロパティページ
3. 各クラスの編集
・CPropertyView
- リソースのMenuにON_COMMANDハンドラを追加.ここでは,OnMenu()が呼び出されることにします.
- CRootPropertySheetのメンバ変数:m_rootPropSheetを登録
- OnMenu()実装
m_rootPropSheet.CreateRootPropertySheet();
m_rootPropSheet.DoModal();
・CRootPropertySheet
- CRootPropertyPageのメンバ変数:m_rootPropPageを登録
- CreateRootPropertySheet()実装
Construct("Root Property Sheet",this);
rootPropPage.Construct(IDD_****,0);
AddPage(&rootPropPage);
・CRootPropertyPage
- CSubPropertySheetのメンバ変数:m_subPropSheetを登録
- CSubPropertyPageのメンバ変数:m_subPropPageを登録
- CRootPropertyPage::OnInitDialogを編集
CRect rect;
m_subPropSheet.AddPage(&m_subPropPage);
m_subPropSheet.Create(this, WS_CHILD | WS_VISIBLE, NULL);
m_subPropSheet.GetClientRect(&rect);
m_subPropSheet.SetWindowPos(&wndTop, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW);
以上の流れになります.細かいエラー処理などは省いています.このアプリの動作は,
1.CPropertyViewのウィンドウが開く
2.CPropertyViewのウィンドウのメインメニューをクリック
3.CRootProperySheet
- CRootPropertyPage
- CSubPropertySheet
- CSubPropertyPage
のようにプロパティシートの中に入れ子になったプロパティシートが開かれる.
となります.これらの流れから何か分かる事はありますでしょうか?
以上,よろしくお願いいたします.
カラーダイアログの表示はCSubPropertyPageクラス内に書いていますか?
みい様
>カラーダイアログの表示はCSubPropertyPageクラス内に書いていますか?
はい、書いています。
> おそらく、カラーダイアログ自体は呼び出されていると思うのですが
呼び出したその時にハングってる可能性は無いかい?
PRB: Child CPropertySheet Hangs If Focus Is Switched
http://support.microsoft.com/?scid=kb%3Ben-us%3B149501&x=12&y=14
ブレークポイントをセットして本当に開いているか確認してみてはいかがでしょうか。
みい様
ブレークポイントをセットしてみましたが,どうやらハングアップしていたようです。
gak様
提供していただいた情報をもとに,CSubPropertySheetにOnInitDialog関数を追加し、下記のようにModifyStyleEx (0, WS_EX_CONTROLPARENT)を加えたところ,見事カラーダイアログが表示されました。
BOOL CSubPropertySheet::OnInitDialog()
{
BOOL bResult = CPropertySheet::OnInitDialog();
// TODO: Add your specialized code here
ModifyStyleEx (0, WS_EX_CONTROLPARENT);
return bResult;
}
これで無事解決致しました。
助言をいただいた皆様には感謝の言葉もございません。
本当にありがとうございました^^
ツイート | ![]() |