如何使memo的白底色透明,以便让显示在memo里的文字的背景图片为form的底图片????

解决方案 »

  1.   

    就不要用memo了。直接在图上画个框框多好。
      

  2.   

    sixgj(轰炸机) 说的对
    顶~
      

  3.   

    自已写一个Memo类,从TMemo继承,在WM_PAINT消息中使用下面函数处理透明,然后自已绘制文字,文字的Brush要设为bsClear.
    procedure DoTrans(Canvas : TCanvas; Control : TWinControl);
    var
        DC : HDC;
        SaveIndex : HDC;
        Position: TPoint;
    begin
        if Control.Parent <> nil then
        begin
            DC := Canvas.Handle;
            SaveIndex := SaveDC(DC);
            GetViewportOrgEx(DC, Position);
            SetViewportOrgEx(DC, Position.X - Control.Left, Position.Y - Control.Top, nil);
            IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
            Control.Parent.Perform(WM_ERASEBKGND, DC, 0);
            Control.Parent.Perform(WM_PAINT, DC, 0);
            RestoreDC(DC, SaveIndex);
        end;
    end;
    // 下面是在程序中的例子,只是说明如何用上面的函数而已;
    // 下面代码由于不是在类里写的,文字不是自绘的,所以有文字的地方不会透明,
    // 你参考一下写到你的Memo类里就行了。
    procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    var
      Canvas:TCanvas;
    begin
      if Msg.hwnd = Memo1.Handle then
      begin
        if Msg.message = WM_PAINT then
        begin
          Canvas:=TCanvas.Create;
          Canvas.Handle := GetWindowDC(Memo1.Handle);
          DoTrans(Canvas,Memo1);
          Canvas.Free;
          end;
      end;
    end;
      

  4.   

    组件我帮你写出来了,不过有个缺陷,如果出现滚动条的话,会有点偏差,
    还有当选中文本时无法透明,你自已改进吧unit TranslateMemo;interfaceuses
      Windows, Messages, SysUtils, Classes, Controls, StdCtrls,Graphics;type
      TTranslateMemo = class(TMemo)
      private
        { Private declarations }
        procedure WMPaint(var Message: TWMSetFont); message WM_PAINT;
      protected
        { Protected declarations }
      public
        { Public declarations }
      published
        { Published declarations }
      end;procedure Register;
    procedure DoTrans(Canvas : TCanvas; Control : TWinControl);implementationprocedure Register;
    begin
      RegisterComponents('Lvyin', [TTranslateMemo]);
    end;procedure DoTrans(Canvas : TCanvas; Control : TWinControl);
    var
        DC : HDC;
        SaveIndex : HDC;
        Position: TPoint;
    begin
        if Control.Parent <> nil then
        begin
            DC := Canvas.Handle;
            SaveIndex := SaveDC(DC);
            GetViewportOrgEx(DC, Position);
            SetViewportOrgEx(DC, Position.X - Control.Left, Position.Y - Control.Top, nil);
            IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
            Control.Parent.Perform(WM_ERASEBKGND, DC, 0);
            Control.Parent.Perform(WM_PAINT, DC, 0);
            RestoreDC(DC, SaveIndex);
        end;
    end;procedure TTranslateMemo.WMPaint(var Message: TWMSetFont);
    const Offset=4; // 离边框的偏移量
    var
      Canvas:TCanvas;
      i:integer;
    begin
      inherited;
      Canvas:=TCanvas.Create;
      Canvas.Handle := GetWindowDC(Self.Handle);
      DoTrans(Canvas,Self);
      Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(Self.ClientRect);
      Canvas.Font.Assign(Font);
      Canvas.Brush.Style := bsClear;
      for i:=0 to Self.Lines.Count -1 do
        Canvas.TextOut(Offset,i*Canvas.TextHeight(Self.Lines.Strings[i])+Offset,Self.Lines.Strings[i]);
      Canvas.Free;
    end;end.
      

  5.   

    一个最简单的方法就是将那个Memo控件窗口的属性设置增加一个:WS_EX_TRANSPARENT
    调用这个函数:
    SetWindowLong(Memo1.handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
    就可以了。上面这些人脑袋需要灵活点,别人楼主头昏。
      

  6.   

    回复人: smalltalk(老徐) ( ) 信誉:100  2003-11-26 23:01:00  得分:0 
     
     
      一个最简单的方法就是将那个Memo控件窗口的属性设置增加一个:WS_EX_TRANSPARENT
    调用这个函数:
    SetWindowLong(Memo1.handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
    就可以了。上面这些人脑袋需要灵活点,别人楼主头昏。=====
    呵呵,你这方法对Edit类的控件无用的。  
     
      

  7.   

    我的原意:在带有背景图片的form显示一些文本文件的资料,并保持文字的背景为form的背景图片,我们以前的做法是直接把这些文字form的背景图片做成一张图片,但这样每次文字修改是很麻烦的。  我想通过memo读出来,但memo挡住了背景色。  不知各位还有什么方法可以进行处理。