1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

Прозрачные компоненты

Тема в разделе "Delphi - программирование", создана пользователем TSnake, 28 май 2006.

Статус темы:
Закрыта.
  1. TSnake

    TSnake Гость

    Репутация:
    0
    Как сделать, чтобы фон у TMemo а был прозрачным?
     
  2. zubr

    zubr Гость

    Репутация:
    0
    В Net такая фича есть. В Delphi же можно только всю форму сделать прозрачной или полупрозрачной (для NT-систем).
    А так ручками самому отрисовывать фон компонента.
     
  3. TSnake

    TSnake Гость

    Репутация:
    0
    А поконкретнее можно? Просто очень нужно сделать, чтобы под мемо был виден битмап, а так весь вид проги портит.
     
  4. zubr

    zubr Гость

    Репутация:
    0
    Вот тебе способ для NT-систем, не совсем красивый, но работающий. Смотри во вложенном файле. Обрати внимание в инспекторе объектов для Form2 свойства AlphaBlend и AlphaBlendValue. Поэкспериментируй со свойством AlphaBlendValue.
    З.Ы. Проект собран в Delphi7
     

    Вложения:

  5. TSnake

    TSnake Гость

    Репутация:
    0
    Такой вариант я уже видел, но как-то это совсем не элегантно <_< . я люблю чтобы всё было изящно, красиво, а этот способ, к сожалению, не является таковым :( .
    Совершенно случайно натктнулся в инете на прозрачную панель(TPanel), там "прозрачность" реализована так: копируется область битмапа под панелью и копируется в свой фон. Хотел подсосать идею и сделать прозрачный TEdit таким же образом, но он не имеет канвы.
    буду думать чё-нить ещё
     
  6. zubr

    zubr Гость

    Репутация:
    0
    Посмотри в исходниках TEdit, где там происходит прорисовка фона - туда и пытайся влезть. Или создай свой компонент типа TEdit на базе TCustomPanel. Можно еще попробовать фон отрисовывать своей кистью - когда то делал, надо порыться в архиве, найду - выложу.
     
  7. zubr

    zubr Гость

    Репутация:
    0
    Вот как раскрасить фон компонента одноцветной кистью:
    Код:
    unit Unit1;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
    
    type
    TForm1 = class(TForm)
    Edit1: TEdit;
    private
    { Private declarations }
    procedure WMCTLCOLOREDIT(var msg:TMessage); message WM_CTLCOLOREDIT;
    public
    { Public declarations }
    end;
    
    var
    Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.WMCTLCOLOREDIT(var msg:TMessage);
    var
    hdc, hbs:cardinal;
    begin
    If msg.LParam<>Edit1.Handle then
    exit;
    hdc:=msg.wParam;
    hbs:=CreateSolidBrush(clYellow);
    SetBkColor(hdc, clYellow);
    SetTextColor(hdc, clRed);
    msg.Result:=hbs;
    end;
    
    end.
    Попробуй вместо CreateSolidBrush создавать кисть на основе битмапа, используя функцию CreatePatternBrush или CreateDIBPatternBrush.
     
  8. TSnake

    TSnake Гость

    Репутация:
    0
    c Edit'ом получилось.
    А вот с Memo такая штука не проходит

    да и с Edit'ом всё не так хорошо: если Edit лежит на панели, то фон не перерисовывается. :)
     
  9. zubr

    zubr Гость

    Репутация:
    0
    Вот тебе вариант с перехватом процедуры окна у панели. Здесь на Panel1 расположены Memo1 и Edit1:
    Код:
    unit Unit1;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ExtCtrls;
    
    type
    TForm1 = class(TForm)
    Panel1: TPanel;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    
    
    
    var
    Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    var
    wProc:Pointer;
    
    function NewWndProc(Handle:hWnd; msg, wParam, lParam:Longint):Longint; stdcall;
    var
    hdc, hbs:cardinal;
    begin
    Result:=CallWindowProc(wProc, Handle, msg, wParam, lParam);
    If msg=WM_CTLCOLOREDIT then
    begin
    If (lParam=Form1.Edit1.Handle) or (lParam=Form1.Memo1.Handle) then
    begin
    hdc:=wParam;
    hbs:=CreateSolidBrush(clYellow);
    SetBkColor(hdc, clYellow);
    SetTextColor(hdc, clRed);
    Result:=hbs;
    end;
    end;
    If msg=WM_PAINT then
    begin
    hdc:=GetDC(Form1.Memo1.Handle);
    hbs:=CreateSolidBrush(clYellow);
    FillRect(hdc, Rect(0, 0, Form1.Memo1.Width, Form1.Memo1.Height), hbs);
    end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    wProc:=Pointer(SetWindowLong(Panel1.Handle, gwl_WndProc, Integer(@NewWndProc)));
    end;
    
    end.
    З.Ы. Очистку мусора я не делал, показан принцип.
     
  10. TSnake

    TSnake Гость

    Репутация:
    0
    а как быть с Мемо? в нём-то битмап не рисуется
     
  11. zubr

    zubr Гость

    Репутация:
    0
    Так а что CreatePatternBrush или CreateDIBPatternBrushPt не катят? Посмотри реализацию этих функций в MSDN, там по моему примеры их использования есть. В конце концов можно в WM_PAINT Memo (подменять процедуру окна Memo), рисовать фон, а затем выводить текст (OutText):
    Код:
    If msg=WM_PAINT then
    begin
    hdc:=GetDC(Form1.Memo1.Handle);
    BitBlt(....
    OutText(....
    end;
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей