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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Мелочь, а очень нужная

Redcat » 26 дек 2005, 23:30

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

Eugie » 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 » 26 дек 2005, 16:40

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

Eugie » 22 дек 2005, 12:43

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

Redcat » 19 дек 2005, 18:46

Спасибо за совет, я попробую.

Romeo » 19 дек 2005, 14:08

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

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

Redcat » 18 дек 2005, 00:14

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

0b0rm0t » 17 дек 2005, 17:47

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

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

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

Redcat » 16 дек 2005, 20:54

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

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

Вернуться к началу