PDA

Просмотр полной версии : Мелочь, а очень нужная



Redcat
16.12.2005, 20:54
Народ, у меня такая ситуация: есть окно диалога с пользователем стандартного серого цвета, есть картинка .bmp (надпись на сером фоне), которую нужно присобачить на этот диалог. Но беда в том, что картинка - есть картинка, она фиксирована, а при работе приложения под разными виндами, цвет окна диалога меняется от винды к винде (оттенки сергого разные) и сразу бросается в глаза разница м/д фоном картинки и цветом диалога - выглядит некрасиво.
Вы скажете - сделай варианты картинок для всех версий винды, но как тогда динамически вставлять картинку в зависимости от типа винды или что делать когда пользователь меняет стиль окон в ХР.

Как профессионально решить такую проблему, подскажите, буду очеь признателен. :-))

0b0rm0t
17.12.2005, 17:47
С картинкой - не выйдет. Ибо цвета в венде зависят не столько от ее версии, сколько от темы, настроек оформления и прочего. Даже если сделать картинки под все стандартные темы (что уже дофига), все равно будут проблемы с любителями копаться в настройках (проги типа WindowBlinds довольно популярны).

Либо ты сам будешь рисовать все, что у тебя на этой картинке, либо (если тебя волнует только цвет фона) попробуй прозрачность в картинке использовать. Еще вариант - вообще все цвета на окне вручную забить (например, все - картинки). Будет выглядеть довольно коряво, но зато везде одинаково.

Redcat
18.12.2005, 00:14
Да, для меня наилучшим вариантом было бы испоьзовать прозрачный фон. Но как это сделать для .bmp если вообще такое возможно?
И можно-ли вставить JPEG-картинку (там-то вроде можно играть с прозрачностью)?

Romeo
19.12.2005, 14:08
Для того, чтобы вставить JPG, придётся раздобыть библиотечку для загрузки JPG из файла. К тому же JPG ничем не лучше BMP, исключая размеры (BMP - некомпрессированная). Это во-первых. А во-вторых никаких готовых механизмов выставления прозрачного фона для вставляемой на форму картинки не существует (или я их просто не знаю). Предлагаю такой выход.

1. Предварительно в картинке выделяешь какой-то цвет, как тот, который будет прозрачным.
1. Грузишь картинку программно и рисуешь её в memory контекст.
2. Берёшь из виндовских настроек цвет фона и заменяешь все пиксели выделенного ранее цвета (его либо придётся захаркодить, либо подразумевать прозрачным первый пиксел BMP-хи).
3. Рисуешь картинку из memory контекста в device контекст.

Redcat
19.12.2005, 18:46
Спасибо за совет, я попробую.

Eugie
22.12.2005, 12:43
Для подобных целей подходит функция TransparentBlt() - аналог StretchBlt(), но позволяет задавать "прозрачный" цвет при блоковом копировании.

Redcat
26.12.2005, 16:40
Я гружу картинку программно.
У меня не получается вывести картинку на экран. Какую функцию использовать? Пробовал BitBlt - не получается. И обязательно ли это через memory context делать?

Eugie
26.12.2005, 17:52
И обязательно ли это через memory context делать?

Да, битмапы рисуются поблоковым копированием с одного DC (контекст устройства) на другой, в данном случае - оконный.
Примерно так в твоем случае:


// В обработчике 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;
}

Redcat
26.12.2005, 23:30
Eugie, благодарю. Наконец-то заработало!!!!