bool CBitmapInfo::LoadBitmap(CBitmap& Bmp) { ASSERT(Bmp.m_hObject == NULL); // must be uninitialized, else handle leaks bool retc = FALSE; HDC hDC = GetDC(NULL); Bmp.m_hObject = CreateCompatibleBitmap(hDC, m_Bmp.bmWidth, m_Bmp.bmHeight); BITMAPINFO bi; SetBitmapInfo(bi); if (SetDIBits(hDC, Bmp, 0, m_Bmp.bmHeight, m_Bmp.bmBits, &bi, DIB_RGB_COLORS)) retc = TRUE; ReleaseDC(NULL, hDC); return(retc); }
bool CBitmapInfo::StoreBitmap(CBitmap& Bmp) { if (!Bmp.GetBitmap(&m_Bmp)) return(FALSE); m_Bits.SetSize(m_Bmp.bmWidthBytes * m_Bmp.bmHeight); m_Bmp.bmBits = m_Bits.GetData(); bool retc = FALSE; HDC hDC = GetDC(NULL); BITMAPINFO bi; SetBitmapInfo(bi); if (GetDIBits(hDC, Bmp, 0, m_Bmp.bmHeight, m_Bmp.bmBits, &bi, DIB_RGB_COLORS)) retc = TRUE; ReleaseDC(NULL, hDC); return(retc); }
bool DIBitmap::Create(int w, int h, int d, RGBQUAD* pColorTable) { if (hMemDC != NULL || hBmp != NULL) { return false; // 既に出来てるよ } // メモリDC hMemDC = CreateCompatibleDC(NULL); if (hMemDC == NULL) { return false; } // BITMAPINFO設定 BITMAPINFO* pInfo; int biSize = sizeof(BITMAPINFO); int dCnt = GetBitmapColorCount(d); if (d <= 8) { // カラーテーブルあり biSize += sizeof(RGBQUAD) * (dCnt - 1); pInfo = (BITMAPINFO*)malloc(biSize); if (pInfo == NULL) { return false; } if (pColorTable == NULL) { // テーブルの指定が無いのでとりあえず真っ黒パレット for (int i = 0; i < dCnt; ++i) { pInfo->bmiColors[i].rgbRed = 0; pInfo->bmiColors[i].rgbGreen = 0; pInfo->bmiColors[i].rgbBlue = 0; pInfo->bmiColors[i].rgbReserved = 0; } } else { // テーブルをコピー for (int i = 0; i < dCnt; ++i) { pInfo->bmiColors[i].rgbRed = pColorTable[i].rgbRed; pInfo->bmiColors[i].rgbGreen = pColorTable[i].rgbGreen; pInfo->bmiColors[i].rgbBlue = pColorTable[i].rgbBlue; pInfo->bmiColors[i].rgbReserved = 0; } } } else { // カラーテーブル無し pInfo = (BITMAPINFO*)malloc(biSize); if (pInfo == NULL) { Release(); return false; } } SetBitmapInfo(pInfo, w, h, d); // DIBセクション作成 pBits = NULL; hBmp = CreateDIBSection(NULL, pInfo, DIB_RGB_COLORS, &pBits, NULL, 0); if (hBmp == NULL) { free(pInfo); Release(); return false; } free(pInfo); // 関連付け SelectObject(hMemDC, hBmp); this->w = w; this->h = h > 0 ? h : -h; this->d = d; return true; }