Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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;
}