Для установки картинки на кнопке ей посылается сообщение BM_SETIMAGE. При этом картинка рисуется со своим фоном, а хотелось бы, чтобы с фоном кнопки. Можно ли этого добиться для кнопки со стилем BS_BITMAP, а не BS_OWNERDRAW ? М.б. предварительно подправить фон самой картинки ?
Здравствуйте, Сергей М., Вы писали:
СМ>Для установки картинки на кнопке ей посылается сообщение BM_SETIMAGE. При этом картинка рисуется со своим фоном, а хотелось бы, чтобы с фоном кнопки. Можно ли этого добиться для кнопки со стилем BS_BITMAP, а не BS_OWNERDRAW ? М.б. предварительно подправить фон самой картинки ?
Можно. Ключевое слово — LR_MAP3DCOLORS
BOOL _XCTL_CALL Dialog_AssignButtonBitmap (HWND hDlg, UINT nID, HINSTANCE hInstance, UINT nBitmap)
{
// Загружаем катринку (с конвертацией цветов)
HBITMAP hBitmap = (HBITMAP) LoadImage (hInstance, MAKEINTRESOURCE (nBitmap),
IMAGE_BITMAP, 0, 0, LR_VGACOLOR | LR_LOADMAP3DCOLORS);
// Неудача - сваливаем (см. GetLastError)
if (!hBitmap) return FALSE;
// Устанавливаем картинку на кнопку
HBITMAP hPrev = (HBITMAP) SendDlgItemMessage (hDlg, nID, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hBitmap);
// Если картинка уже была - удаляем предыдущую
if (hPrev) DeleteObject (hPrev);
// Все хорошо
return TRUE;
} // Dialog_AssignButtonBitmap
Картинку рисуешь как обычно, но помнишь, что при загрузке некоторые цвета заменятся на текущие системные:
Темно-серый: RGB(128,128,128) -> COLOR_3DSHADOW
Серый: RGB(192,192,192) -> COLOR_3DFACE
Светло-серый: RGB(223,223,223) -> COLOR_3DLIGHT