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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2011, 22:47   #1
askarchic
Пользователь
 
Регистрация: 26.11.2010
Сообщений: 28
По умолчанию Использование AlphaBlend

Всем доброго времени суток!
Я отрисовываю текст в окне и пытаюсь, используя AlphaBlen, покрыть форму синим оттенком.

Вот отрывок кода:

Код:
WM_PAINT :
        Begin
          DC := GetDC(hWnd);
          DCS := CreateCompatibleDC(GetDC(0));  //CreateCompatibleDC(DC);
          Brush := CreateSolidBrush(GetWindowLong(hWnd, GWL_USERDATA));
          //GetWindowLong(hWnd, GWL_USERDATA) = $FF0000
          Font := CreateFont(-17,
                             0,
                             0,
                             0,
                             0,
                             0,
                             0,
                             0,
                             RUSSIAN_CHARSET,//ANSI_CHARSET,
                             OUT_DEFAULT_PRECIS,
                             CLIP_DEFAULT_PRECIS,
                             ANTIALIASED_QUALITY,
                             DEFAULT_PITCH Or FF_DONTCARE,
                             'Arial');
          SelectObject(DC, Font);
          GetWindowText(hWnd, @Text[0], GetWindowTextLength(hWnd) + 1);
          GetClientRect(hWnd, CRect);
          GetWindowRect(hWnd, WRect);
          Inc(CRect.Left);
          Inc(CRect.Top);
          SetTextColor(DC, $007F7F7F);
          SetBkMode(DC, TRANSPARENT);
          DrawText(DC, @Text[0], GetWindowTextLength(hWnd), CRect, DT_CENTER Or DT_VCENTER Or DT_SINGLELINE);
          Dec(CRect.Left, 3);
          Dec(CRect.Top, 3);
          SetTextColor(DC, $00EFEFEF);
          DrawText(DC, @Text[0], GetWindowTextLength(hWnd), CRect, DT_CENTER Or DT_VCENTER Or DT_SINGLELINE);
          DeleteObject(Font);
          Inc(CRect.Left);
          Inc(CRect.Top);
          SetTextColor(DC, $00DFDFDF);
          DrawText(DC, @Text[0], GetWindowTextLength(hWnd), CRect, DT_CENTER Or DT_VCENTER Or DT_SINGLELINE);
          FillRect(DCS, CRect, Brush);
          With BF Do
            Begin
              BlendOp             := AC_SRC_OVER;
              BlendFlags          := 0;
              SourceConstantAlpha := $7F;
              AlphaFormat         := 0
            End;
          //BitBlt(DC, 0, 0, CRect.Right, CRect.Bottom, DC, 10, 10, SRCCOPY);
          AlphaBlend(DC, 0, 0, CRect.Right, CRect.Bottom, DCS, 0, 0, CRect.Right, CRect.Bottom, BF);
          DeleteObject(Brush);
          DeleteDC(DCS);
          ReleaseDC(hWnd, DC);
        End;
К сожалению эффект нулевой (текст на белом фоне), ошибки сам не нахожу, подскажите пожалуйста в чем ошибка?
askarchic вне форума Ответить с цитированием
Старый 24.03.2011, 07:48   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Простите, а причем тут альфаБленд? Этот метод отвечает за прозрачность формы...

Хотете сами отрисовывать форму? Эвент .OnPaint формы Вам в помощь. А для перерисовки вызовите
Код:
 Form1.Invalidate;
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 24.03.2011, 12:45   #3
Freezer
Пользователь
 
Аватар для Freezer
 
Регистрация: 04.02.2007
Сообщений: 37
По умолчанию

вариант конечно не очень хороший но можно самому реализовать смешивание цветов, вот функция:


Код HTML:
//=============================================================================================
function MixBytes(FG, BG, TRANS: byte): byte;//змішує 1 канал двох кольорів з даданою прозорістю
//---------------------------------------------------------------------------------------------
begin
  Result := round(bg + (fg - bg)/255*TRANS);
end{function MixBytes(FG, BG, TRANS: byte): byte;};

//=============================================================================================
function MixColors(FG, BG: TColor; T: byte): TColor;
//---------------------------------------------------------------------------------------------
var r,g,b:byte;
begin
  R := MixBytes(FG and 255,BG and 255,T); // extracting and mixing Red
  G := MixBytes((FG shr 8) and 255,(BG shr 8) and 255,T); // the same with green
  B := MixBytes((FG shr 16) and 255,(BG shr 16) and 255,T); // and blue, of course
  Result := r+g*256+b*65536; // finishing with combining all channels together
end {function MixColors(FG, BG: TColor; T: byte): TColor;};
Передаешь туда цвет фона, цвет который налаживаешь, прозрачность, получаешь нужный цвет, а дальше шуруешь напрямую на Canvas.
Не грузи, и не грузим будешь...

Последний раз редактировалось Freezer; 24.03.2011 в 13:08.
Freezer вне форума Ответить с цитированием
Старый 24.03.2011, 19:14   #4
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Johnson Посмотреть сообщение
Простите, а причем тут альфаБленд?[/CODE]
А я уж было решил, что это я с ума сошел...
Смотрел-смотрел код, ничего не понял и... тихо-тихо удалился...
asmodey1 вне форума Ответить с цитированием
Старый 24.03.2011, 22:41   #5
askarchic
Пользователь
 
Регистрация: 26.11.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Johnson Посмотреть сообщение
Простите, а причем тут альфаБленд? Этот метод отвечает за прозрачность формы...
Цитата:
AlphaBlend(DC, 0, 0, CRect.Right, CRect.Bottom, DCS, 0, 0, CRect.Right, CRect.Bottom, BF);
Уважаемый, вы видимо дальше VCL не уходили.
Я говорю не про метод формы, а про функцию GDI.

Вручную смешивать цвета не выгодно по времени, мне бы помочь найти ошибку
askarchic вне форума Ответить с цитированием
Старый 24.03.2011, 22:53   #6
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
Уважаемый, вы видимо дальше VCL не уходили.
Я говорю не про метод формы, а про функцию GDI.
o_O!!! нда...
Вы сами, то читали про эту функцию???
Вот что пишут здесь
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Цитата:
The AlphaBlend function displays bitmaps that have transparent or semitransparent pixels.
Ну или кривым переводом Сократа
Цитата:
Функция AlphaBlend отображает побитовые отображения, которые имеют прозрачные или полупрозрачные пиксели.
ПРОЗРАЧНОСТЬ ОНА ДАЁТ!!! А не оттенки!
Нужен цвет формы метод Color вам в помощь!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 24.03.2011, 23:15   #7
askarchic
Пользователь
 
Регистрация: 26.11.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
ПРОЗРАЧНОСТЬ ОНА ДАЁТ!!! А не оттенки!
Нужен цвет формы метод Color вам в помощь!
Эта прозрачность и даст мне оттенок окна! Да я читал про эту функцию, у меня все работало когда контекст был привязан к окну, а когда я пытаюсь HDC (созданный посредством CreateCompatibleDC) прозрачно отрисовать на другом контексте у меня ничего не получается, хотя все должно работать.
askarchic вне форума Ответить с цитированием
Старый 25.03.2011, 00:53   #8
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от askarchic Посмотреть сообщение
Код:
 AlphaFormat         := 0
если я не ошибаюсь, то это абсолютная прозрачность и значит вы ничего не увидите.
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 25.03.2011, 01:01   #9
askarchic
Пользователь
 
Регистрация: 26.11.2010
Сообщений: 28
По умолчанию

Ошибаетесь... Формат отвечает немного за другое.
SourceConstantAlpha := $7F; {Вот это отвечает за прозрачность}
askarchic вне форума Ответить с цитированием
Старый 25.03.2011, 01:20   #10
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от askarchic Посмотреть сообщение
Ошибаетесь... Формат отвечает немного за другое.
SourceConstantAlpha := $7F; {Вот это отвечает за прозрачность}
сори, перепутал
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AlphaBlend и onResize D][mon Помощь студентам 0 29.09.2010 22:06
Image и AlphaBlend Zeraim Общие вопросы Delphi 4 09.09.2009 12:45
Прозрачность - AlphaBlend nazavrik Win Api 5 04.09.2009 02:20
AlphaBlend - прозрачность картинки Vovandows Мультимедиа в Delphi 2 26.09.2008 00:35
AlphaBlend + ShowModal Cardagant Общие вопросы Delphi 2 11.06.2008 15:42