我想达到的效果就是让Edit里面的文字呈现类似“水平反转”显示。图片里的Edit中显示的是“你是好人”,我就要这个显示样式。如果因为汉字是占两个字节而无法实现,那么只要能实现数字是水平反转显示也行。例如下面的图片就是“12345”的显示效果:
提供第三方控件能解决问题同样给分,直接用代码实现最好。分其实并不重要,希望朋友们不吝赐教!

解决方案 »

  1.   

    编辑一个新字体库,把数字和汉字都倒过来放,然后edit设置为右对齐就可以了
      

  2.   

    4楼的朋友,不是搞验证码。这个确实与镜子有关,我的程序编写好了后人不能直接看,而是要通过镜子看,镜子里面看东西是水平反转的,所以我要在程序里把界面也改成水平反转的。图片水平反转当然容易,但对于Edit怎么能水平反转显示呢?当然,如果能用Canvas.TextOut()方法画出来也行,关键是不知道如何画?
      

  3.   

    就是TEdit,没有其它控件?
    到BCB版去问吧,200分,我帮你. 不管数字还是汉字.
      

  4.   

    我习惯用BCB, 如果要D的代码, 那就算了
      

  5.   

    BCB是什么东西?与D有关连吗?我问的这个问题是上级让我考虑的一个问题,但不要求必须做出来,所以我这个问题并不是急需。你如果想要分,我可以给你分(如果这个问题最终没人可以解答的话)。如果得到了我想要的答案,并且完全符合要求,我一定会加分。
      

  6.   

    就是13楼的思路.既然楼主不知BCB为何物, 想必我给代码你也看不懂.
    偶然来D版看到了这个问题,比较有兴趣才准备伸手,lz的分还是自己留着吧.
    我倒是想看看谁能给你解答.btw:以前有个同事,比我先跳槽.他学Delphi我学BCB,有一次遇到,他用很不屑的语气对我说,
    学CB干什么,VCL都是Delphi语言开发的.如果再见面我会说,学Delphi干什么,Windows都是
    C语言开发的.
      

  7.   

    谢谢楼上朋友的指教。我可能是见识比较短,BCB到底是什么语言?
    你说“我倒是想看看谁能给你解答”,如果真没人可以解答的话,我已经说过处理办法了,另加一条,顶者有分。目前我已经想到了(原创)一种方法可以实现,基本上不用写什么代码。就是用Delphi内嵌网页(用流动态生成)中的<input type=text...来实现,通过操控网页来控制显示,已经达到了要求,只是效果不如Edit来得直接。。如果有人需要这段代码,请加QQ:5555044或群:37802783 。代码放到手里面发不了财,知识是共享的,欢迎大家一起交流。另外,据说用API函数GetGlyphOutline可以实现,目前正在研究中。
      

  8.   

    http://www.udiab.com.cn/这个网页就是你要的效果,不过D代码不知道怎么实现,把他的页面代码下下来看看通过什么原理实现的。
      

  9.   

    看到这么多人都没有一个愿意贴代码,就自己随便写了一个.
    不过有些闪烁,是因为有些消息没有处理造成的.效率也很低.
    自己处理一下吧(仅供参考). 
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMyEdit = class(TEdit)
      protected
        procedure WndProc(var Msg: TMessage); override;
      end;  TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TMyEdit }procedure TMyEdit.WndProc(var Msg: TMessage);
    var
      tmpCanvas: TControlCanvas;
      tmpBmp   : TBitmap;
      i, j: integer;
    begin
      if Msg.Msg = WM_PAINT then
      begin
        tmpBmp   := TBitmap.Create;
        tmpCanvas:= TControlCanvas.Create;    try
          tmpCanvas.Control:= self;      tmpBmp.Width := Width;
          tmpBmp.Height:= Height;      tmpBmp.Canvas.Brush.Color:= clWhite;
          tmpBmp.Canvas.FillRect(Self.BoundsRect);      tmpBmp.Canvas.Font.Assign(Font);
          tmpBmp.Canvas.TextOut(5, 5, Self.Text);      for i:= 1 to tmpBmp.Height - 1 do
          begin
            for j:= tmpBmp.Width - 1 downto 1 do
              tmpCanvas.Pixels[Width - j, i]:= tmpBmp.Canvas.Pixels[j, i]
          end;
        finally
          FreeAndNil(tmpBmp);
          FreeAndNil(tmpCanvas);
        end;
      end
      else
        inherited;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      edtTest: TMyEdit;
    begin
      edtTest:= TMyEdit.Create(nil);  edtTest.Parent:= self;
      edtTest.Left   := 0;
      edtTest.Top    := 0;  edtTest.Visible:= true;
    end;end.
      

  10.   

    字体镜像就是我在16楼所说的API函数GetGlyphOutline来实现。我找到一段C++代码是用GetGlyphOutline做出的镜像文字,不过我无法将它转为Delphi代码。而18楼的这种方法我想把它转为C++中MFC对话框类型中的代码,更不会。
      

  11.   

    如果能将18楼的
     else
        inherited;
    改为调用TEdit中原来的消息就可以了。可是不知道如何修改。现在主要的问题是该Edit不能执行全选所达到的那种效果。
      

  12.   

    把18楼的代码:
    edtTest:= TMyEdit.Create(nil);
    edtTest.Font.Color:= clWhite;//加个颜色....
    tmpBmp.Canvas.Font.Assign(Font);
    tmpBmp.Canvas.Font.Color:= clBlack;//加个颜色效果稍微好一点。 
      

  13.   

    目前我将此句改为:
    tmpBmp.Canvas.Brush.Style:=bsClear;另外屏蔽了一些鼠标消息,这样鼠标放上去就不会那么闪了。但就是无法使上面的文字处于选中状态的效果。另外就是无法出现输入光标。