2016-07-07 16 views
2

zuerst schreibe ich einige UINT als Farbe in UINT** framebuffer, dann erstellen Sie ein BITMAPINFO von CreateDIBSection, aber nach dem Ausführen des Programms das Fenster sind schwarz statt einiger Farbe ich eingestellt, was ist los?Wie schreibt man Farbdaten in BITMAPINFO mit CreateDIBSection?

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; 

und die Tiny3DDevice:

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; 
     } 
} 

, was falsch ist? Wie schreibe ich Daten in m_framebuffer? Irgendeine Idee?

+0

Setzen Sie nicht 'CreateCompatibleDC' und' SelectObject (memdc, s_hBitmap); 'in' WM_CREATE'. Lege es stattdessen in 'WM_PAINT' und befreie die Ressource am Ende. Die Art, wie Sie es haben, ist ein paar Mikrosekunden schneller, aber es ist falsch. –

Antwort

2

müssen Sie Code wie dieser

PVOID pv; 
if (s_hBitmap = CreateDIBSection(nullptr, (PBITMAPINFO)&bmphdr, DIB_RGB_COLORS, &pv, 0, 0)) 
{ 
    RtlFillMemoryUlong((PULONG)pv, bmphdr.biSizeImage, 0x3fbcefff); 
} 

Sie nicht pv brauchen zuzuteilen (pDevice.m_pFramebuffer in Ihrem Code), weil es in CreateDIBSection zugeordnet. Sie müssen es nur füllen. Dein Code von Tiny3DDevice ist komplett falsch und sinnlos. Verwendung statische Vars für s_hdcBackbuffer, etc - Alptraum

BITMAPINFOHEADER bmphdr = { 0 }; 

niemand versuchen Verwendung dieses :)?

BITMAPINFOHEADER bmphdr = { }; 
+0

aber ich möchte die Farbe ändern, indem ich m_pFramebuffer wie 'SetPixel' ändere, was soll ich tun? – zhangbaochong

+0

aber in welchem ​​Problem ?? oder fülle einfach pv (m_pFramebuffer) oder speichere diesen Zeiger für spätere dynamische Änderungen. Verstehst du meine Antwort? – RbMm

+0

Ja, es ist in Ordnung, danke! Ich lösche den Code, der m_pFramebuffer zuweisen, und den Code wie folgt ändern: 'if (s_hBitmap = CreateDIBSection (nullptr, (PBITMAPINFO) & bmphdr, DIB_RGB_COLORS, \t \t \t reinterpret_cast (& pDevice.m_pFramebuffer), nullptr, 0)) \t \t { \t \t \t pDevice.Test(); \t \t} ' – zhangbaochong