CButtonクラスを派生させ、CColorButtonを作ろうとしています。
CColorButtonが押されるとCWnd派生クラスにて、自分でOffice97のような
ColorPickerを自前で記述して、そこの色が選択された時に色を変更するクラスを作成しています。(外人さんが作ったクラスを使用しているため、詳しい事は記述できませんがすいません。)
そこでCColorDialogをモーダルとして表示させようとしているのですが、CColorButtonを持っている親のダイアログとの関係が切れて(モーダルのはずが、モードレスのように親のダイアログを触る事が出来て)しまいます。
詳しい処理は記述する事が出来ませんが、どなたかこの現象について何か情報を持っていませんでしょうか?
すいません、情報があまりにも少ないですよね。
環境は以下の通りです。
VC++.NET
WindowsXP
現在MDIを使用したWindowsアプリを作成しています。
いろいろ試したのですが、CColorButtonを持つDialogをメインフレームから起動させた場合は、CColorDialogもモーダルとして表示されるのですが、
ChildFrameや、アプリケーションクラスから起動させた時は上手くいきません。
ちなみにDialogベースのWindowsアプリにて使用した場合も上手くいくのですが…。
何かわかればお願いします。
> CColorButtonを持つDialogをメインフレームから起動させた場合
と
> ChildFrameや、アプリケーションクラスから起動させた時
との違いは一体何ですか?
後者は、どうやって、CColorDialog を呼び出していますか?
どちらも同じです。
ColorButtonを持たせたダイアログをDoModalしているだけです。
起動したダイアログからColorButtonをクリックするだけなのですが。
後の処理はColorButtonにてイベントを取得させ、ColorDialogを起動させているだけです。ColorDialog起動中はキーボードは押せないのですが、マウス操作だけが有効になってしまいます。
同じ処理でもCColorButtonを持つDialogをメインフレームから起動させた場合しかマウス操作が無効になりません。
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の間では、キーボードは無効となっているのですが、マウス操作が有効となってしまいます。
今一親子関係がはっきり見えません。
例えば MainDialog 内で CColorPopupが DoModal され、 CColorPopup内で CColorDialog が DoModalされれば通常は大丈夫だと思うんですが。
そして、その一連の話の中に CColorButtonは全く関係無いとも思います。
ツイート | ![]() |