如题,如何使窗体水平翻转显示呢?
实在有困难的话如何使窗体中的RichTextBox中的文字水平翻转(镜像)显示呢?想要的效果:
实在有困难的话如何使窗体中的RichTextBox中的文字水平翻转(镜像)显示呢?想要的效果:
解决方案 »
- 求使用C# serialport接受短信的解决办法,最好有代码!
- C#实现Excel中文本框单元格之间修改公式的一个异常
- Winform 生成exe
- 用dotNet1.1 连接 sql server 2005 怎么连
- 求助:(急)asp 调用.NET DLL 出现:类不支持 Automation 操作的错误
- 为什么combobox老是报错,说是未将对象引用设置到对象的实例。可以帮我看一下吗?
- 关于HttpUtility
- 高级问题:给SqlCommand.Parameters传递多于一个参数时无效
- 又IL字节码编程成机器码由哪个程序文件完成??
- 神啦,救救我吧!C#入门菜鸟的求救!!!
- 讨论,随机数问题。关于随机数种子的!牛人请进。在线讨论
- 如何用C#读取一个qq号的好友列表
------------------------
其他的 可以参考这个
http://www.cnblogs.com/cai9911/archive/2006/10/07/522964.html
{
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);
}
这个我知道,但是如何使整个窗体或者RTB中的文字仅水平翻转呢?
希望大牛不吝赐教?
GDI+操作详细范例可以看我的下载
e.Graphics.ScaleTransform(-1, +1); //<--
e.Graphics.TranslateTransform(-this.ClientRectangle.Height/2, 0);//<--
如何使RTB中的文字翻转呢?如果能使整个窗体翻转最好,就和我顶楼发的图那样的?我看到过很多大头贴软件,整个程序自己可以翻转的解决问题后再加200分,一共500分嘿嘿
{
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);
}
}
这个其实也是对窗体取快照然后翻转。要求再简单点,如何使窗体中的RTB控件中的文字翻转呢?不知道能否实现?即RTB显示的文字是翻转的,并且可以在上面直接编辑。点击翻转按钮文字恢复正常,所编辑的的文字和格式不丢失,再点击按钮变为镜像,所编辑的文字和格式不丢失?
C# 图片特效
这只是一条可能的路,
搜一搜 HOOK GDI 等等
多是用于屏幕捕获的,也许能实现你这个要求
{
//投影文字
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);
}
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格式化过的文
本的话可以用写字板编辑后粘贴进去.至于需要滚动啥的
你自己加了
我不懂这个绘图,能否再提示一下?
哈哈,不错,参考你的方法解决了,很好,比截图效率高很多。
我参考你发的倒影文字,然后将坐标重新转换了一下,完美解决,连文字的顺序都不用代码去翻转。先结了这个帖子。有问题再发帖问。今天下午再好好研究一下GDI+,看来很有用啊
效果图: