カラーダイアログのZ順を変更するには?

解決


むー  2009-06-20 02:54:03  No: 70376

むーと申します。初めて利用させていただきます。

環境
 ・VC++6.0 (MFC)
 ・Windows XP
 

現在、CColorDialogを用いてカラーダイアログを表示するプログラムを作成中ですが、うまくいきません。
呼び出し方ですが、

親ウィンドウ:CFormViewクラスベースのウィンドウ

トップメニューからモーダルダイアログをプロパティーシート(P1とします)として表示。

P1内のあるページをクリックすると、その中にも
プロパティシート(P2とします)が表示されている。

P2内のボタンからカラーダイアログを呼び出す。

という具合で呼び出しています。おそらく、カラーダイアログ自体は呼び出されていると思うのですが、P2の裏に隠れているようで選択することができません。このカラーダイアログのZ順を変えることはできるのでしょうか?とにかく、どのような方法でもかまいませんので、カラーダイアログを選択可能な状態にするのが目的です。ご教授のほどよろしくお願いいたします。


wclrp ( 'o')  2009-06-24 06:46:13  No: 70377

本当にP2の裏?
本当にウィンドウ作れてる?
親を指定してあれば親の背後にはなれないはず。
後から作ったウィンドウって手前になるんじゃなかった?

SetWindowPosでZオーダー変えられる。


むー  2009-07-03 15:37:21  No: 70378

wclrp ( 'o')様

たとえば、AfxMessageBox関数をP2内から呼んだとしても裏に隠れているようです。ですから、カラーダイアログも同じような状況に有ると推測しました。
SetWindowPosを使う場合、親のウィンドウハンドルを渡す必要があるようですが、入れ子になってるプロパティシートの場合どのハンドルを渡せばよいのでしょうか?


みい  2009-07-03 21:33:56  No: 70379

CColorDialogの第3引数、何を入れてます?
入れてなかったら「this」入れて試してみて下さい。


むー  2009-07-04 09:25:30  No: 70380

みい様

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
   のようにプロパティシートの中に入れ子になったプロパティシートが開かれる.

となります.これらの流れから何か分かる事はありますでしょうか?
以上,よろしくお願いいたします.


みい  2009-07-06 06:30:26  No: 70381

カラーダイアログの表示はCSubPropertyPageクラス内に書いていますか?


むー  2009-07-06 13:46:53  No: 70382

みい様

>カラーダイアログの表示はCSubPropertyPageクラス内に書いていますか?

はい、書いています。


gak  2009-07-07 02:04:25  No: 70383

> おそらく、カラーダイアログ自体は呼び出されていると思うのですが
呼び出したその時にハングってる可能性は無いかい?

PRB: Child CPropertySheet Hangs If Focus Is Switched
http://support.microsoft.com/?scid=kb%3Ben-us%3B149501&x=12&y=14


みい  2009-07-07 23:14:51  No: 70384

ブレークポイントをセットして本当に開いているか確認してみてはいかがでしょうか。


むー  2009-07-10 10:14:36  No: 70385

みい様
  ブレークポイントをセットしてみましたが,どうやらハングアップしていたようです。

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;
  }

これで無事解決致しました。
助言をいただいた皆様には感謝の言葉もございません。
本当にありがとうございました^^


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加