none
開発中にMFCダイアログバーでツールバーのボタンを増やすたびに実行ファイル側からいちいち「カスタマイズ...」でリセットしていますが、そんなことしなくてもよいのでは?

    質問

  • MFCダイアログバーでツールバーのボタンを増やすたびに実行ファイル側からリセットしています。

    そうすることでレジストリーの影響でセパレーターがなかったりするのを修正できます。

    しかし、リリース後のアップデートでボタンを増やした場合などに、いちいちユーザーにリセットをお願いする必要は本来ないと思っています。

    メニューに項目やセパレーターを追加した場合なども含め、皆さんどう対応されてるんでしょうか?

    特にユーザーがショートカットキーのアサインを変えていた場合など気になります。

    知ってる方がいたら教えていただけませんか?

    よろしくお願いします。

    2017年10月5日 8:28

回答

  • リソース変更等の編集によってコントロール数やメニューが変更になった場合、
    また、ビューやペインのウインドウIDを変更した場合の直後、
    起動時にLoadState()すると誤った情報がメインにロードされてしまいます(落ちはしない様ですが)。

    こんな時、自分は regedit.exe を使って、対象のアプリケーション用のレジストリを削除してます。
    「登録した名称」全体、または、直下のworkspaceを削除してます。
    場所は一般には

    HKEY_CURRENT_USER\Software\「登録した名称」\workspace

    「登録した名称」は、主AppクラスのInitInstance()等で、
    SetRegistryKey( 「登録した名称」);
    していると思います。

    自分のアプリではカスタマイズは制限しているので、
    ユーザーによるカスタマイズの情報(レジストリ)に関しては、
    詳しくありません。あしからず。

    2017年10月5日 8:39
  • ありがとうございます。

    とりあえずメニューバーとツールバーの位置変更を禁止しました。

    また、起動時には必ずすべての設定をリセットするようにしました。

    ショートカットキーが登録できちゃうんですが、というよりもカスタマイズダイアログは表示されちゃうんですが、取説に一文入れておこうと思います。

    終了します。

    • 回答としてマーク kendji_t 2017年10月5日 9:05
    2017年10月5日 9:05

すべての返信

  • リソース変更等の編集によってコントロール数やメニューが変更になった場合、
    また、ビューやペインのウインドウIDを変更した場合の直後、
    起動時にLoadState()すると誤った情報がメインにロードされてしまいます(落ちはしない様ですが)。

    こんな時、自分は regedit.exe を使って、対象のアプリケーション用のレジストリを削除してます。
    「登録した名称」全体、または、直下のworkspaceを削除してます。
    場所は一般には

    HKEY_CURRENT_USER\Software\「登録した名称」\workspace

    「登録した名称」は、主AppクラスのInitInstance()等で、
    SetRegistryKey( 「登録した名称」);
    していると思います。

    自分のアプリではカスタマイズは制限しているので、
    ユーザーによるカスタマイズの情報(レジストリ)に関しては、
    詳しくありません。あしからず。

    2017年10月5日 8:39
  • ありがとうございます。

    とりあえずメニューバーとツールバーの位置変更を禁止しました。

    また、起動時には必ずすべての設定をリセットするようにしました。

    ショートカットキーが登録できちゃうんですが、というよりもカスタマイズダイアログは表示されちゃうんですが、取説に一文入れておこうと思います。

    終了します。

    • 回答としてマーク kendji_t 2017年10月5日 9:05
    2017年10月5日 9:05
  • ダイアログの表示を止められました。

    基本は CMainFrame で

    m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);

    の先頭引数を FALSE にすればツールバー右端のボタンがなくなります。

    ツールバーやメニューバーのコンテキストメニュー表示抑制は CMFCToolBar、CMFCMenuBar とも仮想関数になっている OnShowControlBarMenu を、

    virtual BOOL OnShowControlBarMenu(CPoint point) { return TRUE; }

    としてぶら下げ、CMainFrameのそれぞれを派生クラス名にしてやればOKでした。

    あと Alt+ドラッグでもボタン位置が変わるのは、たぶん

    EnableQuickCustomization(FALSE);

    が効いていると思います。

    OnCreateでウィンドウがインスタンスを持った後で食わせてやってください。

    ここを見た方、ということで。

    2017年10月5日 11:26