C++图片数据流显示在窗口上

#include "atlimage.h"
#include "gdiplus.h"
#pragma comment( lib, "gdiplus.lib" )

typedef struct _Cam_Display
{
    WORD        wWidth;
    WORD        wHeight;
    WORD        wX;
    WORD        wY;
    DWORD       hWnd;
}CAMDISP,*LPCAMDISP;

BOOL    CVS2010Image::ShowPicAtWin(LPVOID lpDispaly, const char*  imageData,int imageSize)
{
    BOOL bRet = FALSE;

    LPCAMDISP lpDis = (LPCAMDISP)lpDispaly;
    if(lpDis->hWnd==NULL)return FALSE;
    HWND hDisWnd = (HWND)lpDis->hWnd;

    HGLOBAL  hMem = GlobalAlloc(GMEM_MOVEABLE, 0x00400000);
    BYTE*    pMem = (BYTE*)GlobalLock(hMem);
    memcpy(pMem, imageData, imageSize);
    GlobalUnlock(hMem);

    IStream *pIStm;
    CImage image;

    if (CreateStreamOnHGlobal(hMem, TRUE, &pIStm) == S_OK)
    {
        if (SUCCEEDED(image.Load(pIStm)))
        {
            CRect imgRect;

            ::GetClientRect(hDisWnd, &imgRect);
            HDC hDC = ::GetDC(hDisWnd);

            ::SetStretchBltMode(hDC, HALFTONE);  // 防止颜色失真
            ::SetBrushOrgEx(hDC, 0, 0, NULL);

            if (hDC != NULL)
            {
                imgRect.left = lpDis->wX;
                imgRect.top = lpDis->wY;
                imgRect.right = lpDis->wX + lpDis->wWidth;
                imgRect.bottom = lpDis->wY + lpDis->wHeight;

                image.Draw(hDC, imgRect);
                ::ReleaseDC(hDisWnd,hDC);
            }
        }
        pIStm->Release();
    }

    GlobalFree(hMem);
    return true;

    return bRet;
}

你可能感兴趣的:(C++)