none
メニュウから次のDialogを出す方法 ”サポートされていない操作を実行しました。”のエラー RRS feed

  • 質問

  • メニューから次段のカラーのDialogを表示させたいと苦戦しています。
    WindowsXp、VSC++6.0 MFCです。
    VSの使い方 C++の書き方も十分にわからない状態で挑戦しています。

    今 メニュ項目 [colorselection] を打つと
    所定のメッセージ ”Menu ColorSelections が押され、OnColorDialogへ”が出てきますが、
    それをOKすると
    エラーメッセージ ”サポートされていない操作を実行しました。”
    (一度は 次のColorDlgのダイヤログがでたと記憶しているようですのですが それを動かすためにいろいろ変えて
    いたら その後なんとしてもでないようになった)

    この意味はVC6.0では無理だと言うことでしょうか?
    どのクラスコードがサポートしていないと言う意味でしょうか?
    どうしたら 次のDialogがでないのでしょうか?

    現状のコードは以下のようになっております。
    どれを必要とするか わからないので すべてでないです。
    必要であれば すべて投稿できます。

    どうか 助言をおねがいします。


    \ColorTest\ColorTestView.cppに以下のコマンドコードがあります。
    void CColorTestView::OnColorSelection() 
    {
    // TODO: この位置にコマンド ハンドラ用のコードを追加してください
    MessageBox(_T("Menu ColorSelections が押され、CColorDlgへ"));
    if(m_colorDlg.DoModal() == IDOK) //nagata
    {
    UpdateData();
    }
    }

    \ColorTest\ColorTestView.h には

    class CColorTestView : public CView
    //class CColorTestView : public CWnd
    {
    // Construction
    protected: // シリアライズ機能のみから作成します。
    DECLARE_DYNCREATE(CColorTestView)

    public:
    CColorTestView();

    // アトリビュート
    public:
    CColorDlg m_colorDlg;   // transfer DATA from ColorDlg by Nagata
    CColorTestDoc* GetDocument();

    \ColorTest\ColorDlg.cpp には

    // CColorDlg ダイアログ

    // コンストラクタ
    CColorDlg::CColorDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CColorDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(CColorDlg)
    // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
    // by nagata ここに変数に初期値を与える
    //    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    //    m_color = RGB(255, 0, 0);
    //}}AFX_DATA_INIT
    }

    void CColorDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CColorDlg)
    DDX_Control(pDX, IDC_BUTTON1, m_color);
    //}}AFX_DATA_MAP
    }


    BEGIN_MESSAGE_MAP(CColorDlg, CDialog)
    //{{AFX_MSG_MAP(CColorDlg)
    ON_COMMAND(IDOK, OnOk)
    ON_BN_CLICKED(IDD_COLOR_DIALOG, OnColorDialog)
    ON_WM_PAINT()
    ON_WM_KEYUP()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CColorDlg メッセージ ハンドラ
    /////////////// by Nagata //////////////////////////////////////////////////////////////
    void CColorDlg::OnOk() 
    {
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    MessageBox(_T("ColorDlgで押されました。OnOk"));

    m_SetDialg = 1;
    CDialog::OnOK();
    }

    void CColorDlg::OnColorDialog() 
    {
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    MessageBox(_T("ColorDlgで[SelectColor]が押されました。OnColorDialog"));
    m_SetDialg = 1;
    CDialog::OnOK();
    }

    void CColorDlg::OnChangeEdit1() // for write the changed variable
    {
    MessageBox(_T("ColorSelectsが押されました。OnChangeEdit1"));
    UpdateData(TRUE);
    // ここで 数値を書き換え
    UpdateData(FALSE); // set the final action
    }
    //end


    \ColorTest\ColorDlg.cpp には

    BEGIN_MESSAGE_MAP(CColorDlg, CDialog)
    //{{AFX_MSG_MAP(CColorDlg)
    ON_COMMAND(IDOK, OnOk)
    ON_BN_CLICKED(IDD_COLOR_DIALOG, OnColorDialog)
    ON_WM_PAINT()
    ON_WM_KEYUP()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    2009年9月26日 7:38

回答

  • void CColorDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CColorDlg)
    DDX_Control(pDX, IDC_BUTTON1, m_color);
    //}}AFX_DATA_MAP
    }
    IDC_BUTTON1 は該当のダイアログ上に存在するのでしょうか。
    m_color は適切な型なのでしょうか。

    サポートされていない操作が実行されましたは、DDX_Control 周りで出ていそうに思えます。
    (別スレッドでも DDX_Control の意味をきちんと捉えられていないと思われる話題がありましたので、そちらも含めて勉強し直して下さい)
    VSの使い方 C++の書き方も十分にわからない状態で挑戦しています。
    C++ や MFC で書き方の理解がない状態で無理矢理進めてもこのように行き止まりになるだけです。
    毎回毎回聞いて、数時間から数日でやっと解決して、次に進んで、再度行き詰まっての繰り返しになると思いますが、それで良いのでしょうか。
    もっと、系統立てて勉強できる方法を考え直した方が、トータルでかかる時間は少なくなり、理解度も上がると思いますよ。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月26日 12:35
    モデレータ
  • 後、MFC の通例に習えば、IDD は Dialog ID で、ボタン等のコントロールは Control ID、IDC を用いるべきでしょう。
    ダイアログテンプレートの名称は IDC_COLOR_DIALOG、色見本を出すボタンは ( ダイアログのコントロールなので ) IDC_COLOR_DIALOG とした方がいいと思います。
    多分タイプミスだと思いますが、「ダイアログのテンプレートが IDC_ になっています」と指摘しておきます。

    ついでに、IDC_ と IDD_ だけの違いじゃ分かりにくいので、単語を付け加えることをお薦めしておきます。
    例えば、IDC_SHOW_COLOR_DIALOG_BUTTON とか。(IDD_COLOR_DIALOG はそのままという前提)
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月28日 14:16
    モデレータ
  • 以前は動いていたと言うなら、その時点まで戻してみるのは基本です。

    デバッグにMessageBoxを使うのは止めましょう。MessageBoxがある場合と、無い場合では、メッセージの発生順序が変わったりして動作が異なるのでバグのもとです。TRACEマクロなどを活用してください。

    勘ですが・・・
    デバッグ用にメッセージボックスを入れたのが原因ではないですか?
    VC++/MFCはASSERTを出す事はあっても「サポートされていない操作を実行しました。」のようなエラーメッセージを出す事はまずないです。エラーメッセージを表示しているのは、Dialog上などに張り付けたCOMコンポーネントであろうと思います。二回目の表示でインスタンスが初期化されないのでエラーになっているのかもしれません。m_colorDlgをクラスメンバではなく、ローカル変数にしてみてください。
    甕星
    2009年9月26日 22:07
  • VC++/MFCはASSERTを出す事はあっても「サポートされていない操作を実行しました。」のようなエラーメッセージを出す事はまずないです。エラーメッセージを表示しているのは、Dialog上などに張り付けたCOMコンポーネントであろうと思います。二回目の表示でインスタンスが初期化されないのでエラーになっているのかもしれません。
    「出すことはない」と断言されていますが、「サポートされていない操作が実行されました」は表示される可能性があります。
    もっとも、DDX_Control のコードを見る限り、先に ASSERT(FALSE) に引っかかるため、Debug ビルドでは表示されませんが…。
    MessageBox で挙動の確認をしているあたりからも、Release ビルドで実行している可能性はありますね。

    (参考)
    Visual C++ 6.0 の MFC を確認して頂けると分かりますが、リソースとして定義されており、MFC のソースで利用している箇所があります。
    (AFX_IDS_NOT_SUPPORTED_EXCEPTION)
    これは CNotSupportedException に対応するメッセージとして定義されています。

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月26日 22:28
    モデレータ
  • 厳しい事を書くようですが、質問内容に出てくる
    「メニュ項目 [colorselection] を打つと 所定のメッセージ ”Menu ColorSelections が押され、OnColorDialogへ”が出てきます」
    と言う部分ですが、この文章はかなり分かりにくいです。
    「メニュ項目 [colorselection] を選択すると、”Menu ColorSelections が押され、OnColorDialogへ”と言う内容のメッセージボックスが出てきます」
    なら、分かりやすいと思います。

    細かい話ですが、質問内容がわからないと掲示板では解答が付きにくくなりますから、
    表現関してはかなり考慮された方が良いと思います。

    Azuleanさんの書き込みの中でも出てきますが、もしかしてデバッグ版を使っていないのですか?
    今のような状態ならデバッグ版でデバッガを使って進めた方が良いような気がしますけれど。
    デバッグ版を使えない理由が何かあるのでしょうか?
    デバッグ版ならASSERTが出るので間違っている箇所の特定がかなり楽になる可能性もあります。
    あと、デバッグ版とリリース版で挙動が違うと言うような状況があるのであれば、
    きちんと原因を究明して直しておかないと元のプログラム自体が信用できない状態かもしれません。
    こう言う状態でコードを追加してしまうと益々状況が悪化して原因を究明しにくくなります。
    もし、想像が当たっているなら追加のコードを入れずに元の状態で悪い所の確定を行ったほうが良いと思います。

    現状では、ほとんどまる投げに近い状況になりつつあるので掲示板のアドバイスで何とか動いたとしても
    外部に対して提供できる品質になるかはかなり怪しそうです。
    個人的に内輪で使うもので外に出す製品に影響のないものならまだ良いのですが、
    影響が出るようなものならば、かなり厳しいのではないかというのが正直な意見です。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年9月28日 4:26
  • こんばんわ、ミッヒーといいます。

    Azulean さんご指摘の通り、MFC の DDX 部分を勘違いされているように感じます。

    大雑把な言い方になりますが、DDX はダイアログデータを、ダイアログの初期化時と表示後、ダイアログを呼び出した相手が利用する目的で使われます。

    なので、ダイアログで色の指定を行うのであれば、ダイアログ側では COLORREF 型を使うべきと思います。

    後、MFC の通例に習えば、IDD は Dialog ID で、ボタン等のコントロールは Control ID、IDC を用いるべきでしょう。
    ダイアログテンプレートの名称は IDC_COLOR_DIALOG、色見本を出すボタンは ( ダイアログのコントロールなので ) IDC_COLOR_DIALOG とした方がいいと思います。まあ、見易さの問題ですが・・・。

    ただ、現状では両方が IDD_COLOR_DIALOG を使っている為、MFC が混乱している様に感じますが・・・。

    2009年9月28日 13:14
  • 次段のDialogのpropertyを 
     ColorTestView.h(27): CColorSetDlg m_colorSetDlg;   // transfer DATA from ColorSetDlg by Nagata
    DDX_Control(pDX, IDD_COLOR_DIALOG, m_colorSetDlg);
    と直して、次のカラーを読み出すDialogがでました。

    「直して」と書かれていますが、修正できているのでしょうか?
    正直なところ、この説明では十分に理解できていない状態でコンパイルが通った&動いたから OK にしか見えません。

    これは
    // CButton m_color;
    bool m_color;
    とすると
    DDX_Control(pDX, IDD_COLOR_DIALOG, m_color);

    \ColorSetDlg.cpp(36) : error C2664: 'DDX_Control' : 3 番目の引数を 'bool' から 'class CWnd &' に変換できません。 (新しい機能 ; ヘルプを参照)
            'const' に対してではない参照は 非 lvalue へバインドできません。
    のエラーがでるので そのままです。

    以前から書いていますが、DDX_Control は何をするものか、第3引数には何を求められているかちゃんと確認し、理解できるようになって下さい。
    確認して理解できていれば、CButton から bool に変更するという手を試すまでもなく、駄目だということが分かるはずです。(分からないのであれば、残念ながら理解不足ということになります)
    ところで、DDX が必要なコントロールなのでしょうか?

    カラーの選択を読み出すColorSetDlg(前のColorTestDlgを改名 別のファイルとした )のIDは IDD_COLOR_DIALOGであり、
    また 色見本を出す予定のボタンもやはり IDD_COLOR_DIALOGであることです。

    ID の重複は混乱を招きます。
    適切に命名して下さい。

    それでも
    void CColorSetDlg::OnColorDialog()  
    {
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    MessageBox(_T("ColorSetDlgで[SetColor]が押されました。OnColorSetDlg"));
    m_SetDialog = 1;
    CDialog::OnOK();
    }
    いかがでしょうか?

    この部分は何をお聞きになりたいのか、よく分かりません。



    改めて書きますが、適当にいじくって OK なんてことはありませんので、きちんと意味を理解できるように勉強して下さい。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月28日 14:13
    モデレータ
  • TRACEマクロを使って動作状況を見るのであれば、デバッグビルドで行なわないとアウトプットウインドウに出ませんので
    注意して下さい。リリースビルドの場合、TRACEマクロは何もしません。

    で、前の書き込みの時に書いているのですが、現状の作業は、デバッグビルドとリリースビルドのどちらで行なわれているのでしょう?
    デバッガを使って動作確認をするのであれば、わざわざMessageBoxを入れるまでもなく、ブレイクポイントの設定で十分なはずだと
    思うのですが。

    メニューを選択して出てくるのがCColorSetDlgで、そのCColorSetDlg上に色見本を出す予定のボタンがあると言う話なんでしょうか?
    現状は、メニューを選択してCColorSetDlgを出そうとしている所で例外が出てうまく行かないという話なんですよね。

    と言う事は、CColorSetDlgその物を表示しようとして例外が発生してしまっているわけですよね。
    表示しようとしている段階でおかしくなっていて、どうもDoDataExchange内で例がが出てしまっているらしいと。
    デバッガでDoDataExchangeの最初のステップにブレイクポイントを設定してデバッグモードで動かして見ては
    どうでしょうか?
    何処で例外が出ているのかわかると思います。
    結局の所、例外が出ている原因をちゃんと理解しないと先に進めません。

    恐らくですが、殆ど雛形の状態のCColorSetDlgの時は表示を開始する時に追加した処理が全くなかったので
    普通に動いていて、CColorSetDlgに追加の処理を入れだしたらおかしくなったのだろうと思います。
    なので、御本人が処理を追加したところが怪しいと思います。
    現状で特に処理を追加していないのであれば、もう一度ダイアログを新規で追加するところからやり直した方が
    分かりやすいかもしれません。
    徐々に処理を追加していってどこを追加した時にうまく行かなくなったのかである程度は原因が特定できるのでは
    ないかと思います。(必ずしもこれで全てが解決できるわけではないですが、基本的な手法だと思うので)

    一つの問題が解決しないままに先に進んでしまって問題が折り重なっていないでしょうか?
    どうも色々な間違いが複数あって今の結果を生んでいるように思えるのですが。
    問題点を分離してひとつずつ解決していかないと混乱するばかりで解決できないと思いますよ。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年9月29日 5:41
  • ふと思い出した事があるので、一応書き込みします。

    Windows 等のプラットホームに依存しない C++ の書籍を参考にされているのでしょうか?

    以前、プラットホームに依存しない、純粋な C++ の書籍で、クラス A のインスタンスからクラス B のインスタンスのパブリック関数を呼び出す事を、「クラス A から、クラス B にメッセージを送る」、と記述してあったのを思い出しました。

    現在の C++ 標準化委員会の正式なドキュメントは残念ながら見ていないので、どうなっているかは判りませんが・・・。

    Windows プログラムで 「メッセージを送る」、という場合、Windows 定義、あるいはユーザー定義のメッセージと呼ばれる数値が、アプリケーションのメッセージキューと呼ばれる格納場所に送られ、処理を待つ事になります。

    このメッセージは数値であり、メッセージに付随するパラメーターも同時にメッセージキューに格納され、基本的には格納された順番に処理が行われます。

    既にご承知の事であれば聞き流して下さい。

    2009年9月29日 16:19
  • なお このスレッド質問は 同じ質問者の
    色見本を出して、そのデータを 描画のソースに移す
    に移項します。 ありがとうございました。
    リンクくらい、張りましょうよ。
    http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/aa56add4-c836-469b-a572-b76f45f1f85b
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年10月9日 14:18
    モデレータ

すべての返信

  • void CColorDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CColorDlg)
    DDX_Control(pDX, IDC_BUTTON1, m_color);
    //}}AFX_DATA_MAP
    }
    IDC_BUTTON1 は該当のダイアログ上に存在するのでしょうか。
    m_color は適切な型なのでしょうか。

    サポートされていない操作が実行されましたは、DDX_Control 周りで出ていそうに思えます。
    (別スレッドでも DDX_Control の意味をきちんと捉えられていないと思われる話題がありましたので、そちらも含めて勉強し直して下さい)
    VSの使い方 C++の書き方も十分にわからない状態で挑戦しています。
    C++ や MFC で書き方の理解がない状態で無理矢理進めてもこのように行き止まりになるだけです。
    毎回毎回聞いて、数時間から数日でやっと解決して、次に進んで、再度行き詰まっての繰り返しになると思いますが、それで良いのでしょうか。
    もっと、系統立てて勉強できる方法を考え直した方が、トータルでかかる時間は少なくなり、理解度も上がると思いますよ。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月26日 12:35
    モデレータ
  • 以前は動いていたと言うなら、その時点まで戻してみるのは基本です。

    デバッグにMessageBoxを使うのは止めましょう。MessageBoxがある場合と、無い場合では、メッセージの発生順序が変わったりして動作が異なるのでバグのもとです。TRACEマクロなどを活用してください。

    勘ですが・・・
    デバッグ用にメッセージボックスを入れたのが原因ではないですか?
    VC++/MFCはASSERTを出す事はあっても「サポートされていない操作を実行しました。」のようなエラーメッセージを出す事はまずないです。エラーメッセージを表示しているのは、Dialog上などに張り付けたCOMコンポーネントであろうと思います。二回目の表示でインスタンスが初期化されないのでエラーになっているのかもしれません。m_colorDlgをクラスメンバではなく、ローカル変数にしてみてください。
    甕星
    2009年9月26日 22:07
  • VC++/MFCはASSERTを出す事はあっても「サポートされていない操作を実行しました。」のようなエラーメッセージを出す事はまずないです。エラーメッセージを表示しているのは、Dialog上などに張り付けたCOMコンポーネントであろうと思います。二回目の表示でインスタンスが初期化されないのでエラーになっているのかもしれません。
    「出すことはない」と断言されていますが、「サポートされていない操作が実行されました」は表示される可能性があります。
    もっとも、DDX_Control のコードを見る限り、先に ASSERT(FALSE) に引っかかるため、Debug ビルドでは表示されませんが…。
    MessageBox で挙動の確認をしているあたりからも、Release ビルドで実行している可能性はありますね。

    (参考)
    Visual C++ 6.0 の MFC を確認して頂けると分かりますが、リソースとして定義されており、MFC のソースで利用している箇所があります。
    (AFX_IDS_NOT_SUPPORTED_EXCEPTION)
    これは CNotSupportedException に対応するメッセージとして定義されています。

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月26日 22:28
    モデレータ
  • 厳しい事を書くようですが、質問内容に出てくる
    「メニュ項目 [colorselection] を打つと 所定のメッセージ ”Menu ColorSelections が押され、OnColorDialogへ”が出てきます」
    と言う部分ですが、この文章はかなり分かりにくいです。
    「メニュ項目 [colorselection] を選択すると、”Menu ColorSelections が押され、OnColorDialogへ”と言う内容のメッセージボックスが出てきます」
    なら、分かりやすいと思います。

    細かい話ですが、質問内容がわからないと掲示板では解答が付きにくくなりますから、
    表現関してはかなり考慮された方が良いと思います。

    Azuleanさんの書き込みの中でも出てきますが、もしかしてデバッグ版を使っていないのですか?
    今のような状態ならデバッグ版でデバッガを使って進めた方が良いような気がしますけれど。
    デバッグ版を使えない理由が何かあるのでしょうか?
    デバッグ版ならASSERTが出るので間違っている箇所の特定がかなり楽になる可能性もあります。
    あと、デバッグ版とリリース版で挙動が違うと言うような状況があるのであれば、
    きちんと原因を究明して直しておかないと元のプログラム自体が信用できない状態かもしれません。
    こう言う状態でコードを追加してしまうと益々状況が悪化して原因を究明しにくくなります。
    もし、想像が当たっているなら追加のコードを入れずに元の状態で悪い所の確定を行ったほうが良いと思います。

    現状では、ほとんどまる投げに近い状況になりつつあるので掲示板のアドバイスで何とか動いたとしても
    外部に対して提供できる品質になるかはかなり怪しそうです。
    個人的に内輪で使うもので外に出す製品に影響のないものならまだ良いのですが、
    影響が出るようなものならば、かなり厳しいのではないかというのが正直な意見です。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年9月28日 4:26
  • >デバッグにMessageBoxを使うのは止めましょう。
    はい できるだけ なくすようにします。

    > MessageBoxがある場合と、無い場合では、メッセージの発生順序が変わったりして動作が異なるのでバグのもとです。
    > TRACEマクロなどを活用してください。
    このやりかたを勉強していきたいとおもいます。
    ありがとうございます。

    > IDC_BUTTON1 は該当のダイアログ上に存在するのでしょうか。
    メニュウーのPropertyを一生懸命(?)みていました。
    次段のDialogのpropertyを 
     ColorTestView.h(27): CColorSetDlg m_colorSetDlg;   // transfer DATA from ColorSetDlg by Nagata
    DDX_Control(pDX, IDD_COLOR_DIALOG, m_colorSetDlg);
    と直して、次のカラーを読み出すDialogがでました。

    > m_color は適切な型なのでしょうか。
    これは
    // CButton m_color;
    bool m_color;
    とすると
    DDX_Control(pDX, IDD_COLOR_DIALOG, m_color);
    \ColorSetDlg.cpp(36) : error C2664: 'DDX_Control' : 3 番目の引数を 'bool' から 'class CWnd &' に変換できません。 (新しい機能 ; ヘルプを参照)
            'const' に対してではない参照は 非 lvalue へバインドできません。
    のエラーがでるので そのままです。

    自分でも おかしいなと思ったことは メニュから

    カラーの選択を読み出すColorSetDlg(前のColorTestDlgを改名 別のファイルとした )のIDは IDD_COLOR_DIALOGであり、
    また 色見本を出す予定のボタンもやはり IDD_COLOR_DIALOGであることです。

    それでも
    void CColorSetDlg::OnColorDialog()  
    {
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    MessageBox(_T("ColorSetDlgで[SetColor]が押されました。OnColorSetDlg"));
    m_SetDialog = 1;
    CDialog::OnOK();
    }
    いかがでしょうか?

    これでよければ つぎにカラーの見本を出し それから選択し、Viewのクラスにデータを与えることです。
    これは すでに 質問している ところを参考にしたいと思います。



    2009年9月28日 10:59
  • >デバッグにMessageBoxを使うのは止めましょう。
    はい できるだけ なくすようにします。

    > MessageBoxがある場合と、無い場合では、メッセージの発生順序が変わったりして動作が異なるのでバグのもとです。
    > TRACEマクロなどを活用してください。
    このやりかたを勉強していきたいとおもいます。
    ありがとうございます。

    > IDC_BUTTON1 は該当のダイアログ上に存在するのでしょうか。
    メニュウーのPropertyを一生懸命(?)みていました。
    次段のDialogのpropertyを 
     ColorTestView.h(27): CColorSetDlg m_colorSetDlg;   // transfer DATA from ColorSetDlg by Nagata
    DDX_Control(pDX, IDD_COLOR_DIALOG, m_colorSetDlg);
    と直して、次のカラーを読み出すDialogがでました。

    > m_color は適切な型なのでしょうか。
    これは
    // CButton m_color;
    bool m_color;
    とすると
    DDX_Control(pDX, IDD_COLOR_DIALOG, m_color);
    \ColorSetDlg.cpp(36) : error C2664: 'DDX_Control' : 3 番目の引数を 'bool' から 'class CWnd &' に変換できません。 (新しい機能 ; ヘルプを参照)
            'const' に対してではない参照は 非 lvalue へバインドできません。
    のエラーがでるので そのままです。

    自分でも おかしいなと思ったことは メニュから

    カラーの選択を読み出すColorSetDlg(前のColorTestDlgを改名 別のファイルとした )のIDは IDD_COLOR_DIALOGであり、
    また 色見本を出す予定のボタンもやはり IDD_COLOR_DIALOGであることです。

    それでも
    void CColorSetDlg::OnColorDialog()  
    {
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    MessageBox(_T("ColorSetDlgで[SetColor]が押されました。OnColorSetDlg"));
    m_SetDialog = 1;
    CDialog::OnOK();
    }
    いかがでしょうか?

    これでよければ つぎにカラーの見本を出し それから選択し、Viewのクラスにデータを与えることです。
    これは すでに 質問している ところを参考にしたいと思います。



    2009年9月28日 11:00
  • こんばんわ、ミッヒーといいます。

    Azulean さんご指摘の通り、MFC の DDX 部分を勘違いされているように感じます。

    大雑把な言い方になりますが、DDX はダイアログデータを、ダイアログの初期化時と表示後、ダイアログを呼び出した相手が利用する目的で使われます。

    なので、ダイアログで色の指定を行うのであれば、ダイアログ側では COLORREF 型を使うべきと思います。

    後、MFC の通例に習えば、IDD は Dialog ID で、ボタン等のコントロールは Control ID、IDC を用いるべきでしょう。
    ダイアログテンプレートの名称は IDC_COLOR_DIALOG、色見本を出すボタンは ( ダイアログのコントロールなので ) IDC_COLOR_DIALOG とした方がいいと思います。まあ、見易さの問題ですが・・・。

    ただ、現状では両方が IDD_COLOR_DIALOG を使っている為、MFC が混乱している様に感じますが・・・。

    2009年9月28日 13:14
  • 次段のDialogのpropertyを 
     ColorTestView.h(27): CColorSetDlg m_colorSetDlg;   // transfer DATA from ColorSetDlg by Nagata
    DDX_Control(pDX, IDD_COLOR_DIALOG, m_colorSetDlg);
    と直して、次のカラーを読み出すDialogがでました。

    「直して」と書かれていますが、修正できているのでしょうか?
    正直なところ、この説明では十分に理解できていない状態でコンパイルが通った&動いたから OK にしか見えません。

    これは
    // CButton m_color;
    bool m_color;
    とすると
    DDX_Control(pDX, IDD_COLOR_DIALOG, m_color);

    \ColorSetDlg.cpp(36) : error C2664: 'DDX_Control' : 3 番目の引数を 'bool' から 'class CWnd &' に変換できません。 (新しい機能 ; ヘルプを参照)
            'const' に対してではない参照は 非 lvalue へバインドできません。
    のエラーがでるので そのままです。

    以前から書いていますが、DDX_Control は何をするものか、第3引数には何を求められているかちゃんと確認し、理解できるようになって下さい。
    確認して理解できていれば、CButton から bool に変更するという手を試すまでもなく、駄目だということが分かるはずです。(分からないのであれば、残念ながら理解不足ということになります)
    ところで、DDX が必要なコントロールなのでしょうか?

    カラーの選択を読み出すColorSetDlg(前のColorTestDlgを改名 別のファイルとした )のIDは IDD_COLOR_DIALOGであり、
    また 色見本を出す予定のボタンもやはり IDD_COLOR_DIALOGであることです。

    ID の重複は混乱を招きます。
    適切に命名して下さい。

    それでも
    void CColorSetDlg::OnColorDialog()  
    {
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    MessageBox(_T("ColorSetDlgで[SetColor]が押されました。OnColorSetDlg"));
    m_SetDialog = 1;
    CDialog::OnOK();
    }
    いかがでしょうか?

    この部分は何をお聞きになりたいのか、よく分かりません。



    改めて書きますが、適当にいじくって OK なんてことはありませんので、きちんと意味を理解できるように勉強して下さい。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月28日 14:13
    モデレータ
  • 後、MFC の通例に習えば、IDD は Dialog ID で、ボタン等のコントロールは Control ID、IDC を用いるべきでしょう。
    ダイアログテンプレートの名称は IDC_COLOR_DIALOG、色見本を出すボタンは ( ダイアログのコントロールなので ) IDC_COLOR_DIALOG とした方がいいと思います。
    多分タイプミスだと思いますが、「ダイアログのテンプレートが IDC_ になっています」と指摘しておきます。

    ついでに、IDC_ と IDD_ だけの違いじゃ分かりにくいので、単語を付け加えることをお薦めしておきます。
    例えば、IDC_SHOW_COLOR_DIALOG_BUTTON とか。(IDD_COLOR_DIALOG はそのままという前提)
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月28日 14:16
    モデレータ
  • ご指摘の通り、タイプミスでした。Azulean さん、いつもすみません。
    ついでに、IDC_ と IDD_ だけの違いじゃ分かりにくいので、それぞれ単語を付け加えることをお薦めしておきます。
    例えば、IDC_SHOW_COLOR_DIALOG_BUTTON とか。(IDD_COLOR_DIALOG はそのままという前提)
    そちらにも触れておくべきでした。有難うございました。
    2009年9月28日 14:22
  • TRACEマクロを使って動作状況を見るのであれば、デバッグビルドで行なわないとアウトプットウインドウに出ませんので
    注意して下さい。リリースビルドの場合、TRACEマクロは何もしません。

    で、前の書き込みの時に書いているのですが、現状の作業は、デバッグビルドとリリースビルドのどちらで行なわれているのでしょう?
    デバッガを使って動作確認をするのであれば、わざわざMessageBoxを入れるまでもなく、ブレイクポイントの設定で十分なはずだと
    思うのですが。

    メニューを選択して出てくるのがCColorSetDlgで、そのCColorSetDlg上に色見本を出す予定のボタンがあると言う話なんでしょうか?
    現状は、メニューを選択してCColorSetDlgを出そうとしている所で例外が出てうまく行かないという話なんですよね。

    と言う事は、CColorSetDlgその物を表示しようとして例外が発生してしまっているわけですよね。
    表示しようとしている段階でおかしくなっていて、どうもDoDataExchange内で例がが出てしまっているらしいと。
    デバッガでDoDataExchangeの最初のステップにブレイクポイントを設定してデバッグモードで動かして見ては
    どうでしょうか?
    何処で例外が出ているのかわかると思います。
    結局の所、例外が出ている原因をちゃんと理解しないと先に進めません。

    恐らくですが、殆ど雛形の状態のCColorSetDlgの時は表示を開始する時に追加した処理が全くなかったので
    普通に動いていて、CColorSetDlgに追加の処理を入れだしたらおかしくなったのだろうと思います。
    なので、御本人が処理を追加したところが怪しいと思います。
    現状で特に処理を追加していないのであれば、もう一度ダイアログを新規で追加するところからやり直した方が
    分かりやすいかもしれません。
    徐々に処理を追加していってどこを追加した時にうまく行かなくなったのかである程度は原因が特定できるのでは
    ないかと思います。(必ずしもこれで全てが解決できるわけではないですが、基本的な手法だと思うので)

    一つの問題が解決しないままに先に進んでしまって問題が折り重なっていないでしょうか?
    どうも色々な間違いが複数あって今の結果を生んでいるように思えるのですが。
    問題点を分離してひとつずつ解決していかないと混乱するばかりで解決できないと思いますよ。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    2009年9月29日 5:41
  • ふと思い出した事があるので、一応書き込みします。

    Windows 等のプラットホームに依存しない C++ の書籍を参考にされているのでしょうか?

    以前、プラットホームに依存しない、純粋な C++ の書籍で、クラス A のインスタンスからクラス B のインスタンスのパブリック関数を呼び出す事を、「クラス A から、クラス B にメッセージを送る」、と記述してあったのを思い出しました。

    現在の C++ 標準化委員会の正式なドキュメントは残念ながら見ていないので、どうなっているかは判りませんが・・・。

    Windows プログラムで 「メッセージを送る」、という場合、Windows 定義、あるいはユーザー定義のメッセージと呼ばれる数値が、アプリケーションのメッセージキューと呼ばれる格納場所に送られ、処理を待つ事になります。

    このメッセージは数値であり、メッセージに付随するパラメーターも同時にメッセージキューに格納され、基本的には格納された順番に処理が行われます。

    既にご承知の事であれば聞き流して下さい。

    2009年9月29日 16:19
  • この質問をしたときの ColorTestはあきらめました。
    そして 以前から 描画動作していた Project の
    CparameterDlgへのボタンは 付くようになりました。

    void CParameterDlg::OnBtn1Gcolor()
    {
     // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    MessageBox(_T("ParameterDialog で GroundColorが押されました"));
    }

    そして
    http://www.geocities.co.jp/SiliconValley-PaloAlto/5610/vc.html
    Dawnloadして 大変気に入りました。
    この色選択ボタンを利用しようと考えています。

    どのようにすれば利用できるのでしょうか
    ClassWizardの 使い方がよくわかっていないので
    やっと 先の条件設定のDialogで次のコードまでは  得ましたが その後 どうしたら 上の二つを組み込むかわからずに立ち止まっています。
    なお この一筆描画ソフトは 認知介護予防などで福祉施設で無償で使うことになります。
    ぜひ お願いします。
    なお このスレッド質問は 同じ質問者の

    色見本を出して、そのデータを 描画のソースに移す

    に移項します。 ありがとうございました。


    2009年10月9日 0:43
  • なお このスレッド質問は 同じ質問者の
    色見本を出して、そのデータを 描画のソースに移す
    に移項します。 ありがとうございました。
    リンクくらい、張りましょうよ。
    http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/aa56add4-c836-469b-a572-b76f45f1f85b
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年10月9日 14:18
    モデレータ
  • 気をつけます
    2009年10月11日 6:22
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    Azuleanさん、甕星さん、PATIOさん、ミッヒーさん
    沢山のアドバイスを頂き、ありがとうございました。

    Shonan Hannyaさん
    MSDNフォーラムのご利用ありがとうございます。

    今回皆様から沢山のご意見、アドバイスを頂いたので、
    皆様からの投稿に、回答マークを付けさせて貰いました。
    もし、不適切と思いましたら、回答マークを削除することも可能です。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレーター 高橋春樹
    2009年12月21日 9:09