Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проблемы с прозрачностью Edit


Автор: Dr3d 27.6.2007, 22:48
Пытаюсь сделать прозрачный фон у Edit, а не получается.
Фон белый, если напечатать текст а потом удалить, то курсор перемещается - символы остаются.
Печатается поверх старого текста.
Видимо делаю что-то не так.
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

long OWndProc;

int MyWndProc(MSG msg)
{
switch(msg.message)
{
case WM_CTLCOLOREDIT:
SetBkMode((HDC)msg.wParam, TRANSPARENT);
return (BOOL)GetStockObject(NULL_BRUSH);
}
return CallWindowProc((FARPROC)OWndProc, Form1->Handle, msg.message, msg.wParam, msg.lParam);
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
OWndProc = SetWindowLong(Form1->Handle, GWL_WNDPROC, (long)MyWndProc);
}
//---------------------------------------------------------------------------

Автор: Klin 27.6.2007, 23:50
А нафига тебе эта марока? Поменяй цвет, да с песней. Или если принципиально - используй Label с обработкой клавиш.

Автор: Dr3d 28.6.2007, 10:57
Klin, на ворме лежит красивая картинка, Edit, какого бы цвета он ни был, все портит.
Использовать Label ещё больше гемора.

Автор: Klin 28.6.2007, 14:32
Ну насчет картинки, это дело хорошее - это я уже реализовал, начет вашей прозрачности буквенного фона, я использовал перепрорисовку при изменении текста, но здесь еще подумаю, а пока так:

1. Идет твой код прозрачности для текстового поля

2. Отображаем часть нашего изображения в текстовом поле.

Код

 Edit1->Brush->Bitmap = new Graphics::TBitmap; // иницилизируем наш bitmap
 Edit1->Brush->Bitmap->Height = Edit1->Height; // задаем его размеры
 Edit1->Brush->Bitmap->Width = Edit1->Width;
 BitBlt(Edit1->Brush->Bitmap->Canvas->Handle,0,0, Edit1->Left-Image1->Left+Edit1->Width,
  Edit1->Top-Image1->Top+Edit1->Height, Image1->Canvas->Handle,Edit1->Left-Image1->Left, // + 3 для выравнения, если есть рамка
  Edit1->Top-Image1->Top,SRCCOPY); // копируем чать изображения в него
OWndProc = SetWindowLong(Handle, GWL_WNDPROC, (long)MyWndProc); // твоё добро :)


3. В OnChange нашего текстового поля:

Код

 Edit1->Repaint();


Автор: Klin 28.6.2007, 14:48
Мда, опять не знание синтаксиса убивает идеи на корню smile  switch знаем, case знаем, а break...

Да и возврат лишний  return (BOOL)GetStockObject(NULL_BRUSH);

Код

long OWndProc;
int MyWndProc(MSG msg)
{
 if (msg.message == WM_CTLCOLOREDIT) SetBkMode((HDC)msg.wParam, TRANSPARENT);
 return CallWindowProc((FARPROC)OWndProc, Form1->Handle, msg.message, msg.wParam, msg.lParam);
}


Добавлено через 5 минут и 57 секунд
пример

Автор: Dr3d 28.6.2007, 16:19
Спасибо, буду медитировать.

Автор: Klin 28.6.2007, 18:48
А этот код (в сочетани с предыдущем), если его поставить на OnActivate даст полную прозрачность, т.е не только рисунок будет видно, но и все, что находиться за контролом (текст, другие изображения и т.п.)


Код

 Repaint(); // перепрорисовка формы (иначе будет некорректное отображение)
 Edit1->Brush->Bitmap = new Graphics::TBitmap; // инициализируем bitmap
 Edit1->Brush->Bitmap->Height = Edit1->Height; // подгоняем его под размеры нашего поля
 Edit1->Brush->Bitmap->Width = Edit1->Width; 
 BitBlt(Edit1->Brush->Bitmap->Canvas->Handle,0,0, Edit1->Left+Edit1->Width,
  Edit1->Top+Edit1->Height, Canvas->Handle,Edit1->Left+3,Edit1->Top+2,SRCCOPY); // копируем все, что под полем
 Edit1->Visible = true; // показываем наше прозрачное поле


ps. Текстовое поле необходимо сделать невидимым по умолчанию, иначе программа "пропечатает" его на самого себя.

pps. Да и похоже от использования Memo придется отказаться, т.к. возникают графические искажения. Зато другие Edit`ы, да и RichEdit работают нормально. 

Автор: TopCore 25.8.2009, 10:40
Помогите!!! Куда-то делась прозрачность формы. Настройки как надо: TransparentColor = true, TrColValue = clPurple, Color = clPurple. А форма всё равно не становится прозрачной. Причём в приложении 3 формы и на одной работает прозрачность, а на другой нет. Что могло где-то измениться? smile 

Автор: TopCore 25.8.2009, 11:33
Нашёл проблему - всё дело оказалось в альфаскинах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)