如何在Memo控件中实现一行的颜色不同下一行?

解决方案 »

  1.   

    因为不行!
    换RichEdit吧。
      

  2.   

    用RichEdit,猛料
      RichEdit的文本背景颜色    
        
    如何在richedit中设置字体的背景色?在richedit中,要填充一个CHARFORMAT结构,再用这个结构的指针作为参数给richedit发EM_SETCHARFORMAT的消息。我们可以在delphi目录下的richedit.pas文件里找到这个CHARFORMAT的Delphi原型TCHARFORMAT,但是可以发现这个CHARFORMAT里只有一个crTextColor字段是用来描述字体颜色的,并没有描述背景色的字段,难道RichEdit真的就不直接支持背景色了么?可以做个实验:在word里编辑几个有背景颜色的字(谁说word不可以设置字体背景色的),选中COPY,再编译运行Delphi的RichEdit的那个Demo程序,在里面选paste,可以看到字体的背景色是正常显示出来了。说明RichEdit是可以完成这工作的,只是我们没掌握正确方法。查阅大量资料,发现EM_SETCHARFORMAT消息还可以传递另外一个结构:CHARFORMAT2,这个结构是CHARFORMAT的增强版本,里面可以支持字距/背景色/动画显示效果等增强功能,只是需要注意需要有2.0版本的richEdit支持(目前的系统里几乎都会有的)。了解了这些以后我们就可以开始着手实验了:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls,richedit;//注意要加上RichEdit的引用typeTForm1 = class(TForm)RichEdit1: TRichEdit;Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var Fmt :TCharFormat2;beginFmt.cbSize := SizeOf(Fmt);//这里放传递的结构大小,系统通过这个知道传递的是CharFormat还是CharFormat2Fmt.dwMask := CFM_COLOR or CFM_BACKCOLOR;//告诉系统只有字体颜色和背景颜色两个字段的值有效Fmt.crTextColor := clRed;//设置字体颜色Fmt.crBackColor := clYellow;//设置字体背景色RichEdit1.Perform(EM_SETCHARFORMAT,SCF_SELECTION,integer(@Fmt));//发EM_SETCHARFORMAT消息给RichEdit//其中SCF_SELECTION表示该设置只对选择的文字有效,具体用法参考win32 SDK HELPRichEdit1.Lines.Add('我靠啊');// 插入一行新文字end;看看你的RichEdit里的字是不是有背景颜色了。(这里的代码只是为了简单,说明主要问题,要正确设置最好先选定要设置的文本)如果要考虑的再全面一点,可以在程序启动时加上一些判断:inst := LoadLibrary('riched20.dll');//riched20.dll是richedit2的动态联结库文件if inst = nil then出错处理....................以确保系统能找到相关的库文件其实深入研究可以发现用CHARFORMAT2可以简单的实现很多TRichEdit无法直接实现的特殊功能,完全不需要什么特殊控件。上面的代码可以做到,不过有的时候不行?不稳定!**********************************************usesRichEdit;procedure RE_SetSelBgColor(RichEdit: TRichEdit; AColor: TColor);varFormat: CHARFORMAT2;beginFillChar(Format, SizeOf(Format), 0);with Format dobegincbSize := SizeOf(Format);dwMask := CFM_BACKCOLOR;crBackColor := AColor;Richedit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));end;end;// Example: Set clYellow background color for the selected text.procedure TForm1.Button1Click(Sender: TObject);beginRE_SetSelBgColor(RichEdit1, clYellow);end;需要Richedit2.0的支持
     
       
      

  3.   

    只有换用RichEdit ,MEMO是不可能除非你自己改。
      

  4.   

    你要做的是什么东西,一定要用memo吗?
    如果你只是显示一些东西而不进行修改的话建议你使用listView因为它实现分行背景很简单。
    给你个listView例子:
    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
      if int(item.Index div 2) = int((item.Index+1) div 2) then begin
        Sender.Canvas.Brush.Color:=$00FFEEDD;
      end else begin
        Sender.Canvas.Brush.Color:=clWhite;
      end;end;