Страница 1 из 1

Мелочь, а очень нужная

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

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

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

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

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

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

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

Добавлено: 19 дек 2005, 18:46
Redcat
Спасибо за совет, я попробую.

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

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

Добавлено: 26 дек 2005, 17:52
Eugie
И обязательно ли это через 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;
  }

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