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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2010, 19:10   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Залить одним цветом

Очень с давних времен использую следующий код:
Код:
 Procedure FillAll(Var T : TTexture; Color : Integer);
 Var
  BI  : BitMapInfo;
  A   : Array of RGBQuad;
  I   : Integer;
  Loc : HDC;
  R,G,B : Byte;
 Begin
  Loc := CreateCompatibleDC(Warehouse.Buffer.DC);
  SelectObject(Loc, T.Bitmap);
  ZeroMemory(@BI, SizeOf(BI));
  BI.bmiHeader.biWidth := T.Width;
  BI.bmiHeader.biHeight := T.Height;
  BI.bmiHeader.biSize := SizeOf(BitMapInfoHeader);
  BI.bmiHeader.biCompression := BI_RGB;
  BI.bmiHeader.biBitCount := FILL_BITS_32;
  BI.bmiHeader.biPlanes := 1;
  SetLength(A, T.Height * T.Width * FILL_CHANNELS_COUNT);
  GetDIBits(Loc, T.Bitmap, 0, T.Height, @A[0], @BI, DIB_RGB_COLORS);
  R := (Color And COLOR_RED);
  G := (Color And COLOR_GREEN) Shr FILL_SECOND_CHANNEL;
  B := (Color And COLOR_BLUE) Shr FILL_THIRD_CHANNEL;
  For I := 0 to Length(A) - 1 Do
   Begin
      A[I].rgbRed   := R;
      A[I].rgbGreen := G;
      A[I].rgbBlue  := B;
   End;
  SetDIBits(Loc, T.Bitmap, 0, T.Height, @A[0], @BI, DIB_RGB_COLORS);
  DeleteDC(Loc);
 End;
Код:
 TTexture = Record 
   BitMap : HBitMap;
   Width  : Integer;
   Height : Integer;
  End;
Есть более оптимальный способ?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 24.09.2010, 01:10   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Вполне возможно, что в данном случае обычный Rectangle будет быстрее и компактнее, чем вся эта возня с dib_ми.
Надо попробовать.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 24.09.2010, 09:54   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Rectangle кого? Это ж вроде не канвас.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 24.09.2010, 14:31   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Rectangle для device context'а Loc?
А так
Код:
var t: RGBQuad;

t.rgbRed := ...
t.rgbGreen := ...
t.rgbBlue := ...

for ...
  a[i] := t;
по-любому быстрее, чем побайтово.

Последний раз редактировалось Somebody; 24.09.2010 в 14:42.
Somebody вне форума Ответить с цитированием
Старый 24.09.2010, 16:18   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
Сообщение от Alex Cones
Rectangle кого? Это ж вроде не канвас.
Ну как бы тема в разделе WinApi. Я вообще не про канвас, а про функцию WinApi - Rectangle.
Цитата:
The Rectangle function draws a rectangle. The rectangle is outlined by using the current pen and filled by using the current brush.

BOOL Rectangle(

HDC hdc, // handle of device context
int nLeftRect, // x-coord. of bounding rectangle's upper-left corner
int nTopRect, // y-coord. of bounding rectangle's upper-left corner
int nRightRect, // x-coord. of bounding rectangle's lower-right corner
int nBottomRect // y-coord. of bounding rectangle's lower-right corner
);
Либо я чёт не понимаю.
1. Создали совместимый контекст.
2. Установили на него наш HBitmap
3. Создали кисти и карандаши, если их ещё нет (CreateSolidBrush и CreatePen)
4. Установили кисть и карандаш нужного цвета на совместимый контекст (SelectObject)
5. Отрисовали квадратик.
6. Восстановили всех нужных, удалили всех ненужных (DeleteObject, DeleteDC).

Ну а по привидённому коду - не понял зачем здесь GetDIBits(Loc, T.Bitmap, 0, T.Height, @A[0], @BI, DIB_RGB_COLORS); нужен?
По-моему он лишний.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Залить на народ. misher Свободное общение 2 21.07.2010 22:27
Залить сайт Дініс Свободное общение 12 20.12.2009 14:28
Как залить определённые участки формы каким-то определённым цветом? Rin Общие вопросы Delphi 5 18.11.2009 23:05
Залить цветом область. gusluk Мультимедиа в Delphi 3 31.10.2009 05:58
Часть фона одним цветом а другая часть другим (без таблиц). Lanselot HTML и CSS 4 25.04.2008 18:41