如何使窗体水平翻转(镜像)显示呢
如题,如何使窗体水平翻转显示呢?
实在有困难的话如何使窗体中的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# 图片特效
[其他解释]
这个跟12楼的实现没有本质的区别。只是需要一点举一反三的改动而已。
而且,当有双显示器的时候,只要把镜像窗口拉到另外一个显示器,不就实现了你的需求?而且是所见即所得,主窗口上的编辑立刻反映到镜像窗口上。
[其他解释]
可以HOOK GDI32.DLL 找到里面绘制屏幕DC的地方,翻转后输出
[其他解释]
说起来简单,详细的我也不知道
这只是一条可能的路,
搜一搜 HOOK GDI 等等
多是用于屏幕捕获的,也许能实现你这个要求
[其他解释]
呵呵 ,理解错了。
[其他解释]
之所以要水平翻转(镜像)显示,是为了能在镜子中看到正常的窗体和文字。
[其他解释]
这个我知道,但是如何使整个窗体或者RTB中的文字仅水平翻转呢?
希望大牛不吝赐教?
[其他解释]
如果能做到整个窗体翻转,就和我图上的样子,再加200分
[其他解释]
如果抓图后重绘,那么RTB中的文字还能够编辑吗?
[其他解释]
那就不行啊,我想改造我们单位的提词器,需要镜像显示,这样才能在镜子里看到正常的图像,还需要编辑RTB中的文字。
[其他解释]
如何使RTB中的文字翻转呢?
如果能使整个窗体翻转最好,就和我顶楼发的图那样的?我看到过很多大头贴软件,整个程序自己可以翻转的
解决问题后再加200分,一共500分嘿嘿
[其他解释]
12楼这个有点意思了,能直接在镜像的窗体上编辑吗?
这个其实也是对窗体取快照然后翻转。
要求再简单点,如何使窗体中的RTB控件中的文字翻转呢?不知道能否实现?即RTB显示的文字是翻转的,并且可以在上面直接编辑。点击翻转按钮文字恢复正常,所编辑的的文字和格式不丢失,再点击按钮变为镜像,所编辑的文字和格式不丢失?
[其他解释]
截图显示为翻转看上去虽然实现了窗体翻转功能,但是窗体按钮等控件的功能无法在截图中实现,这可以说是一个伪翻转。
有没有真正的翻转窗体或者RTB控件内容的方法呢?
[其他解释]
不行,无法达到目的啊~~~~~~
[其他解释]
不需要双显示器的,主要是在一个显示器上实现镜像文字就行了。中午搞了半天,还是不明白怎么直接翻转文字并且使文字可以编辑(我还找了半天镜像字体也没找到呵呵),能否说的再傻瓜点?我很笨,希望能得到指点
[其他解释]
能否说的更详细点吗?我不知道如何做,谢谢
[其他解释]
再顶一下,期待解决方案
[其他解释]
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坐标变换,两行代码搞定!
效果图: