

VC++/MFCにて、ダイアログベースアプリの環境下で  
グラフ描画を高速に行うためにメモリDCを導入しています。  
このダイアログはサイズ変更枠でサイズを変更できるようにしています。  
#考え方が間違っているのかもしれませんが...  
WM_SIZEメッセージにて、メモリDCを破棄後、再度、新しいウィンドウサイズに  
対して、メモリDCを取得することで、リサイズ対応をしています。

が、アプリが稼働している中で、メモリDCの破棄部分で不正終了してしまう場合  
があり、困惑しております。  
メモリDCは5枚分作成し、重ねて画面に転送しています。

どなたか、ご指導をいただければ幸いです。  
よろしくお願いします。


CC BY-SA 4.0
2021-11-04T00:55:40.933
83416
2021-11-04T08:36:10.937
2021-11-04T02:44:18.917
3060
48939
question
mfc visual-c++
VC++/MFC メモリDCの破棄時に不正終了してしまう場合がある


まず、対象ソースコードを示した方が早期に解決できると考えられます。強く推薦します。

さて、自分もメモリーDCを使用していますが、特に問題は出ていません。  
WM_SIZEにも対応しており以下の仮想コードの様な手順で処理しています。  
ご自分のコードと比べれば瑕疵が発見できるかもしれません。  
特に、選択中のビットマップを外さないと、破棄できないため色々とまずいことが起こります。

[code]

    class MyMEMDC : public CDC
    {
        CBitMap     m_BitMap;           // メインのビットマップ
        CDC *       m_OwnerDC;          // 元になったDC
        short       m_Bmp_dmmy_data[ 16];       // 選択外し用
        CBitmap     m_Bmp_dmmy;                 // 選択外し用
    MyMEMDC()
    {
        //ダミーのビットマップ
        m_Bmp_dmmy.CreateBitmap( 1, 1, 1, 1, &m_Bmp_dmmy_data);
    }
    
    void    ReSize(
        CWnd *          ex_owner,
        const CRect &   ex_rc)
        {
            CDC::SelectObject( m_Bmp_dmmy);     // 現在選択中のメインのビットマップを外します。
            m_BitMap.DeleteObject();            // メインのビットマップを破棄します。
            DeleteDC();                         // メモリーDCを破棄します
            m_OwnerDC = ex_owner->GetDC();      // オーナーHWNDのDCを取得します
            CreateCompatibleDC( m_OwnerDC);     // メモリーDCを構築します
            m_BitMap.CreateCompatibleBitmap( m_OwnerDC, ex_rcの幅と高さ) // メインのビットマップを再作成します
            CDC::SelectObject( &m_BitMap);      // 再構築したBitMapを選択しなおします。
        }
    };
    
[/code]

尚、リサイズ時の排他処理(外部タイミングでの描画)などが必要な場合があるかと思います。


CC BY-SA 4.0
2021-11-04T08:36:10.937
83426
2021-11-04T08:36:10.937
3793
83416
answer