(Delphi 2006 和C++Builder6 )下面试验过...
新建一个工程,再新建二个窗体...在第二个窗体上放一个memo控件,把窗体下列属性做修改:
AlphaBlend := true;
AlphaBlendValue := 任意; //1-255;TransparentColor := true; //发生bug的属性,不过在同时AlphaBlend也要设为True;
TransparentColorVal := 任意;好了...做好上面的后,在第一个窗体放入一个按钮,在单击里写
var
  TestForm: TForm2;
begin
  TestForm := TForm2.Create(Self);
  try
    TestForm.ShowModal; // or TestForm.Show;
  finally
    TestForm.Free;
  end;
end;运行之后,出现这个透明的窗体后,在memo里面输入内容,如果把memo的区域内容输满后,再输入就会出现
程序死了的现象,要等一阵时间才会正常,如果再输入得换行时,又会陷入死的情况...试过好几个组件了,包括Memo,RichEdit,RzMemo,RzRichedit,不过在TMS组件包里的TMS Memo又没有问题哦...请问这是为什么?请高手回答...

解决方案 »

  1.   

    我试了一下,确实有这个现象。Google后没有也找到答案,我想这可能是Windows的Common Control的问题,因为
    TMemo,TrichEdit是直接封装Common Control的,但TMS Memo不是,
    它是继承自TCustomControl
      

  2.   

    what is Common Control?能够详细解释一下吗?thanks...
      

  3.   

    what is Common Control?
    ---------------------------------------
    http://dev.csdn.net/article/7/7776.shtm
      

  4.   

    我也试了下,BCB6及delphi6都有此问题
    操作系统:XP,2K都有问题,但在win9X/NT下,没有问题
    我稍稍跟踪了一下,好像停顿在消息处理中,直接用Memo.Lines.Add没有问题,且在一个Form上就有问题,只要是AlphaBlend及TransparentColor的属性为true,与其它的无关
      

  5.   

    问题可能出在 SetLayeredWindowAttributes 这个函数(不确定)。
    在我的机器(Win2k/Pro上),直接输入或Ctrl+V,只要内容输入超出范围,包括不自动换行时滚动条滚动,都会僵死,cpu 100%,而且很严重,整个Windows都动不了,不单单是那一个程序。
      

  6.   

    都会僵死,cpu 100%,而且很严重,整个Windows都动不了,不单单是那一个程序
    ////////////////
    是啊,蛮严重的...整个WINDOWS都停顿下来,
    好像只与AlphaBlend和TransparentColor属性相关,不知大家有什么解决方案?
      

  7.   

    参考如下代码,Delphi6+XP调试通过
    //....
      private
        { Private declarations }
        FWndMethod: TWndMethod;
        procedure WindowProc(var Message: TMessage);
      end;
    //....
    procedure TForm1.WindowProc(var Message: TMessage);
    begin
      case Message.Msg of
        WM_KEYFIRST..WM_KEYLAST: AlphaBlend := False;
      end;
      if Assigned(FWndMethod) then FWndMethod(Message);
      case Message.Msg of
        WM_KEYFIRST..WM_KEYLAST: AlphaBlend := True;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FWndMethod := Memo1.WindowProc;
      Memo1.WindowProc := WindowProc;
    end;
    //....
      

  8.   

    //再加上鼠标的处理
      case Message.Msg of
        WM_KEYFIRST..WM_KEYLAST, WM_MOUSEFIRST..WM_MOUSELAST: AlphaBlend := False;
      end;
      AlphaBlend := False;
      if Assigned(FWndMethod) then FWndMethod(Message);
      case Message.Msg of
        WM_KEYFIRST..WM_KEYLAST, WM_MOUSEFIRST..WM_MOUSELAST: AlphaBlend := True;
      end;
    //如果不是到处乱选,不会出现停顿的情况