Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: BitBtl - обьясните кто чем может...  (Прочитано 11682 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sandric
Wimdows SUX
Участник

ua
Offline Offline
Пол: Мужской
I hate myself and I wanna die


« : 25-11-2006 17:04 » 

Блин, люди помогите понять бедному человеку заоблачную функцию винапи BitBtl.
Не понятно следующее:
1. Как копировать с битмапа в битмап этой функцией, или с битмапа на форму (пример).
2. Как брать контекст битмапа, что такое контекст, и можна ли его у бмп взять...
3. Как сдеать так, что б пред.(не перерисов. битмап) сохранялся, и перерис. на след. шаге (ну это функц. последнего параметра bitblt).
Короче, вот пример рабочий:
//------------------------------------------------
Graphics::TBitmap *Bitmap=new Graphics::TBitmap;
HDC DC=GetDC(0);
try{
Bitmap->Height=Screen->Height;
Bitmap->Width=Screen->Width;
BitBlt(Bitmap->Canvas->Handle , 0, 0, Screen->Width,
Screen->Height,DC, 0, 0, SRCCOPY);
}
//--------------------------------------------
реализует вывод на канву части принт скрина.
А теперь вопрос...как её переделать под функц. копирования на канву битмапа, что был описан выше.У меня не получается:
//--------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap*  bp = new Graphics::TBitmap;
bp->LoadFromFile("C:\\back.bmp");
HDC     DC=GetDC(bp->Handle);//а так можна
HDC     nDC=CreateCompatibleDC(DC);//чего это значит...
BitBlt(Form1->Canvas->Handle,0,0,100,100,DC,0,0,SRCCOPY);
delete bp;
//ReleaseDC(0,DC);
}
в общем, кто эту функцию понял, помогите, а то в нете нормального примера не нарыл. Буду признателен. А черт его знает...
Записан

We hate love, we love hate...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 25-11-2006 17:28 » 

Смысл простой. Нужно иметь два контекста устройств. Как правило одно DC уже есть, это область, на которой ты хочеш рисовать. Второй контекст устройства нужно создать. Используют обычно функцию CreateCompatibleDC. Затем считываеш свой битмап с помощью функции  LoadBitmap. Переопределяешь во второй контексте Битмап с помощью функции SelectObject. И затем уже  рисуеш с помощью функции BitBlt со второго контекста в первый.

Почитай RTFM
BitBlt, CreateCompatibleDC, LoadBitmap, SelectObject.

Небольшой пример программы "Скрин Шот".
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sandric
Wimdows SUX
Участник

ua
Offline Offline
Пол: Мужской
I hate myself and I wanna die


« Ответ #2 : 25-11-2006 19:32 » 

Ну вот вроде так:
// вариант1:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HDC     hDc=GetDC(Form1->Canvas->Handle);//1 конт
HDC     hMemDc = CreateCompatibleDC(hDc);//2 конт
HBITMAP bp=LoadBitmap(NULL,"C:\\back.bmp");//считываю
SelectObject(hMemDc,bp);//переопр.
BitBlt(Form1->Canvas->Handle,0,0,24,24,hMemDc,0,0,SRCCOPY);//оно самое
}
// вариант2:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Graphics::TBitmap*   bp = new Graphics::TBitmap;
HDC     hDc=GetDC(Form1->Canvas->Handle);//1 конт
HDC     hMemDc = CreateCompatibleDC(hDc);//2 конт
bp->LoadFromFile("C:\\back.bmp");//считываю
SelectObject(hMemDc,bp);//переопр.
BitBlt(Form1->Canvas->Handle,0,0,24,24,hMemDc,0,0,SRCCOPY);//оно самое
}

Ни один ничё не выводит на канву.
Записан

We hate love, we love hate...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 26-11-2006 14:02 » 

Sandric, Это естественно Улыбаюсь
Код:
BitBlt(Form1->Canvas->Handle,0,0,24,24,hMemDc,0,0,SRCCOPY);
Ты куда собираешься рисовать? На Хэндл окна или в контекст рисования окна?
Второй вариант не верен. Так как HBITMAP это тип определенный в Виндовсе и виндовс знает как с ним работать. TBitmap этот тип винда не знает, и не будет с ним работать корректно.

Из твоего варианта можно сделать так. Кстати ресурсы системы ты должен в обязательном порядке освобождать. Иначе получиш большую течь ресурсов.
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HDC     hDc=GetDC(Form1->Canvas->Handle);//1 конт
HDC     hMemDc = CreateCompatibleDC(hDc);//2 конт
HBITMAP bp=LoadBitmap(NULL,"C:\\back.bmp");//считываю
HBITMAP OldBMP = SelectObject(hMemDc,bp); //переопр.
BitBlt(hDc,0,0,24,24,hMemDc,0,0,SRCCOPY);//оно самое
DeleteObject(SelectObject(hMemDc, OldBMP)); // Возрашаем старый битмап, И сразу убиваем
DeleteDC(hMemDC);
ReleaseDC(hDc);
}

Кстати меня гложут смутные сомнения насчет функции LoadBitmap. Насколько я понял из MSDN Эта функция читает картинку из ресурсов, а не из файла. Сейчас нету возможности проверить. Надо покопаться в своем архиве, вроде я делал когда-то чтение из файла.
« Последнее редактирование: 26-11-2006 14:27 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sandric
Wimdows SUX
Участник

ua
Offline Offline
Пол: Мужской
I hate myself and I wanna die


« Ответ #4 : 28-11-2006 11:47 » new

А, ну да, погял. Нада было 1 контекст брать не с канвы, а с формы, и в SelectObject писать не битмап, а его хендл.
Теперь остаётся главный вопрос - для чего вроде эта ф-я и писалась - как нарисовать на канве (или просто битмапе) другой рисунок, в этой функцией, потом перерисовать этот же рисунок в другой позиции, но не перерисовывать бэкграунд, и что бы всё было нормально. :-/Короче говоря - есть бекграунд, а есть маленький битмап (танчик). Смысл в том, чтобы мне его перерисовывать (ну например при нажатии клавиши), но не перерисовывать бекграунд. Ето какая-то ф-я (последний параметр), но я не знаю, какая. Если кто знает - напишите, буду признателен. Быть такого не может
Записан

We hate love, we love hate...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 28-11-2006 15:01 » 

Можно конечно использовать параметр SRCINVERT. Но у тебя цвета будут корежится со страшной силой. Поэтому лучше перерисовывать Бакграунд.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines