質問

たぶんこれは愚かな質問です。なぜ次のコードで作成されたDCを取得できないのかわかりません。

HBITMAP COcrDlg::LoadClippedBitmap(LPCTSTR pathName,UINT maxWidth,UINT maxHeight)
{
    HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, pathName, IMAGE_BITMAP, 0, 0,
                                  LR_LOADFROMFILE | LR_CREATEDIBSECTION);       
    if (!hBmp)
        return NULL;

    HDC hdc = (HDC)GetDC();
    HDC hdcMem = CreateCompatibleDC(hdc);
    if (!hdcMem)
    {
        DWORD err = GetLastError();
    }  
    ...
    ...
    ...

ビットマップHBMPは微細にロードされ、HDCには有効な値があります。しかし、CreateCompatibledC()への呼び出しは、nullポインターを返します。次に、getLasterRor()が0を返します!誰かがここで何が起こっているのか推測できますか?

PS:これの前に呼び出されるメモリの割り当てやGDIルーチンはありません...だから、メモリリークは除外されるべきだと思います。

役に立ちましたか?

解決

あなたはその結果を不適切にキャストしています GetDC()HDC. GetDC() ポインターをaに返します CDC 物体。

あなたが望むことをするために、あなたは次のいずれかをすることができます。最初の選択は、MFCが物事を行うのが好きな方法にもっと適合しますが、どちらもうまく機能します。

CDC *pDC = GetDC();

// Option 1
CDC memDC;
memDC.CreateCompatibleDC(pDC);

// Option 2
HDC hMemDC = CreateCompatibleDC((HDC)(*pDC));

オプション2は現在間違っているのと同じことをしないことに注意することが重要です。 CDC クラスには operator HDC() HDCに変換できるメンバーですが、これはポインターには適用されません。あなたは最初にそれを拒否する必要があります。

他のヒント

特定のデバイスコンテキストは、createcompatibledc()で動作しません。 DCはラスター操作をサポートする必要があります。 HDCをgetDeviceCaps()にフィードし、RasterCapsを確認できます。

しかし、あなたが呼んでいるGetDCはクラスの方法であり、私があなたが意図したと思ったCバインディングではなく、クラスの方法であることがわかります。ソープボックスには正しい答えがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top