首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用CreateDIBSection在BITMAPINFO中写入颜色数据?

如何用CreateDIBSection在BITMAPINFO中写入颜色数据?
EN

Stack Overflow用户
提问于 2016-07-07 15:31:35
回答 0查看 510关注 0票数 2

首先我用UINT** framebuffer写了一些UINT作为颜色,然后用CreateDIBSection创建了一个BITMAPINFO,但是运行程序后窗口是黑色的而不是我设置的一些颜色,有什么问题吗?

代码语言:javascript
复制
 PAINTSTRUCT ps;
        HDC hdc;

    static int s_widthClient, s_heightClient;   
    static BITMAPINFO s_bitmapInfo;
    static HDC s_hdcBackbuffer;     
    static HBITMAP s_hBitmap;
    static HBITMAP s_hOldBitmap;
    static void* s_pData;           

    switch (message)
    {
    case WM_CREATE:
    {

        RECT rc;
        GetClientRect(hWnd, &rc);
        s_widthClient = rc.right - rc.left;
        s_heightClient = rc.bottom - rc.top;

        Tiny3DDevice pDevice(s_widthClient, s_heightClient, s_pData);
        pDevice.Test();

        BITMAPINFOHEADER bmphdr = { 0 };
        bmphdr.biSize = sizeof(BITMAPINFOHEADER);
        bmphdr.biWidth = s_widthClient;
        bmphdr.biHeight = -s_heightClient;
        bmphdr.biPlanes = 1;
        bmphdr.biBitCount = 32;
        bmphdr.biSizeImage = s_heightClient * s_widthClient * 4;

        s_hdcBackbuffer = CreateCompatibleDC(nullptr);

        HDC hdc = GetDC(hWnd);
        //s_hBitmap = CreateCompatibleBitmap(hdc, s_widthClient, s_heightClient);
        s_hBitmap = CreateDIBSection(nullptr, (PBITMAPINFO)&bmphdr, DIB_RGB_COLORS,
            reinterpret_cast<void**>(&pDevice.m_pFramebuffer), nullptr, 0);

        s_hOldBitmap = (HBITMAP)SelectObject(s_hdcBackbuffer, s_hBitmap);
        ReleaseDC(hWnd, hdc);
    }
    break;
    case WM_PAINT:
    {
        hdc = BeginPaint(hWnd, &ps);
        //BitBlt(s_hdcBackbuffer, 0, 0, s_widthClient, s_heightClient, nullptr, 0, 0, WHITENESS);
        ////draw text
        //SetTextColor(s_hdcBackbuffer, RGB(0, 0, 0));
        //SetBkMode(s_hdcBackbuffer, TRANSPARENT);
        //TextOut(s_hdcBackbuffer, 0, 5, text.c_str(), text.size());

        BitBlt(ps.hdc, 0, 0, s_widthClient, s_heightClient, s_hdcBackbuffer, 0, 0, SRCCOPY);
        EndPaint(hWnd, &ps);
    }
        break;

和Tiny3DDevice:

代码语言:javascript
复制
    class Tiny3DDevice
    {
    public:
        Tiny3DDevice(int width, int height, void *fb);
        ~Tiny3DDevice();
    public:
        void Test();    
    public:
        int m_width;
        int m_height;
        UINT** m_pFramebuffer;
    };
Tiny3DDevice::Tiny3DDevice(int width, int height, void *fb)
{
    m_width = width;
    m_height = height;
    m_pFramebuffer = new UINT*[width];
    for (int i = 0; i < width; ++i)
    {
        m_pFramebuffer[i] = new UINT[height];
    }
}

void Tiny3DDevice::Test()
{
    ZCFLOAT3 color(0.5f, 0.5f, 0.5f);
    for (int i = 0; i < m_width; ++i)
        for (int j = 0; j < m_height; ++j)
        {
            //m_pFramebuffer[i][j] = MathUtil::ColorToUINT(color);
            m_pFramebuffer[i][j] = 0x3fbcefff;
        }
}

出什么问题了?我应该如何在m_framebuffer?中写入数据?

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38239841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档