如何使窗体水平翻转(镜像)显示呢

yalan 2011-05-13 11:12:48
如题,如何使窗体水平翻转显示呢?
实在有困难的话如何使窗体中的RichTextBox中的文字水平翻转(镜像)显示呢?

想要的效果:
...全文
1707 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
comana 2012-12-01
  • 打赏
  • 举报
回复
引用 31 楼 yalan 的回复:
这几天有想到了一个更加简单的方法,专程发布解决方案,希望对遇到类似问题的朋友所有帮助: 解决方案:WPF坐标变换,两行代码搞定! 效果图:
你好,请告知详细方法,多谢!
ykdy100 2011-06-18
  • 打赏
  • 举报
回复
这么一个简单的问题,当初我因为大头贴机上需要用,所以在网上遍寻答案,到市面找寻了好多电脑安装公司、和电器维修的,希望能用软件、硬件、或改变显示器电路的办法竟然都无人能解决。最终还是我自己解决了,其实好简单!屏幕显示镜像翻转就行了,包括前后和水平翻转。
yalan 2011-06-18
  • 打赏
  • 举报
回复
你不是用程序翻转的?
yalan 2011-05-20
  • 打赏
  • 举报
回复
这几天有想到了一个更加简单的方法,专程发布解决方案,希望对遇到类似问题的朋友所有帮助:

解决方案:WPF坐标变换,两行代码搞定!
效果图:
yalan 2011-05-16
  • 打赏
  • 举报
回复
代码还是有点问题,源窗体全屏后RTB控件不能全屏,如果将frm.WindowState设置为Max的话RTB的Dock属性Fill能使RTB全屏,但是按F4出不来镜像窗体。
我不懂这个绘图,能否再提示一下?
叫我三三 2011-05-16
  • 打赏
  • 举报
回复
我来学习的,说不定以后会用到
yalan 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 zaiduxinling 的回复:]
呵呵 ,理解错了。
[/Quote]

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

今天下午再好好研究一下GDI+,看来很有用啊
ChrisAK 2011-05-14
  • 打赏
  • 举报
回复
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格式化过的文
本的话可以用写字板编辑后粘贴进去.至于需要滚动啥的
你自己加了
让爱延续 2011-05-14
  • 打赏
  • 举报
回复
呵呵 ,理解错了。
让爱延续 2011-05-14
  • 打赏
  • 举报
回复
一、投影文字

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

yalan 2011-05-14
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110418/10/29e38243-c17a-40b9-9506-e0e1cafbe324.html看来这个问题不容易啊,一共发了500分的帖子,还没有搞定~~~~~
gomoku 2011-05-13
  • 打赏
  • 举报
回复
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);
}
}
yalan 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gomoku 的回复:]
引用 4 楼 yalan 的回复:
...文字仅水平翻转呢...

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

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

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

解决问题后再加200分,一共500分嘿嘿
yalan 2011-05-13
  • 打赏
  • 举报
回复
那就不行啊,我想改造我们单位的提词器,需要镜像显示,这样才能在镜子里看到正常的图像,还需要编辑RTB中的文字。
兔子-顾问 2011-05-13
  • 打赏
  • 举报
回复
显然不行
yalan 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuyazhe 的回复:]
整个窗体抓图然后变换后绘制。
GDI+操作详细范例可以看我的下载
[/Quote]
如果抓图后重绘,那么RTB中的文字还能够编辑吗?
gomoku 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yalan 的回复:]
...文字仅水平翻转呢...
[/Quote]
e.Graphics.TranslateTransform(this.ClientRectangle.Width/2, 0); //<--
e.Graphics.ScaleTransform(-1, +1); //<--
e.Graphics.TranslateTransform(-this.ClientRectangle.Height/2, 0);//<--
兔子-顾问 2011-05-13
  • 打赏
  • 举报
回复
整个窗体抓图然后变换后绘制。
GDI+操作详细范例可以看我的下载
yalan 2011-05-13
  • 打赏
  • 举报
回复
如果能做到整个窗体翻转,就和我图上的样子,再加200分
yalan 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gomoku 的回复:]
C# code
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.TranslateTransform(0, this.ClientRectangle.Height / 2); //<--
e.Gr……
[/Quote]

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

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧