none
menu の選択でAlternateの場合 Checkを入れる RRS feed

  • 質問

  • WindowsXP VC6.0 MFC 
    現在 メニューバアーの中にToolBarやStatusBarがあり、それぞれ それを選ぶと交互に機能するかしなかになり、かつ PopupMenuの項目で
    機能するときはチェック印が入ります。しかし、こちらが作った他の項目ではそれが入りません。どうしたら 交互にチェック印を入れられますか?
    項目のプロパテのチェックを選ぶと常時表示されてしまいます。
    2009年9月20日 21:43

回答

  • しかし、こちらが作った他の項目ではそれが入りません。どうしたら 交互にチェック印を入れられますか?
    そのように実装しなければなりません。
    Visual C++ 6.0 でも OnUpdateUIState か何かでメニューの状態を更新するためのハンドラを追加できたはずです。このハンドラの中で、独自の要素を表示している・していないを判定し、メニューアイテムの状態を更新することができるはずです。

    (申し訳ありませんが、Visual C++ 6.0 での追試はしていません。)
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月21日 7:46
    モデレータ
  • そのハンドらをどこにいれるのでしょうか?該当するPopUpmenu のClasswizardを開いて メッセジーをみたのでsが
    みあたりません。みどころがわるいのかもしれません。
    レベルを落として 教えていただけませんでしょうかおねがいします。
    メインの PC には Visual C++ 6.0 が入っていませんでしたので、サブ PC にて確認しました。
    ClassWizard の メニュー ID に対応するメッセージとして UPDATE_COMMAND_UI に対するハンドラを追加して下さい。

    検索してみたところ、こちらのページが近いイメージでしょうか。
    http://www.geocities.jp/tweedamp2004/vc/vc4_3.html

    チェックを ON にすべきか、OFF にすべきかは自分で何らかのメンバー変数を使う等して条件分岐をする必要があります。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月21日 15:11
    モデレータ
  • void CAboutDlg::OnUpdateViewDrawImages(CCmdUI* pCmdUI) {
    // TODO: この位置に command update UI ハンドラ用のコードを追加してください
    pCmdUI->SetCheck(1) // on <-コピしたもの
    pCmdUI->SetCheck(0) // off <-コピしたもの
    }
    このままでは 2行目で構文エラになりました。言われるように If () then else 文が必要でしょうか?
    構文エラーは構文エラーです。
    if 制御構造を入れる・入れないとは全く関係ありません。

    本当に上記のままコピペされているのであれば、セミコロンが足りていません。
    そこで
    // TODO: この位置に command update UI ハンドラ用のコードを追加してください
    if(m_drawMode == 1){  pCmdUI->SetCheck(1) }// on
    else     pCmdUI->SetCheck(0) }// off
    としたのですが 変数が定義されていないとなります。
    まず この方向でよいでしょうか そして 定義として 共通には どうするのでしょうか?>
    そのやり方をするのであれば、pCmdUI は使えません。(OnUpdateViewDragImages の引数を OnViewDragImages で使えないことはお分かり頂ければと思います)
    このやり方は設定するときに状態を反映する手法ですが、UPDATE_COMMAND_UI は表示されるときに状態を反映する手法です。
    設定するときに状態を反映するのであれば、CheckMenuItem メソッド等を調べて下さい。

    ところで、今回の回答から、C++ 関する知識・経験に不安を覚えます。
    趣味で少しずつ触っているのであれば問題ないと思いますが、業務の一環であるのであれば(余計なお世話かもしれませんが)上司や研修担当者とよく報告・連絡・相談して下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月22日 13:12
    モデレータ
  • その上で どのような分岐のコードを加えるのか おしえてください。
    考えるのはご自身でお願いします。
    考えたことを説明して頂いた上で、「この部分だけが分からない」とするところにアドバイスはできるかもしれません。

    今の時点で抱いている感想としては、なぜ、CButton なのかが分かりません。どこかで状態を変更し、その状態を保持するだけなら BOOL で良いですよね。
    何か理由があってそうしているのであれば、それを説明してもらえないと伝わりません。

    あるいは 上の方法がだめなら
    CheckMenuItem   の方法をもうすこし 具体的におしえていただけませんか
    CMenu MFC CheckMenuItem 等をキーワードとして組み合わせて検索し、その結果を吟味し、必要に応じてさらに絞り込んだり、新たなキーワードで検索し直したりして調べて下さい。
    (自分である程度とっかかりを得られるようになって下さい)


    正直なところ、フォーラムベースで事細かに教えることはできません。
    23 日で連休も終わりますし、その後もこの調子だと、私は回答できませんのであしからずご了承下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月22日 15:19
    モデレータ
  • \Kolam C++\KolamDesigner.cpp(125) : error C2664: 'DDX_Control' : 3 番目の引数を 'int' から 'class CWnd &' に変換できません。 (新しい機能 ; ヘルプを参照) nbsp;       'const' に対してではない参照は 非 lvalue へバインドできません。

    とエラーになりました。
    そのエラーが出るのは当然です。
    なぜかは、DDX が何をするものかきちんと調べて下さい。

    適当に書き換えたら通るなんてことはないので、コードの意味を少しずつでも理解して下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月26日 12:06
    モデレータ

すべての返信

  • しかし、こちらが作った他の項目ではそれが入りません。どうしたら 交互にチェック印を入れられますか?
    そのように実装しなければなりません。
    Visual C++ 6.0 でも OnUpdateUIState か何かでメニューの状態を更新するためのハンドラを追加できたはずです。このハンドラの中で、独自の要素を表示している・していないを判定し、メニューアイテムの状態を更新することができるはずです。

    (申し訳ありませんが、Visual C++ 6.0 での追試はしていません。)
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月21日 7:46
    モデレータ
  • ありがとうございます。
    そのハンドらをどこにいれるのでしょうか?該当するPopUpmenu のClasswizardを開いて メッセジーをみたのでsが
    みあたりません。みどころがわるいのかもしれません。レベルを落として 教えていただけませんでしょうか
    おねがいします。
    2009年9月21日 14:53
  • そのハンドらをどこにいれるのでしょうか?該当するPopUpmenu のClasswizardを開いて メッセジーをみたのでsが
    みあたりません。みどころがわるいのかもしれません。
    レベルを落として 教えていただけませんでしょうかおねがいします。
    メインの PC には Visual C++ 6.0 が入っていませんでしたので、サブ PC にて確認しました。
    ClassWizard の メニュー ID に対応するメッセージとして UPDATE_COMMAND_UI に対するハンドラを追加して下さい。

    検索してみたところ、こちらのページが近いイメージでしょうか。
    http://www.geocities.jp/tweedamp2004/vc/vc4_3.html

    チェックを ON にすべきか、OFF にすべきかは自分で何らかのメンバー変数を使う等して条件分岐をする必要があります。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月21日 15:11
    モデレータ
  • コード編集で これが表示されて 参考のURLの内容をこぴーしました
    void CAboutDlg::OnUpdateViewDrawImages(CCmdUI* pCmdUI) 
    {
    // TODO: この位置に command update UI ハンドラ用のコードを追加してください
    pCmdUI->SetCheck(1) // on <-コピしたもの
    pCmdUI->SetCheck(0) // off <-コピしたもの

    }
    このままでは 2行目で構文エラになりました。言われるように If () then else 文が必要でしょうか?

    void CChildView::OnViewDrawImages() // alternate to change drawMode of edgeChain
    {
    // TODO: この位置にコマンド ハンドラ用のコードを追加してください
      m_drawMode = 1 -m_drawMode; //ToggleSwitch to 0: draw KoMaTile, 1: edgeChain
    m_drawImages = TRUE;
    Invalidate();
    }
    があるので

    そこで
    // TODO: この位置に command update UI ハンドラ用のコードを追加してください
    if(m_drawMode == 1){  pCmdUI->SetCheck(1) }// on
    else   {  pCmdUI->SetCheck(0) }// off
    としたのですが 変数が定義されていないとなります。
    まず この方向でよいでしょうか そして 定義として 共通には どうするのでしょうか?>
    2009年9月22日 12:10
  • void CAboutDlg::OnUpdateViewDrawImages(CCmdUI* pCmdUI) {
    // TODO: この位置に command update UI ハンドラ用のコードを追加してください
    pCmdUI->SetCheck(1) // on <-コピしたもの
    pCmdUI->SetCheck(0) // off <-コピしたもの
    }
    このままでは 2行目で構文エラになりました。言われるように If () then else 文が必要でしょうか?
    構文エラーは構文エラーです。
    if 制御構造を入れる・入れないとは全く関係ありません。

    本当に上記のままコピペされているのであれば、セミコロンが足りていません。
    そこで
    // TODO: この位置に command update UI ハンドラ用のコードを追加してください
    if(m_drawMode == 1){  pCmdUI->SetCheck(1) }// on
    else     pCmdUI->SetCheck(0) }// off
    としたのですが 変数が定義されていないとなります。
    まず この方向でよいでしょうか そして 定義として 共通には どうするのでしょうか?>
    そのやり方をするのであれば、pCmdUI は使えません。(OnUpdateViewDragImages の引数を OnViewDragImages で使えないことはお分かり頂ければと思います)
    このやり方は設定するときに状態を反映する手法ですが、UPDATE_COMMAND_UI は表示されるときに状態を反映する手法です。
    設定するときに状態を反映するのであれば、CheckMenuItem メソッド等を調べて下さい。

    ところで、今回の回答から、C++ 関する知識・経験に不安を覚えます。
    趣味で少しずつ触っているのであれば問題ないと思いますが、業務の一環であるのであれば(余計なお世話かもしれませんが)上司や研修担当者とよく報告・連絡・相談して下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月22日 13:12
    モデレータ

  • はい 知識不足です。と言って 相談などできる相手がいないので こちらを頼っていますので ぜひ よろしくおねがいします。

    > ClassWizard の メニュー ID に対応するメッセージとして UPDATE_COMMAND_UI に対するハンドラを追加して下さい。検索してみたところ、こちらのページが近いイメージでしょうか。
     
    コピ元は以下の如くでしたので セミコロンの欠落を見失いました。
    void CTEST00SDIView::OnUpdateMenu1(CCmdUI* pCmdUI)
     pCmdUI->SetCheck(1) // on
     pCmdUI->SetCheck(0) // off
    }
    セミコロンをつけて  コンパイラは通りました。


    さて
    >チェックを ON にすべきか、OFF にすべきかは自分で何らかのメンバー変数を使う等して条件分岐をする必要があります。

    そこで m_Switchを追加しました。以下になりました

    // CAboutDlg dialog used for App About
    class CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();
    // Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    CButton m_Switch;    // for 4.0 menu のDrawMode や FudeModeのCheck印のため
    //}}AFX_DATA

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    DDX_Control(pDX, IDOK, m_Switch); // for 4.0 menu のDrawMode や FudeModeのCheck印のため
    //}}AFX_DATA_MAP
    }

    その上で どのような分岐のコードを加えるのか おしえてください。

    あるいは 上の方法がだめなら
    CheckMenuItem   の方法をもうすこし 具体的におしえていただけませんか


    2009年9月22日 14:20
  • その上で どのような分岐のコードを加えるのか おしえてください。
    考えるのはご自身でお願いします。
    考えたことを説明して頂いた上で、「この部分だけが分からない」とするところにアドバイスはできるかもしれません。

    今の時点で抱いている感想としては、なぜ、CButton なのかが分かりません。どこかで状態を変更し、その状態を保持するだけなら BOOL で良いですよね。
    何か理由があってそうしているのであれば、それを説明してもらえないと伝わりません。

    あるいは 上の方法がだめなら
    CheckMenuItem   の方法をもうすこし 具体的におしえていただけませんか
    CMenu MFC CheckMenuItem 等をキーワードとして組み合わせて検索し、その結果を吟味し、必要に応じてさらに絞り込んだり、新たなキーワードで検索し直したりして調べて下さい。
    (自分である程度とっかかりを得られるようになって下さい)


    正直なところ、フォーラムベースで事細かに教えることはできません。
    23 日で連休も終わりますし、その後もこの調子だと、私は回答できませんのであしからずご了承下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月22日 15:19
    モデレータ
  • >なぜ、CButton なのかが分かりません。その状態を保持するだけなら BOOL で良いですよね。

    BOOL m_Switch;    // for 4.0 menu のDrawMode や FudeModeのCheck印のため
    としたら
    \Kolam C++\KolamDesigner.cpp(125) : error C2664: 'DDX_Control' : 3 番目の引数を 'int' から 'class CWnd &' に変換できません。 (新しい機能 ; ヘルプを参照)
            'const' に対してではない参照は 非 lvalue へバインドできません。

    とエラーになりました。
    以下現状です。

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    DDX_Control(pDX, IDOK, m_Switch);
    // for 4.0 menu のDrawMode や FudeModeのCheck印のため
    //}}AFX_DATA_MAP
    }

    void CAboutDlg::OnUpdateViewDrawImages(CCmdUI* pCmdUI) 
    {
    // TODO: この位置に command update UI ハンドラ用のコードを追加してください
    //エラになるのではずし
    // if( m_Switch == 1) pCmdUI->SetCheck(1); // on
    // else pCmdUI->SetCheck(0); // off
     
    }

    void CAboutDlg::OnUpdateViewDrawFude(CCmdUI* pCmdUI) 
    {
    // TODO: この位置に command update UI ハンドラ用のコードを追加してください
    // if( m_Switch == 1) pCmdUI->SetCheck(1); // on
    // else pCmdUI->SetCheck(0); // off
    }
    2009年9月26日 8:05

  • // ChildView.h : interface of the CChildView class
     BOOL m_drawMode; // drawing mode 0:KoMa,1:EdgeChain 
     BOOL m_smoothmod; //index 0: for smoothmode of normal or 1: for bourder tracing
    で状態変化のIndex変数がすでにありました。
    それをつかってみます。

    2009年9月26日 8:18
  • \Kolam C++\KolamDesigner.cpp(125) : error C2664: 'DDX_Control' : 3 番目の引数を 'int' から 'class CWnd &' に変換できません。 (新しい機能 ; ヘルプを参照) nbsp;       'const' に対してではない参照は 非 lvalue へバインドできません。

    とエラーになりました。
    そのエラーが出るのは当然です。
    なぜかは、DDX が何をするものかきちんと調べて下さい。

    適当に書き換えたら通るなんてことはないので、コードの意味を少しずつでも理解して下さい。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年9月26日 12:06
    モデレータ
  • フォーラムオペレーターの高橋春樹です。

    Azuleanさん、いつもお世話になっております。
    沢山のアドバイスを投稿して頂き、ありがとうございました。

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

    Azuleanさんからアドバイスを頂いたと思うのですが、その後如何でしょうか?
    今回Azuleanさんから投稿が、有用なアドバイスだと思いましたので、
    勝手ながら、回答マークを付けさせて頂きました。
    もし、何かしら疑問点がありましたら、詳しい状況をお伝えして頂ければと思います。

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


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