Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2010, 14:19   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

к сожалению у себя проверить не могу...Делфи чего то баразлит...
ошибка вылазит где то или не рисует?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.06.2010, 14:22   #12
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Просто не рисует.

Если сделать так:
Код:
Procedure Draw(Source : HBitMap; X,Y : Integer);
  Var
   Bit     : BitMap;
   Loc     : HDC;
  Begin
   Loc := CreateCompatibleDC(Application.FRMMain.IMGMain.DC);
   SelectObject(Loc, Source);
   GetObject(Source, SizeOf(Bit), @Bit);
   TransparentBlt(Application.FRMMain.IMGMain.DC, X, Y, Bit.bmWidth, Bit.bmHeight, Loc, 0, 0, Bit.bmWidth, Bit.bmHeight, $FF00FF);
   DeleteDC(Loc);
  End;
То работает, но тогда функция смысл теряет.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 18:01   #13
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Такой вариант - а если рисовать на HBitMap?

Вот, кстати нашел образец двойной буеризации на си:
Код:
HDC          hdcMem;
HBITMAP      hbmMem;
HANDLE       hOld;

PAINTSTRUCT  ps;
HDC          hdc;

....
case WM_PAINT:

    // Получаем DC для окна
    hdc = BeginPaint(hwnd, &ps);

    // Создаем off-screen DC для двойной буферизации
    hdcMem = CreateCompatibleDC(hdc);
    hbmMem = CreateCompatibleBitmap(hdc, win_width, win_height);
    hOld   = SelectObject(hdcMem, hbmMem);

    // Здесь рисуем в hdcMem

    // Выводим построенное  изображение и памяти на экран
    BitBlt(hdc, 0, 0, win_width, win_height, hdcMem, 0, 0, SRCCOPY);

    // Освобождаем память
    SelectObject(hdcMem, hOld);
    DeleteObject(hbmMem);
    DeleteDC    (hdcMem);

    EndPaint(hwnd, &ps);
    return 0;
Не улавливаю, чем он отличается от нашего?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 30.06.2010 в 18:15.
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 18:22   #14
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Либо я чего-то в синтаксисе не понимаю, либо реально не увидел где вы в своих функциях устанавливаете объект на контекст Warehouse.Buffer?

И ещё вопрос - вы свои библиотеки пишете, а задача скорости от них требуется? Или это так сказать эффекты не real-time?
Потому что если это эффекты реального времени (выполняемые по таймеру 30-100 раз в секунду), то TransparentBlt не вариант совсем.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 30.06.2010, 19:50   #15
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
либо реально не увидел где вы в своих функциях устанавливаете объект на контекст Warehouse.Buffer?
Эээээээ.... Не понял.

Цитата:
от них требуется?
Требуется.
Цитата:
то TransparentBlt не вариант совсем
Блин... А как тогда действовать?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 20:52   #16
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Цитата:
Эээээээ.... Не понял.
Ну вот вы создали совместимый с девайсом контекст
Код:
Warehouse.Buffer := CreateCompatibleDC(Application.FRMMain.IMGMain.DC);
А где для него SelectObject ? Или он не нужен?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 30.06.2010, 21:11   #17
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Ой, а не подскажете куды его нужно всунуть?
Просто тут такая схема получается:
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 21:54   #18
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Схема не очень логичная.
Я бы так наверное сделал:

Procedure CreateDCnHB и Warehouse.Buffer
Вообще-то Warehouse.Buffer это пока не буфер - это контекст.
Поэтому добавляем в Warehouse именно буфер
Код:
Type
  TWarehouse = Record
   BBCompDC  : HDC;
   Buffer  : HBitMap;
   Splash  : HBitMap;
   Menu    : HBitMap;
  End;
В процедуре CreateDCnHB создаём пустой битмап размером с рабочую область и хендл его запоминаем в Warehouse.Buffer. Этот битмап и устанавливаем как объект для BBCompDC. Таким образом у нас получится полноценный Back-Buffer. Куда можно будет рисовать другие битмапы и его не будет видно пока вы его не нарисуете на контекст устройства.

Собственно это всё как раз выше чуть написано:
Цитата:
// Создаем off-screen DC для двойной буферизации
hdcMem = CreateCompatibleDC(hdc);
hbmMem = CreateCompatibleBitmap(hdc, win_width, win_height);
hOld = SelectObject(hdcMem, hbmMem);
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось Ulex; 30.06.2010 в 21:57.
Ulex вне форума Ответить с цитированием
Старый 30.06.2010, 22:03   #19
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Спасибо Ulex и Пепел Феникса, все получилось!

Правда остался вопрос - если TransparentBlt нельзя, то как поступить?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 22:34   #20
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Так а советовали же уже в сторону DIB секций.
Тем более если какую свою структуру (объект) замутить, то в нём можно хранить POINT, который возвращает функа CreateDIBSection. А это уже указатель на массив данных (грубо говоря точек). С которыми можно работать уже напрямую. А это как-раз и нужно для всяких эффектов.

Где то в разделе по играм Beermonza и AlexBlack делали что-то подобное. Я в их примере не сильно разобрался (там Delphi). Но вам это будет проще сделать. Alex там накрутил всю математику на mmx инструкциях (или даже на xmm). Вроде бы очень быстрый вариант получился.

Если разрешишь, то я тебе могу пример скинуть (если допишу конечно).
Пример просто чтобы прикинуть какой можно выигрыш получить от DIB. Просто exe.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
RichEdit "прячется" под Image. API Alex Cones Win Api 13 10.11.2009 16:12
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04