此菜单按键是一行一行改变RICHEDIT中字体的颜色和背景色的。
原先我只改变字体颜色时用了REFile.SelAttributes.Color来做,那时快捷键还是有效的。
但再要改变背景色时我采用了“S.F.(吃青春饭的) ”的代码(通过发送消息),快捷键就不能改变任何颜色,但直接按菜单按键却又可以。
代码如下:
uses
   UAbout,UFileName,richedit;procedure TFMainC.ColorChange(k:integer;FontColor,BackColor:TColor);
var
   Start,Startback,j:integer;
   Fmt :TCharFormat2;
begin
   Startback:=REFile.SelStart;
   Start:=0;
   for j:=0 to REFile.Lines.Count-1 do
   begin
      if j=k then
      begin
         REFile.SelStart:=Start;
         REFile.SelLength:=Length(REFile.Lines.Strings[j]);
         Fmt.cbSize := SizeOf(Fmt);//这里放传递的结构大小,系统通过这个知道传递的是CharFormat还是CharFormat2
         Fmt.dwMask := CFM_COLOR or CFM_BACKCOLOR;//告诉系统只有字体颜色和背景颜色两个字段的值有效
         Fmt.crTextColor:= FontColor;//设置字体颜色
         Fmt.crBackColor:= BackColor;//设置字体背景色
         REFile.Perform(EM_SETCHARFORMAT,SCF_SELECTION,integer(@Fmt));//发EM_SETCHARFORMAT消息给RichEdit,表示只有选择部分加背景颜色
         REFile.SelLength:=0;
         break;
      end;
      Start:=Start+Length(REFile.Lines.Strings[j])+2;
   end;
   REFile.SelStart:=Startback;
end;procedure TFMainC.Broswer1;
begin
   while REFile.Lines.Strings[i]='' do
      i:=i+1;
   ColorChange(last,clBlack,clWhite);
   ColorChange(i,clRed,clBlue);
   last:=i;   i:=i+1;
   if i=REFile.Lines.Count then
   begin
      i:=0;
      FFileName.MDialog.Caption:='提示';
      FFileName.MDialog.Text:='全文扫描完毕!';
   end;
end;procedure TFMainC.NBroswer1Click(Sender: TObject);
begin
   NBroswer1.Checked:=true;
   Broswer1;
end;
大虾帮忙!

解决方案 »

  1.   

    郁闷ing!
    怎么用了EM_SETCHARFORMAT消息就跟快捷键有冲突呢?
      

  2.   

    你是说调用 NBroswer1Click 的时候发现这个问题的吗?是焦点的问题吧;我这里试了你的代码没出现这个情况;快捷键是定义于菜单项的;是ctrl+b ,在事件中这样写的 ColorChange(1,clBlue,clRed);
     refile.SetFocus; //聚焦
    另外,关于不同大小的字体导致行的计算不准确的问题;你可以修改代码为这样
    procedure TForm1.ChangeLineColor(row:integer;FontColor,BackColor:TColor);var
       Start,Startback,j:integer;
       Fmt :TCharFormat2;
    begin
      REFile.WordWrap :=false; //让组件自动换行机制停止掉
       Startback:=REFile.SelStart;
       Start:=0;
       for j:=0 to REFile.Lines.Count-1 do
       begin
          if j=row then
          begin
             REFile.SelStart:=Start;
             REFile.SelLength:=Length(REFile.Lines.Strings[j]);
             Fmt.cbSize := SizeOf(Fmt);//这里放传递的结构大小,系统通过这个知道传递的是CharFormat还是CharFormat2
             Fmt.dwMask := CFM_COLOR or CFM_BACKCOLOR;//告诉系统只有字体颜色和背景颜色两个字段的值有效
             Fmt.crTextColor:= FontColor;//设置字体颜色
             Fmt.crBackColor:= BackColor;//设置字体背景色
             REFile.Perform(EM_SETCHARFORMAT,SCF_SELECTION,integer(@Fmt));//发EM_SETCHARFORMAT消息给RichEdit,表示只有选择部分加背景颜色
             REFile.SelLength:=0;
             break;
          end;
          Start:=Start+Length(REFile.Lines.Strings[j])+2;
       end;
       REFile.SelStart:=Startback;
      REFile.WordWrap :=true; //重新启动自动换行
    end;
      

  3.   

    更加怪了,什么都不能实现了。连字体颜色都改变不了!可以认真帮我看看吗?
    //改变RICHEDIT其中一行字体颜色
    procedure TFMainC.ColorChange(k:integer;FontColor,BackColor:TColor);
    var
       Start,Startback,j:integer;
       //Fmt :TCharFormat2;
    begin
       Startback:=REFile.SelStart;
       Start:=0;
       for j:=0 to REFile.Lines.Count-1 do
       begin
          if j=k then
          begin
             REFile.SelStart:=Start;
             REFile.SelLength:=Length(REFile.Lines.Strings[j]);
             {Fmt.cbSize := SizeOf(Fmt);//这里放传递的结构大小,系统通过这个知道传递的是CharFormat还是CharFormat2
             Fmt.dwMask := CFM_COLOR or CFM_BACKCOLOR;//告诉系统只有字体颜色和背景颜色两个字段的值有效
             Fmt.crTextColor:= FontColor;//设置字体颜色
             Fmt.crBackColor:= BackColor;//设置字体背景色
             REFile.Perform(EM_SETCHARFORMAT,SCF_SELECTION,integer(@Fmt)); //发EM_SETCHARFORMAT消息给RichEdit,表示只有选择部分加背景颜色}
             REFile.SelAttributes.Color:=FontColor;
             REFile.SelLength:=0;
             break;
          end;
          Start:=Start+Length(REFile.Lines.Strings[j])+2;
       end;
       REFile.SelStart:=Startback;
    end;//逐行扫描时改变颜色
    procedure TFMainC.Broswer1;
    //var
    //vScrollInfo: TScrollInfo;
    begin
       while REFile.Lines.Strings[i]='' do
          i:=i+1;
       ColorChange(last,clBlack,clWhite);
       ColorChange(i,clRed,clBlue);
       last:=i;
       //滚动条下移
       if i>10 then
       begin
       //两种发送消息的方法都行。
          {vScrollInfo.cbSize := SizeOf(vScrollInfo);
          vScrollInfo.fMask := SIF_POS;
          GetScrollInfo(REFile.Handle, SB_VERT, vScrollInfo);
          REFile.Perform(WM_VSCROLL,
          MakeLong(SB_THUMBPOSITION,vScrollInfo.nPos+Abs(REFile.Font.Height)),0);}      SendMessage(REFile.Handle,EM_SCROLL,SB_LINEDOWN,0);   end;   i:=i+1;
       if i=REFile.Lines.Count then
       begin
          i:=0;
          FFileName.MDialog.Caption:='提示';
          FFileName.MDialog.Text:='全文扫描完毕!';
          FFileName.MDialog.ShowModal;
       end;
    end;
    procedure TFMainC.NBroswer1Click(Sender: TObject);
    begin
       NBroswer1.Checked:=true;
       Broswer1;
    end;
    我的字体大小一样的,你加上那两句有什么用呢?不自动换行,对RICHEDIT有什么影响吗?