首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么使窗体水平翻转(镜像)显示呢

2012-12-20 
如何使窗体水平翻转(镜像)显示呢如题,如何使窗体水平翻转显示呢?实在有困难的话如何使窗体中的RichTextBox

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

想要的效果:

[最优解释]
一、投影文字


 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);
        }


[其他解释]
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);
    }
}


[其他解释]
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);
}

[其他解释]
引用:
...文字仅水平翻转呢...

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

[其他解释]
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
[其他解释]
这个 可以做的时候思考。 相对不会复杂
------------------------
其他的 可以参考这个
http://www.cnblogs.com/cai9911/archive/2006/10/07/522964.html
[其他解释]
整个窗体抓图然后变换后绘制。
GDI+操作详细范例可以看我的下载
[其他解释]
显然不行
[其他解释]
C# GDI+ 文字效果


C# 图片特效
[其他解释]

引用:
...
要求再简单点,如何使窗体中的RTB控件中的文字翻转呢?不知道能否实现?即RTB显示的文字是翻转的,并且可以在上面直接编辑。点击翻转按钮文字恢复正常,所编辑的的文字和格式不丢失,再点击按钮变为镜像,所编辑的文字和格式不丢失?

这个跟12楼的实现没有本质的区别。只是需要一点举一反三的改动而已。

而且,当有双显示器的时候,只要把镜像窗口拉到另外一个显示器,不就实现了你的需求?而且是所见即所得,主窗口上的编辑立刻反映到镜像窗口上。
[其他解释]
可以HOOK GDI32.DLL 找到里面绘制屏幕DC的地方,翻转后输出
[其他解释]
说起来简单,详细的我也不知道
这只是一条可能的路,
搜一搜 HOOK GDI 等等


多是用于屏幕捕获的,也许能实现你这个要求

[其他解释]
呵呵 ,理解错了。
[其他解释]
之所以要水平翻转(镜像)显示,是为了能在镜子中看到正常的窗体和文字。
[其他解释]

引用:
C# code
public Form1()
{
    InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
    e.Graphics.TranslateTransform(0, this.ClientRectangle.Height / 2);  //<--
    e.Gr……


这个我知道,但是如何使整个窗体或者RTB中的文字仅水平翻转呢?
希望大牛不吝赐教?
[其他解释]
如果能做到整个窗体翻转,就和我图上的样子,再加200分
[其他解释]
引用:
整个窗体抓图然后变换后绘制。
GDI+操作详细范例可以看我的下载

如果抓图后重绘,那么RTB中的文字还能够编辑吗?
[其他解释]
那就不行啊,我想改造我们单位的提词器,需要镜像显示,这样才能在镜子里看到正常的图像,还需要编辑RTB中的文字。
[其他解释]
引用:
引用:
...文字仅水平翻转呢...

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


如何使RTB中的文字翻转呢?

如果能使整个窗体翻转最好,就和我顶楼发的图那样的?我看到过很多大头贴软件,整个程序自己可以翻转的

解决问题后再加200分,一共500分嘿嘿
[其他解释]
12楼这个有点意思了,能直接在镜像的窗体上编辑吗?
这个其实也是对窗体取快照然后翻转。

要求再简单点,如何使窗体中的RTB控件中的文字翻转呢?不知道能否实现?即RTB显示的文字是翻转的,并且可以在上面直接编辑。点击翻转按钮文字恢复正常,所编辑的的文字和格式不丢失,再点击按钮变为镜像,所编辑的文字和格式不丢失?
[其他解释]
截图显示为翻转看上去虽然实现了窗体翻转功能,但是窗体按钮等控件的功能无法在截图中实现,这可以说是一个伪翻转。

有没有真正的翻转窗体或者RTB控件内容的方法呢?
[其他解释]
引用:
C# GDI+ 文字效果


C# 图片特效


不行,无法达到目的啊~~~~~~
[其他解释]
引用:
而且,当有双显示器的时候,只要把镜像窗口拉到另……


不需要双显示器的,主要是在一个显示器上实现镜像文字就行了。中午搞了半天,还是不明白怎么直接翻转文字并且使文字可以编辑(我还找了半天镜像字体也没找到呵呵),能否说的再傻瓜点?我很笨,希望能得到指点
[其他解释]
引用:
可以HOOK GDI32.DLL 找到里面绘制屏幕DC的地方,翻转后输出


能否说的更详细点吗?我不知道如何做,谢谢
[其他解释]
再顶一下,期待解决方案
[其他解释]
http://topic.csdn.net/u/20110418/10/29e38243-c17a-40b9-9506-e0e1cafbe324.html看来这个问题不容易啊,一共发了500分的帖子,还没有搞定~~~~~

[其他解释]
该回复于2011-05-14 08:32:19被版主删除
[其他解释]
AnchorStyles.Bottom
[其他解释]
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格式化过的文
本的话可以用写字板编辑后粘贴进去.至于需要滚动啥的
你自己加了
[其他解释]
AnchorStyles.Left
[其他解释]

引用:
呵呵 ,理解错了。


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

今天下午再好好研究一下GDI+,看来很有用啊
[其他解释]
代码还是有点问题,源窗体全屏后RTB控件不能全屏,如果将frm.WindowState设置为Max的话RTB的Dock属性Fill能使RTB全屏,但是按F4出不来镜像窗体。
我不懂这个绘图,能否再提示一下?
[其他解释]
我来学习的,说不定以后会用到
[其他解释]
这几天有想到了一个更加简单的方法,专程发布解决方案,希望对遇到类似问题的朋友所有帮助:

解决方案:WPF坐标变换,两行代码搞定!
效果图:

热点排行