Мелочь, а очень нужная
Модераторы: Duncon, Hawk, Romeo, Eugie
Народ, у меня такая ситуация: есть окно диалога с пользователем стандартного серого цвета, есть картинка .bmp (надпись на сером фоне), которую нужно присобачить на этот диалог. Но беда в том, что картинка - есть картинка, она фиксирована, а при работе приложения под разными виндами, цвет окна диалога меняется от винды к винде (оттенки сергого разные) и сразу бросается в глаза разница м/д фоном картинки и цветом диалога - выглядит некрасиво.
Вы скажете - сделай варианты картинок для всех версий винды, но как тогда динамически вставлять картинку в зависимости от типа винды или что делать когда пользователь меняет стиль окон в ХР.
Как профессионально решить такую проблему, подскажите, буду очеь признателен. :-))
Вы скажете - сделай варианты картинок для всех версий винды, но как тогда динамически вставлять картинку в зависимости от типа винды или что делать когда пользователь меняет стиль окон в ХР.
Как профессионально решить такую проблему, подскажите, буду очеь признателен. :-))
С картинкой - не выйдет. Ибо цвета в венде зависят не столько от ее версии, сколько от темы, настроек оформления и прочего. Даже если сделать картинки под все стандартные темы (что уже дофига), все равно будут проблемы с любителями копаться в настройках (проги типа WindowBlinds довольно популярны).
Либо ты сам будешь рисовать все, что у тебя на этой картинке, либо (если тебя волнует только цвет фона) попробуй прозрачность в картинке использовать. Еще вариант - вообще все цвета на окне вручную забить (например, все - картинки). Будет выглядеть довольно коряво, но зато везде одинаково.
Либо ты сам будешь рисовать все, что у тебя на этой картинке, либо (если тебя волнует только цвет фона) попробуй прозрачность в картинке использовать. Еще вариант - вообще все цвета на окне вручную забить (например, все - картинки). Будет выглядеть довольно коряво, но зато везде одинаково.
Да, для меня наилучшим вариантом было бы испоьзовать прозрачный фон. Но как это сделать для .bmp если вообще такое возможно?
И можно-ли вставить JPEG-картинку (там-то вроде можно играть с прозрачностью)?
И можно-ли вставить JPEG-картинку (там-то вроде можно играть с прозрачностью)?
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Для того, чтобы вставить JPG, придётся раздобыть библиотечку для загрузки JPG из файла. К тому же JPG ничем не лучше BMP, исключая размеры (BMP - некомпрессированная). Это во-первых. А во-вторых никаких готовых механизмов выставления прозрачного фона для вставляемой на форму картинки не существует (или я их просто не знаю). Предлагаю такой выход.
1. Предварительно в картинке выделяешь какой-то цвет, как тот, который будет прозрачным.
1. Грузишь картинку программно и рисуешь её в memory контекст.
2. Берёшь из виндовских настроек цвет фона и заменяешь все пиксели выделенного ранее цвета (его либо придётся захаркодить, либо подразумевать прозрачным первый пиксел BMP-хи).
3. Рисуешь картинку из memory контекста в device контекст.
1. Предварительно в картинке выделяешь какой-то цвет, как тот, который будет прозрачным.
1. Грузишь картинку программно и рисуешь её в memory контекст.
2. Берёшь из виндовских настроек цвет фона и заменяешь все пиксели выделенного ранее цвета (его либо придётся захаркодить, либо подразумевать прозрачным первый пиксел BMP-хи).
3. Рисуешь картинку из memory контекста в device контекст.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Спасибо за совет, я попробую.
Для подобных целей подходит функция TransparentBlt() - аналог StretchBlt(), но позволяет задавать "прозрачный" цвет при блоковом копировании.
Я гружу картинку программно.
У меня не получается вывести картинку на экран. Какую функцию использовать? Пробовал BitBlt - не получается. И обязательно ли это через memory context делать?
У меня не получается вывести картинку на экран. Какую функцию использовать? Пробовал BitBlt - не получается. И обязательно ли это через memory context делать?
Да, битмапы рисуются поблоковым копированием с одного DC (контекст устройства) на другой, в данном случае - оконный.И обязательно ли это через memory context делать?
Примерно так в твоем случае:
Код: Выделить всё
// В обработчике WM_PAINT:
case WM_PAINT:
{
// Загружаем bitmap из ресурсов своего приложения или dll
hbmp = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BITMAP1));
// Определяем его размеры с помощью структуры BITMAP
BITMAP bm;
GetObject(hbmp, sizeof(BITMAP), &bm);
nWidth = bm.bmWidth;
nHeight = bm.bmHeight;
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps); // Добываем контекст устройства, связанный с окном
hMemDC = CreateCompatibleDC(hdc); // Создаем контекст в памяти, совместимый с hdc
SelectObject(hMemDC, hbmp); // Выбираем bitmap в этот контекст
// Рисуем
TransparentBlt(
hdc, 0, 0, nWidth, nHeight, // Куда
hMemDC, 0, 0, nWidth, nHeight,// Откуда
SRCCOPY, // Как
GetSysColor(COLOR_3DFACE) // "Прозрачный" цвет
);
...
// Освобождаем все ресурсы
EndPaint(hWnd, &ps); // Освобождаем лимитированный ресурс системы
return 0;
}
Eugie, благодарю. Наконец-то заработало!!!!