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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2010, 23:54   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию "Буфер рисования" для API.

Как создать DC, который сможет служить "буфером"?

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

Код:
var M:HDC;
begin 
 M:=CreateCompatibleDC(Form.Canvas.Handle{короче DC того на что потом выводить будем});
 //рисуем на M , потом в конце 
 BitBlt(Form.Canvas.Handle,0,0,Form1.Width,Form1.Height,M,0,0,SRCCOPY);
 DeleteDC(M)
естественно я для простоты писал как бы для VCL
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.06.2010, 09:14   #3
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;
Т.е. Теперь нужно так переделать, чтобы рисовать на Loc? А что тогда ставить в виде 6-го аргумента в TransparentBlt? Чет я как-то не понял...

Дык як всеж нарисовать на буферном DC несколько изображений?

Интересует вот это:
Код:
var M:HDC;
begin 
 M:=CreateCompatibleDC(Form.Canvas.Handle{короче DC того на что потом выводить будем});
 //рисуем на M , потом в конце 
 BitBlt(Form.Canvas.Handle,0,0,Form1.Width,Form1.Height,M,0,0,SRCCOPY);
 DeleteDC(M)
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Stilet; 30.06.2010 в 13:23.
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 12:57   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

С добрым утром Ну или уже днем.

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

дошло)
примерно так?
Код:
Procedure Draw(Source:HBitMap;X,Y:Integer);
Var
 Bit:BitMap;
 M,BitmapDC:HDC;
Begin
   BitmapDC:=CreateCompatibleDC(Application.FRMMain.IMGMain.DC);
   M:=CreateCompatibleDC(Application.FRMMain.IMGMain.DC);
   SelectObject(BitmapDC,Source);
   GetObject(Source,SizeOf(Bit),@Bit);
   TransparentBlt(M, X, Y, Bit.bmWidth, Bit.bmHeight,BitmapDC, 0, 0, Bit.bmWidth, Bit.bmHeight, $FF00FF);
   //теперь на M у нас нарисован Source с прозрачностью
   DeleteDC(M);
   DeleteDC(BitmapDC);
End;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.06.2010, 13:10   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Гениально
Осталось мне только разделить это все на две функи:
DrawBuffer;
и
Draw(H:HBitMap; X,Y: Integer);

Спасибо большое!
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 13:40   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Чет не выходит:

Код:
Procedure LoadHB(FileName : PChar; Var HB : HBitMap);
 Begin
  HB := LoadImage(GetModuleHandle(Nil), FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
 End;
Код:
 Procedure CreateDCnHB;
  Begin
   Application.FRMMain.IMGMain.DC := GetDC(Application.FRMMain.IMGMain.Handle);
   Warehouse.Buffer := CreateCompatibleDC(Application.FRMMain.IMGMain.DC);
   LoadHB(PChar(CurDir + '\Resource\Interface\Splash\Splash.bmp'), Warehouse.Splash);
   LoadHB(PChar(CurDir + '\Resource\Interface\Menu\Menu.bmp'), Warehouse.Menu);
  End;
Код:
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(Warehouse.Buffer, X, Y, Bit.bmWidth, Bit.bmHeight, Loc, 0, 0, Bit.bmWidth, Bit.bmHeight, $FF00FF);
   DeleteDC(Loc);
  End;
Код:
Procedure DrawB;
  Begin
   BitBlt(Application.FRMMain.IMGMain.DC, 0, 0, 800, 600, Warehouse.Buffer, 0, 0, SRCCOPY);
  End;
Вызов:
Код:
 UNTGraph.CreateDCnHB;

 UNTGraph.Draw(Warehouse.Splash, 0, 0);
 UNTGraph.DrawB;
Варя:
Код:
 Type
  TWarehouse = Record
   Buffer  : HDC;
   Splash  : HBitMap;
   Menu    : HBitMap;
  End;

 Var
  CurDir    : String;
  Warehouse : TWarehouse;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 30.06.2010, 14:03   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

Код:
Type

   TIMG = Record
    Handle     : HWND;
    DC         : HDC;
   End;

   TFRM  =  Record
    Handle      : HWND;
    IMGMain     : TIMG;
   End;

   TApplication = Record
    WinClass               : TWndClass;
    ApplicationHandle      : HWND;          // hInst
    OldHeight              : Integer;
    OldWidth               : Integer;
    (* Message *)  Msg     : TMSG;
    (* Forms   *)  FRMMain : TFRM;
   End;

   (***** VARS *****)
  Var

   Application : TApplication;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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