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

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Ответить
Redcat
Сообщения: 19
Зарегистрирован: 08 дек 2005, 18:48
Откуда: Russia

16 дек 2005, 20:54

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

Как профессионально решить такую проблему, подскажите, буду очеь признателен. :-))
0b0rm0t
Сообщения: 17
Зарегистрирован: 01 окт 2004, 22:02

17 дек 2005, 17:47

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

Либо ты сам будешь рисовать все, что у тебя на этой картинке, либо (если тебя волнует только цвет фона) попробуй прозрачность в картинке использовать. Еще вариант - вообще все цвета на окне вручную забить (например, все - картинки). Будет выглядеть довольно коряво, но зато везде одинаково.
Redcat
Сообщения: 19
Зарегистрирован: 08 дек 2005, 18:48
Откуда: Russia

18 дек 2005, 00:14

Да, для меня наилучшим вариантом было бы испоьзовать прозрачный фон. Но как это сделать для .bmp если вообще такое возможно?
И можно-ли вставить JPEG-картинку (там-то вроде можно играть с прозрачностью)?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

19 дек 2005, 14:08

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

1. Предварительно в картинке выделяешь какой-то цвет, как тот, который будет прозрачным.
1. Грузишь картинку программно и рисуешь её в memory контекст.
2. Берёшь из виндовских настроек цвет фона и заменяешь все пиксели выделенного ранее цвета (его либо придётся захаркодить, либо подразумевать прозрачным первый пиксел BMP-хи).
3. Рисуешь картинку из memory контекста в device контекст.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Redcat
Сообщения: 19
Зарегистрирован: 08 дек 2005, 18:48
Откуда: Russia

19 дек 2005, 18:46

Спасибо за совет, я попробую.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

22 дек 2005, 12:43

Для подобных целей подходит функция TransparentBlt() - аналог StretchBlt(), но позволяет задавать "прозрачный" цвет при блоковом копировании.
Redcat
Сообщения: 19
Зарегистрирован: 08 дек 2005, 18:48
Откуда: Russia

26 дек 2005, 16:40

Я гружу картинку программно.
У меня не получается вывести картинку на экран. Какую функцию использовать? Пробовал BitBlt - не получается. И обязательно ли это через memory context делать?
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

26 дек 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
Сообщения: 19
Зарегистрирован: 08 дек 2005, 18:48
Откуда: Russia

26 дек 2005, 23:30

Eugie, благодарю. Наконец-то заработало!!!!
Ответить