如题,如何使窗体水平翻转显示呢?
实在有困难的话如何使窗体中的RichTextBox中的文字水平翻转(镜像)显示呢?想要的效果:

解决方案 »

  1.   

    这个 可以做的时候思考。 相对不会复杂
    ------------------------
    其他的 可以参考这个
    http://www.cnblogs.com/cai9911/archive/2006/10/07/522964.html
      

  2.   

    public Form1()
    {
        InitializeComponent();
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.TranslateTransform(0, this.ClientRectangle.Height / 2);  //<--
        e.Graphics.ScaleTransform(1, -1);                                   //<--
        e.Graphics.TranslateTransform(0, -this.ClientRectangle.Height / 2); //<--    string s = "如题,如何使窗体水平翻转显示呢?实在有困难的话如何使窗体中的RichTextBox中的文字水平翻转(镜像)显示呢?";
        e.Graphics.DrawString(s, this.Font, Brushes.Black, this.ClientRectangle);
    }
      

  3.   


    这个我知道,但是如何使整个窗体或者RTB中的文字仅水平翻转呢?
    希望大牛不吝赐教?
      

  4.   

    整个窗体抓图然后变换后绘制。
    GDI+操作详细范例可以看我的下载
      

  5.   

        e.Graphics.TranslateTransform(this.ClientRectangle.Width/2, 0);  //<--
        e.Graphics.ScaleTransform(-1, +1);                               //<--
        e.Graphics.TranslateTransform(-this.ClientRectangle.Height/2, 0);//<--
      

  6.   

    如果抓图后重绘,那么RTB中的文字还能够编辑吗?
      

  7.   

    那就不行啊,我想改造我们单位的提词器,需要镜像显示,这样才能在镜子里看到正常的图像,还需要编辑RTB中的文字。
      

  8.   


    如何使RTB中的文字翻转呢?如果能使整个窗体翻转最好,就和我顶楼发的图那样的?我看到过很多大头贴软件,整个程序自己可以翻转的解决问题后再加200分,一共500分嘿嘿
      

  9.   

    public partial class Form1 : Form
    {
        MirrorForm mirror = new MirrorForm();
        RichTextBox rtb = new RichTextBox();
        public Form1()
        {
            InitializeComponent();
                
            rtb.Text = "hello world";
            rtb.TextChanged += new EventHandler(rtb_TextChanged);
            this.Controls.Add(rtb);        mirror.Size = this.Size;
            mirror.Show(this);
            mirror.Location = new Point(this.Location.X - this.Width, this.Location.Y);        this.Move += delegate { mirror.Location = new Point(this.Location.X - this.Width, this.Location.Y); };
            this.Shown += delegate { MessageBox.Show(""); rtb_TextChanged(this, EventArgs.Empty); };
        }    void rtb_TextChanged(object sender, EventArgs e)
        {
            Bitmap bmp = new Bitmap(this.Width, this.Height);
            using (Graphics g = Graphics.FromImage(bmp))
            {
                g.CopyFromScreen(this.Location, Point.Empty, this.Size);
            }
            bmp.RotateFlip(RotateFlipType.RotateNoneFlipX);   //<---        mirror.image = bmp;
            mirror.Refresh();
        }
    }public class MirrorForm : Form
    {
        public Bitmap image { get; set; }
        public MirrorForm()
        {
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            if (image != null) e.Graphics.DrawImageUnscaled(image, Point.Empty);
        }
    }
      

  10.   

    12楼这个有点意思了,能直接在镜像的窗体上编辑吗?
    这个其实也是对窗体取快照然后翻转。要求再简单点,如何使窗体中的RTB控件中的文字翻转呢?不知道能否实现?即RTB显示的文字是翻转的,并且可以在上面直接编辑。点击翻转按钮文字恢复正常,所编辑的的文字和格式不丢失,再点击按钮变为镜像,所编辑的文字和格式不丢失?
      

  11.   

    截图显示为翻转看上去虽然实现了窗体翻转功能,但是窗体按钮等控件的功能无法在截图中实现,这可以说是一个伪翻转。有没有真正的翻转窗体或者RTB控件内容的方法呢?
      

  12.   

    C# GDI+ 文字效果
    C# 图片特效
      

  13.   

    可以HOOK GDI32.DLL 找到里面绘制屏幕DC的地方,翻转后输出
      

  14.   

    说起来简单,详细的我也不知道
    这只是一条可能的路,
    搜一搜 HOOK GDI 等等
    多是用于屏幕捕获的,也许能实现你这个要求
      

  15.   

    http://topic.csdn.net/u/20110418/10/29e38243-c17a-40b9-9506-e0e1cafbe324.html看来这个问题不容易啊,一共发了500分的帖子,还没有搞定~~~~~
      

  16.   

    一、投影文字 private void Form1_Paint(object sender, PaintEventArgs e)
            {
                //投影文字
                Graphics g = this.CreateGraphics();
                //设置文本输出质量
                g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                g.SmoothingMode = SmoothingMode.AntiAlias;
                Font newFont = new Font("Times New Roman", 48);
                Matrix matrix = new Matrix();
                //投射
                matrix.Shear(-1.5f, 0.0f);
                //缩放
                matrix.Scale(1, 0.5f);
                //平移
                matrix.Translate(130, 88);
                //对绘图平面实施坐标变换、、
                g.Transform = matrix;
                SolidBrush grayBrush = new SolidBrush(Color.Gray);
                SolidBrush colorBrush = new SolidBrush(Color.BlueViolet);
                string text = "MINGRISOFT";
                //绘制阴影
                g.DrawString(text, newFont, grayBrush, new PointF(0, 30));
                g.ResetTransform();
                //绘制前景
                g.DrawString(text, newFont, colorBrush, new PointF(0, 30));
            }
    二、倒影文字private void Form1_Paint(object sender, PaintEventArgs e)
            {
                //倒影文字
                Brush backBrush = Brushes.Gray;
                Brush foreBrush = Brushes.Black;
                Font font = new Font("幼圆", Convert.ToInt16(40), FontStyle.Regular);
                Graphics g = this.CreateGraphics();
                string text = "MINGRISOFT";
                SizeF size = g.MeasureString(text, font);
                int posX = (this.Width - Convert.ToInt16(size.Width)) / 2;
                int posY = (this.Height - Convert.ToInt16(size.Height)) / 2;
                g.TranslateTransform(posX, posY);
                int ascent = font.FontFamily.GetCellAscent(font.Style);
                int spacing = font.FontFamily.GetLineSpacing(font.Style);
                int lineHeight = System.Convert.ToInt16(font.GetHeight(g));
                int height = lineHeight * ascent / spacing;
                GraphicsState state = g.Save();
                g.ScaleTransform(1, -1.0F);
                g.DrawString(text, font, backBrush, 0, -height);
                g.Restore(state);
                g.DrawString(text, font, foreBrush, 0, -height);
            }
    旋转文字private void Form1_Paint(object sender, PaintEventArgs e)
            {
                //旋转显示文字
                Graphics g = e.Graphics;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                for (int i = 0; i <= 360; i += 10)
                {    
                    //平移Graphics对象到窗体中心
                    g.TranslateTransform(this.Width / 2, this.Height / 2);
                    //设置Graphics对象的输出角度
                    g.RotateTransform(i);
                    //设置文字填充颜色
                    Brush brush = Brushes.DarkViolet;
                    //旋转显示文字
                    g.DrawString("......MINGRISOFT", new Font("Lucida Console", 11f), brush, 0, 0);
                    //恢复全局变换矩阵
                    g.ResetTransform();
                }
            }
    印版文字       private void Form1_Paint(object sender, PaintEventArgs e)
            {
                //印版文字
                int i = 0;
                Brush backBrush = Brushes.Black;
                Brush foreBrush = Brushes.Violet;
                Font font = new Font("Times New Roman", System.Convert.ToInt16(40), FontStyle.Regular);
                Graphics g = this.CreateGraphics();
                g.Clear(Color.White);
                string text = "MINGRISOFT";
                SizeF size = g.MeasureString(text, font);
                Single posX = (this.Width - Convert.ToInt16(size.Width)) / 2;
                Single posY = (this.Height - Convert.ToInt16(size.Height)) / 3;
                while (i < Convert.ToInt16(20))
                {
                    g.DrawString(text, font, backBrush, posX - i, posY + i);
                    i = i + 1;
                }
                g.DrawString(text, font, foreBrush, posX, posY);
            }
      

  17.   

    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Drawing;class SourceForm:Form
    {
        RichTextBox txtBox;
        public Control SourceControl{
            get{return txtBox;}
        }
        public DestForm DestForm{
    get;
    set;
        }
        public SourceForm()
        {
            txtBox = new RichTextBox();
            txtBox.Dock = DockStyle.Fill;

    this.FullScreen();
    Left = 0;
    FormBorderStyle = FormBorderStyle.None;
            
    txtBox.KeyUp += (s,e)=>{
        switch (e.KeyCode)
        {
    case Keys.Escape:
        DestForm.Close();
        break;
    case Keys.F4:
        DestForm.MirrorState = !DestForm.MirrorState ;
        Left = DestForm.MirrorState?4000:0;
        break;
        }
    };
    Text = "Source";
            Controls.Add (txtBox);

        }
    }
    class DestForm:Form
    {
        [DllImport("user32.dll")]
        static extern IntPtr GetDC(IntPtr wnd);
        [DllImport("user32.dll")]
        static extern bool ReleaseDC(IntPtr wnd,IntPtr hdc);    [DllImport("gdi32.dll")]
        static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,
            int nWidthDest, int nHeightDest,
            IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,
            uint dwRop);    const uint SRCCOPY = 0x00CC0020;
        
        Timer timer;
        void SetDock (Control ctrl){
            ctrl.Height = Height - 60;
            ctrl.Width = Width;
            ctrl.Anchor = AnchorStyles.Top|AnchorStyles.Bottom|AnchorStyles.Left|AnchorStyles.Right;
        }
        SourceForm srcForm;
        public DestForm(SourceForm srcForm)
        {
            this.srcForm = srcForm;
    srcForm.DestForm = this;
            srcForm.Show ();
            this.FullScreen();
    TopMost = false;
            timer = new Timer();        Text = "Mirror";
            
            GotFocus  += (s,e)=> srcForm.SourceControl.Focus();
            
            timer.Interval =1;
            timer.Enabled = true;
            timer.Tick += (s, e) =>CapSrcFormAndMirror();
            
        }
        
        public bool MirrorState {
            get;
            set;
        }    void CapSrcFormAndMirror()
        {
    var width = srcForm.SourceControl.Width;
    var height = srcForm.SourceControl.Height;
    srcForm.SourceControl.Invalidate ();
            using (var g = CreateGraphics())
            {
                var srcDc = GetDC(srcForm.SourceControl.Handle);
                var dstDc = g.GetHdc();
                
                if (MirrorState)
                    StretchBlt(dstDc, 0, 0, width , height, srcDc, width - 1, 0, -width , height, SRCCOPY);
                else
                    StretchBlt(dstDc, 0, 0, width, height, srcDc, 0, 0, width , height, SRCCOPY);
                    
                g.ReleaseHdc();
                ReleaseDC(srcForm.SourceControl.Handle, srcDc);
            }
        }
    }static class program
    {
        public static void FullScreen (this Form frm){
    frm.StartPosition = FormStartPosition.Manual;
    frm.FormBorderStyle = FormBorderStyle.None;
    frm.Size = Screen.PrimaryScreen.Bounds .Size;
    frm.Location = new Point (0,0);
        }
        static void Main()
        {
            Application.Run(new DestForm(new SourceForm()));
        }
    }仍然是截图;运行初始无镜像全屏,F4切换镜像,可以输
    入文字,Esc退出(不要按Alt+F4否则会崩溃),修正了内
    存泄露我连续跑了30多分钟内存耗用稳定在17M左右缺点在于反转模式下鼠标点击无效(其实就是把源窗体
    移到了屏幕外).我没有设字体,如果需要rtf格式化过的文
    本的话可以用写字板编辑后粘贴进去.至于需要滚动啥的
    你自己加了
      

  18.   

    代码还是有点问题,源窗体全屏后RTB控件不能全屏,如果将frm.WindowState设置为Max的话RTB的Dock属性Fill能使RTB全屏,但是按F4出不来镜像窗体。
    我不懂这个绘图,能否再提示一下?
      

  19.   


    哈哈,不错,参考你的方法解决了,很好,比截图效率高很多。
    我参考你发的倒影文字,然后将坐标重新转换了一下,完美解决,连文字的顺序都不用代码去翻转。先结了这个帖子。有问题再发帖问。今天下午再好好研究一下GDI+,看来很有用啊
      

  20.   

    这几天有想到了一个更加简单的方法,专程发布解决方案,希望对遇到类似问题的朋友所有帮助:解决方案:WPF坐标变换,两行代码搞定!
    效果图: