Prev: LVIR_BOUNDS
Next: Triggering accelerators by mistake
From: JoeC on 21 Dec 2009 13:07 I have created some monochrome bitmaps and and drawing program. I am trying to create a bitmap from scratch. I am trying to write my own pixel and color data. Then I need to create the bitmap and then use the select the bitmap with hbitmap then bit it over to the graphics space. What am I doing wrong or what step am I missing or have wrong. I have the following that creates a blank bitmap. struct BITMAP_INFO{ BITMAPFILEHEADER bmHead; RGBQUAD bmColor[16]; }; BITMAP_INFO bfo; HBITMAP hbitmap; RGBQUAD palet[16]; BYTE cdata[] = {0xff, 0xff, 0xff, //... // Palette data int num = 16; BYTE * pdata = &cdata[0]; int datasz = 3*num; int count = 0; RGBQUAD palette[16]; ZeroMemory(bfo.bmColor, sizeof(palette)); while(count < datasz/num ){ bfo.bmColor[count].rgbRed = *pdata++; bfo.bmColor[count].rgbBlue = *pdata++; bfo.bmColor[count].rgbGreen = *pdata++; bfo.bmColor[count].rgbReserved = 0; count++; } BYTE data[] = {0xff,0xff,0x80,0x01,1,1,1,1,1,1,1,1,1,1,1,1, //... //Bit data for the bitmap PBYTE BitmapImage = (BYTE*)LockResource; BITMAPINFO * BitmapInfo = (BITMAPINFO*)(new BITMAP_INFO); if (BitmapInfo == NULL){ MessageBox(NULL, "Bitmap Error", "Info", MB_OK); return; hbitmap= CreateDIBSection( hdc, BitmapInfo, DIB_RGB_COLORS, &pbits, NULL, 0 ); HDC hMem = CreateCompatibleDC(hdc); UINT cColors = GetDIBColorTable(hMem, 0, 16, bfo.bmColor); SetDIBColorTable(hMem, 0, cColors, bfo.bmColor); HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMem, hbitmap); SelectObject(hMem, hOldBitmap); BitBlt(hdc, 100, 150, 16, 16 , hMem, 0, 0, SRCCOPY); DeleteDC(hMem); ReleaseDC(hwnd, hMem);
From: JoeC on 21 Dec 2009 16:58 I did some more research and changes. The bitmap seems have been created now but it is just a blank white box. I am trying to put some data into the bitmap so I can start to understand how it creates pictures. What can I do to make this work correctly? void paint(HDC hdc, HWND hwnd){ BITMAP_INFO bfo; HBITMAP hbitmap; int dwn, acc = 16; int accLoc, dnLoc = 100; HDC hDc = CreateCompatibleDC(hdc); memset(&bfo, 0, sizeof(bfo)); RGBQUAD palet[16]; BYTE cdata[] = {0xff, 0xff, 0xff, 0,0,0, 0xff,0,0, 0,0xff,0, 0,0,0xff, 0xf0,0xf0,0xf0, 0xf0,0xf0,0, 0xf0,0,0xf0, 0,0xf0,0xf0, 0xff,0,0xff, 0x3c,0x3c,0, 0x3c,0,0x3c, 0,0x3c,0x3c, 0xf0,0xf0,0, 0xf0,0,0xf0, 0,0xf0,0xf0}; int num = 16; BYTE * pdata = &cdata[0]; int datasz = 3*num; int count = 0; RGBQUAD palette[16]; ZeroMemory(bfo.bmColor, sizeof(palette)); while(count < datasz/num ){ bfo.bmColor[count].rgbRed = *pdata++; bfo.bmColor[count].rgbBlue = *pdata++; bfo.bmColor[count].rgbGreen = *pdata++; bfo.bmColor[count].rgbReserved = 0; count++; } BYTE data[] = {1,1,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1, 1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1, 1,1,2,2,3,3,3,2,2,3,3,3,2,2,1,1, 1,1,2,2,3,3,3,4,4,3,3,3,2,2,1,1, 1,1,2,2,3,3,3,4,4,3,3,3,2,2,1,1, 1,1,2,2,0,0,0,0,0,0,0,0,2,2,1,1, 1,1,2,2,0,0,0,0,0,0,0,0,2,2,1,1, 1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1, 1,1,2,2,0,0,0,0,0,0,0,0,2,2,1,1, 1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1, 1,1,2,2,3,3,3,2,2,3,3,3,2,2,1,1, 1,1,2,2,3,3,3,4,4,3,3,3,2,2,1,1, 1,1,2,2,3,3,3,4,4,3,3,3,2,2,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; BITMAPINFO * BitmapInfo = (BITMAPINFO*)(new BITMAP_INFO); if (BitmapInfo == NULL){ MessageBox(NULL, "Bitmap Error", "Info", MB_OK); return; } for(int lp = 0 ; lp != 16; lp++){ BitmapInfo->bmiColors[lp].rgbBlue = bfo.bmColor[lp].rgbBlue; BitmapInfo->bmiColors[lp].rgbGreen= bfo.bmColor[lp].rgbGreen; BitmapInfo->bmiColors[lp].rgbRed = bfo.bmColor[lp].rgbRed; BitmapInfo->bmiColors[lp].rgbReserved = 0; } BitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); BitmapInfo->bmiHeader.biBitCount = 4; BitmapInfo->bmiHeader.biHeight = 16; BitmapInfo->bmiHeader.biWidth = 16; BitmapInfo->bmiHeader.biCompression = BI_RGB; BitmapInfo->bmiHeader.biPlanes = 1; hbitmap = CreateDIBSection(hDc, BitmapInfo, DIB_RGB_COLORS, (PVOID*)&data, NULL, 0); SelectObject(hDc, hbitmap); GdiFlush(); StretchBlt(hdc, 250,250,16*5,16*5,hDc,0,0,16,16,MERGECOPY); DeleteDC(hDc); ReleaseDC(hwnd, hDc); }
From: Christian ASTOR on 22 Dec 2009 10:10 On 21 déc, 22:58, JoeC <enki...(a)yahoo.com> wrote: > I did some more research and changes. The bitmap seems have been > created now but it is just a blank white box. I am trying to put some > data into the bitmap so I can start to understand how it creates > pictures. What can I do to make this work correctly? You must play with RGB values... Just for an example, to create a red grid with CreateDIBSection()=> HBITMAP hBitmapOld; HDC hDC = GetDC(NULL); HDC hDCMem = CreateCompatibleDC(hDC); int nX = 800, nY = 600; BITMAPINFO bi = {0}; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = nX; bi.bmiHeader.biHeight = nY; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; BYTE *pbBitmap; HBITMAP hBitmap = CreateDIBSection(hDCMem, &bi, DIB_RGB_COLORS, (void**)&pbBitmap, NULL, 0); if (hBitmap) { hBitmapOld = (HBITMAP)SelectObject(hDCMem, hBitmap); RGBQUAD *pRGB; LONG nPixels; for (pRGB = (RGBQUAD *)pbBitmap, nPixels = nX * nY; nPixels >= 0; + +pRGB, --nPixels) { if ( nPixels%10 == 0 || (nPixels/800) %10 == 0) pRGB->rgbRed = 255; } BitBlt(hDC, 0, 0, nX, nY, hDCMem, 0, 0, SRCCOPY); SelectObject(hDCMem, hBitmapOld); DeleteObject(hBitmap); } DeleteDC(hDCMem); ReleaseDC(NULL, hDC);
From: Friedel Jantzen on 22 Dec 2009 10:15 > > hbitmap = CreateDIBSection(hDc, BitmapInfo, DIB_RGB_COLORS, > (PVOID*)&data, NULL, 0); http://msdn.microsoft.com/en-us/library/dd183494(VS.85).aspx ppvBits [out] A pointer to a variable that receives a pointer to the location of the DIB bit values. void *ppvBits; hbitmap = CreateDIBSection(hDc, BitmapInfo, DIB_RGB_COLORS, &ppvBits, NULL, 0); CopyMemory(ppvBits, data, dataSize); hth, Friedel
From: JoeC on 22 Dec 2009 11:16 On Dec 22, 9:15 am, Friedel Jantzen <nospam_...(a)freenet.de> wrote: > > hbitmap = CreateDIBSection(hDc, BitmapInfo, DIB_RGB_COLORS, > > (PVOID*)&data, NULL, 0); > > http://msdn.microsoft.com/en-us/library/dd183494(VS.85).aspx > ppvBits [out] > A pointer to a variable that receives a pointer to the location of the > DIB bit values. > > void *ppvBits; > hbitmap = CreateDIBSection(hDc, BitmapInfo, DIB_RGB_COLORS, > &ppvBits, NULL, 0); > CopyMemory(ppvBits, data, dataSize); > > hth, > Friedel Thanks, I did some research to get that far and it seems those few changes have made the bitmap work. I just I have to manipulate the data to see what I can do.
|
Pages: 1 Prev: LVIR_BOUNDS Next: Triggering accelerators by mistake |