简体   繁体   English

将HDC内容复制到HBITMAP

[英]Copy HDC content into HBITMAP

can anyone tell me why this code does not copy the HDC into the HBITMAP? 谁能告诉我为什么此代码不将HDC复制到HBITMAP? I want to have the output of StretchDIBits into a HBITMAP so I can BitBlt the HBITMAP when processing the WM_PAINT message. 我想将StretchDIBits的输出转换成HBITMAP,以便在处理WM_PAINT消息时可以BitBlt HBITMAP。

HDC myMemHDC = CreateCompatibleDC(NULL);
SetStretchBltMode(myMemHDC, COLORONCOLOR);
StretchDIBits(myMemHDC, 0, 0, global_imagewidth, global_imageheight,
0, 0, FreeImage_GetWidth(global_dib), FreeImage_GetHeight(global_dib),
FreeImage_GetBits(global_dib), FreeImage_GetInfo(global_dib), DIB_RGB_COLORS, SRCCOPY);

HDC myMemHDC2 = CreateCompatibleDC(myMemHDC);
HBITMAP myhbitmap = CreateCompatibleBitmap(myMemHDC2, global_imagewidth, global_imageheight);

HGDIOBJ prevHBITMAP = SelectObject(myMemHDC2, myhbitmap);
BitBlt(myMemHDC2, 0, 0, global_imagewidth, global_imageheight, myMemHDC, 0, 0, SRCCOPY); 
SelectObject(myMemHDC2, prevHBITMAP);

if(global_hddb!=NULL)
{
    DeleteObject(global_hddb);
    global_hddb = myhbitmap;
}
DeleteDC(myMemHDC);
DeleteDC(myMemHDC2);

I think the problem is that the bitmap is selected out of the memory DC. 我认为问题是从内存DC中选择了位图。 The bitmap is the 'memory' of the memory DC, it has to stay selected. 位图是内存DC的“内存”,必须保持选中状态。

Define these members in the class or globally: 在类或全局中定义以下成员:

HDC myMemHDC;
HBITMAP myhbitmap;
HGDIOBJ prevHBITMAP;

Initialize: (App start) 初始化:(应用启动)

void Init()
{
    myMemHDC = CreateCompatibleDC(NULL);
    myhbitmap = CreateCompatibleBitmap(myMemHDC, global_imagewidth,
        global_imageheight);
    prevHBITMAP = SelectObject(myMemHDC, myhbitmap);

    SetStretchBltMode(myMemHDC, COLORONCOLOR);
    StretchDIBits(myMemHDC, 0, 0, global_imagewidth, global_imageheight,
        0, 0, FreeImage_GetWidth(global_dib), FreeImage_GetHeight(global_dib),
        FreeImage_GetBits(global_dib), FreeImage_GetInfo(global_dib),
        DIB_RGB_COLORS, SRCCOPY);
}

Destroy: (App exit) 销毁:(应用退出)

void Destroy()
{
    SelectObject(myMemHDC, prevHBITMAP);
    DeleteObject(myhbitmap);
    DeleteDC(myMemHDC);
}

WM_PAINT: WM_PAINT:

BitBlt(paintDC, 0, 0, global_imagewidth, global_imageheight, myMemHDC, 0, 0, SRCCOPY); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM