Есть задачка - взять 24-битные битмапы для тулбара и создать на их основе такие же, но в disabled варианте. Причем, эта функция должна отработать ДО ТОГО как приложение откроет главное окно. Я решил сделать нечто а-ля LoadImage, полистал MSDN и написал следующее:
static HBITMAP LoadGrayedImage(HINSTANCE hinst, LPCTSTR lpszName, UINT uType, int cxDesired, int cyDesired, UINT fuLoad) {
HDC dcGrayed, dcDisp;
HBITMAP bmGrayed;
HBITMAP bmSrc;
HGDIOBJ* oldGrayed;
// Create in-memory bitmap to draw the grayed image
dcDisp = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
dcGrayed = CreateCompatibleDC( dcDisp );
bmGrayed = CreateCompatibleBitmap(dcGrayed, cxDesired, cyDesired);
// Load image resource
bmSrc = (HBITMAP)LoadImage(hinst, lpszName, uType, cxDesired, cyDesired, fuLoad);
oldGrayed = SelectObject(dcGrayed, bmGrayed);
// Draw embossed image (???)
DrawState(dcGrayed, (HBRUSH)NULL, NULL, (LPARAM)bmSrc, (WPARAM)NULL, 0, 0, 0, 0, DST_BITMAP | DSS_DISABLED);
// Deinitialize graphic contexts
SelectObject( dcGrayed, oldGrayed );
DeleteDC( dcGrayed );
DeleteDC( dcDisp );
DeleteObject( bmSrc );
return bmGrayed;
}
---
Так вот, в результате я имею вместо embossed image нечто в стиле "Черный квадрат Малевича". Долго я медитировал над этой функцией и пришел к выводу, что CreateCompatible... создают мне монохромный битмап и, когда DrawState в него рисует, теряются все цвета. Вопрос: как это сделать правильно? (Создать в памяти полноцветный битмап).
|