CColorDialogについて


kanagawa  2005-12-06 11:18:42  No: 59879

CButtonクラスを派生させ、CColorButtonを作ろうとしています。

CColorButtonが押されるとCWnd派生クラスにて、自分でOffice97のような
ColorPickerを自前で記述して、そこの色が選択された時に色を変更するクラスを作成しています。(外人さんが作ったクラスを使用しているため、詳しい事は記述できませんがすいません。)

そこでCColorDialogをモーダルとして表示させようとしているのですが、CColorButtonを持っている親のダイアログとの関係が切れて(モーダルのはずが、モードレスのように親のダイアログを触る事が出来て)しまいます。

詳しい処理は記述する事が出来ませんが、どなたかこの現象について何か情報を持っていませんでしょうか?


kanagawa  2005-12-06 11:35:34  No: 59880

すいません、情報があまりにも少ないですよね。

環境は以下の通りです。
VC++.NET
WindowsXP
現在MDIを使用したWindowsアプリを作成しています。

いろいろ試したのですが、CColorButtonを持つDialogをメインフレームから起動させた場合は、CColorDialogもモーダルとして表示されるのですが、
ChildFrameや、アプリケーションクラスから起動させた時は上手くいきません。
ちなみにDialogベースのWindowsアプリにて使用した場合も上手くいくのですが…。

何かわかればお願いします。


RAPT  2005-12-06 12:01:54  No: 59881

> CColorButtonを持つDialogをメインフレームから起動させた場合

> ChildFrameや、アプリケーションクラスから起動させた時
との違いは一体何ですか?
後者は、どうやって、CColorDialog を呼び出していますか?


kanagawa  2005-12-06 17:08:25  No: 59882

どちらも同じです。

ColorButtonを持たせたダイアログをDoModalしているだけです。
起動したダイアログからColorButtonをクリックするだけなのですが。

後の処理はColorButtonにてイベントを取得させ、ColorDialogを起動させているだけです。ColorDialog起動中はキーボードは押せないのですが、マウス操作だけが有効になってしまいます。
同じ処理でもCColorButtonを持つDialogをメインフレームから起動させた場合しかマウス操作が無効になりません。


kanagawa」  2005-12-06 17:52:54  No: 59883

ColorButtonが押されたときに以下のようにCColourPopupを表示しています。

  new CColourPopup(CPoint(rDraw.left, rDraw.bottom),
                     m_Color,
                     this,
                     m_strDefaultText,
                     m_strCustomText);

BOOL CColourPopup::Create(CPoint p, COLORREF crColour, CWnd* pParentWnd,
                          LPCTSTR szDefaultText,
                          LPCTSTR szCustomText)
{
    ASSERT(pParentWnd && ::IsWindow(pParentWnd->GetSafeHwnd()));
  
     CString szClassName = AfxRegisterWndClass(
                    CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW,
                    0,
                    (HBRUSH) (COLOR_BTNFACE+1),
                    0);

    if (!CWnd::CreateEx(0, szClassName, _T(""), WS_VISIBLE|WS_POPUP, 
                        p.x, p.y, 100, 100, 
                        pParentWnd->GetSafeHwnd(), 0, NULL))
        return FALSE;
 
    SetCapture();

    return TRUE;
}

上記のColorPopupはCWndの派生クラスで自分で色の選択部分を描画させています。色の選択部分のある箇所をクリックすると以下のようにColorDialogを表示させる為以下のようにDoModalしています。

     ReleaseCapture();

       CColorDialog dlg(m_crInitialColour, 
                          CC_FULLOPEN| CC_ANYCOLOR, this);

        dlg.DoModal()

マウス操作が無効になるというのは、ColorDialogとColorPopupはモーダルとして動作しているのですが、ColorDialogとColorButtonを持たしているDialogの間では、キーボードは無効となっているのですが、マウス操作が有効となってしまいます。


Toshi  2005-12-07 00:16:56  No: 59884

今一親子関係がはっきり見えません。
例えば MainDialog 内で CColorPopupが DoModal され、 CColorPopup内で CColorDialog が DoModalされれば通常は大丈夫だと思うんですが。
そして、その一連の話の中に CColorButtonは全く関係無いとも思います。


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

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






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