動的DLLから追加するDocument Viewの注意点

プラグインを作っていて、解決方法がわからなかったものや悩んだことをメモ

ビューの登録

ビューを動的DLLから利用する場合、結構問題が出てきます。
とりあえず問題点の羅列 とりあえずはこんなところ。

UPDATE_COMMAND_UIが効かない

最初はリソースIDの数値かと思ったんですが、どうやら関係ない模様
調査中・・・

ON_COMMANDの処理をCFrameWnd系で実装しても有効にならない(CViewならOK)

関連付けられたコマンドIDが行かない模様。CViewに処理を実装すれば問題なく動作する。

作り方を間違えると、Viewが生成されない

フレームだけできてビューがない状態になったりします。
作成方法1
    CCreateContext context;
    memset(&context, 0, sizeof(CCreateContext));

    g_pDocTemp = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CxxDocument),
        RUNTIME_CLASS(CxxFrame),
        RUNTIME_CLASS(CxxView));
    context.m_pNewDocTemplate = g_pDocTemp;
    
    CWnd *pParent = CWnd::FromHandle(hParentWnd);
    CDocument *pDoc = g_pDocTemp->CreateNewDocument();
    if(!pDoc->OnNewDocument()){
        return NULL;
    }
    CxxFrame *pFrame = (CxxFrame*)g_pDocTemp->CreateNewFrame(pDoc, NULL);

作成方法2
    CCreateContext context;
    memset(&context, 0, sizeof(CCreateContext));
    context.m_pNewViewClass = RUNTIME_CLASS(CxxxView);
    g_pViewClass = context.m_pNewViewClass;

    pFrame = static_cast< CxxFrameWnd* >( RUNTIME_CLASS(CxxxFrameWnd)->CreateObject() );
    BOOL bCreate = pFrame->Create( NULL,                        //Windows クラス名
                                   NULL,                        //ウィンドウ名
                                   0,                           //ウィンドウスタイル
                                   CFrameWnd::rectDefault,      //ウィンドウの位置とサイズ
                                   NULL,                        //親ウィンドウ
                                   NULL,                        //メニュー リソース
                                   0,                           //拡張スタイル
                                   &context);                   //CCreateContext 構造体のポインタ
方法2はどこかのサイトを参考にしたけどどこだか忘れた。
方法1はなぜか、終了時にASSERTが発生する。
メニューのハンドルが原因らしいが良く分からん。
2005.11.29リソースにメニューをダミーで作っておくと解決する

ドキュメントは自分で新規作成の処理を呼び出す必要がある。

上の作成方法1のような方法の場合は、自力でドキュメントを新規作成しましょう。

ツールバーがある場合、ツールチップが出ない

調査中・・・
多分、リソースIDが絡んでる。

アクセラレータキーが効かない

調査中・・・
多分、リソースIDが絡んでる。