⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textgraphics.cs

📁 c#源代码
💻 CS
字号:
// ---------------------------------------------------------
// Windows Forms CommandBar Control
// Copyright (C) 2001-2003 Lutz Roeder. All rights reserved.
// http://www.aisto.com/roeder
// roeder@aisto.com
// ---------------------------------------------------------
namespace Reflector.UserInterface
{
	using System;
	using System.Drawing;
	using System.Runtime.InteropServices;

	internal class TextGraphics : IDisposable
	{
		private Graphics graphics;
		private IntPtr graphicsHandle;

		public TextGraphics(Graphics graphics)
		{
			this.graphics = graphics;
			this.graphicsHandle = graphics.GetHdc();
		}

		public TextGraphics(IntPtr graphicsHandle)
		{
			this.graphics = null;
			this.graphicsHandle = graphicsHandle;
		}

		public void Dispose()
		{
			if (this.graphics != null)
			{
				this.graphics.ReleaseHdc(this.graphicsHandle);
				this.graphics = null;
			}

			this.graphicsHandle = IntPtr.Zero;
		}

		public Size MeasureText(string text, Font font)
		{
			IntPtr fontHandle = font.ToHfont();
			IntPtr oldFontHandle = NativeMethods.SelectObject(this.graphicsHandle, fontHandle);
			
			Size size = this.MeassureTextInternal(text);

			NativeMethods.SelectObject(this.graphicsHandle, oldFontHandle);
			NativeMethods.DeleteObject(fontHandle);

			return size;
		}

		public void DrawText(string text, Point point, Font font, Color foreColor)
		{
			IntPtr fontHandle = font.ToHfont();
			IntPtr oldFontHandle = NativeMethods.SelectObject(this.graphicsHandle, fontHandle);
		
			int oldBkMode = NativeMethods.SetBkMode(this.graphicsHandle, NativeMethods.TRANSPARENT);
			int oldTextColor = NativeMethods.SetTextColor(this.graphicsHandle, Color.FromArgb(0, foreColor.R, foreColor.G, foreColor.B).ToArgb());

			Size size = this.MeassureTextInternal(text);

			NativeMethods.RECT clip = new NativeMethods.RECT();
			clip.left = point.X;
			clip.top = point.Y;
			clip.right = clip.left + size.Width;
			clip.bottom = clip.top + size.Height;
		
			// ExtTextOut does not show Mnemonics highlighting.
			NativeMethods.DrawText(this.graphicsHandle, text, text.Length, ref clip, NativeMethods.DT_SINGLELINE | NativeMethods.DT_LEFT);

			NativeMethods.SetTextColor(this.graphicsHandle, oldTextColor);
			NativeMethods.SetBkMode(this.graphicsHandle, oldBkMode);
	
			NativeMethods.SelectObject(this.graphicsHandle, oldFontHandle);
			NativeMethods.DeleteObject(fontHandle);
		}


		private Size MeassureTextInternal(string text)
		{
			NativeMethods.RECT rect = new NativeMethods.RECT();
			rect.left = 0;
			rect.right = 0;
			rect.top = 0;
			rect.bottom = 0;
			
			// ExtTextOut does not show Mnemonics highlighting.
			NativeMethods.DrawText(this.graphicsHandle, text, text.Length, ref rect, NativeMethods.DT_SINGLELINE | NativeMethods.DT_LEFT | NativeMethods.DT_CALCRECT);

			return new Size(rect.right, rect.bottom);
		}

		private sealed class NativeMethods
		{
			private NativeMethods()
			{
			}

			public const int TRANSPARENT = 1;
			public const int OPAQUE = 2;

			[StructLayout(LayoutKind.Sequential)]
			public struct RECT
			{
				public int left;
				public int top;
				public int right;
				public int bottom;
			}

			[DllImport("gdi32.dll")]
			public extern static int SetBkMode(IntPtr hdc, int iBkMode);
	
			[DllImport("gdi32.dll")]
			public extern static int SetTextColor(IntPtr hdc, int crColor);
	
			[DllImport("gdi32.dll")]
			public extern static IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);

			[DllImport("gdi32.dll", ExactSpelling=true)]
			public static extern bool DeleteObject(IntPtr hObject);

			public const int DT_SINGLELINE = 0x20;
			public const int DT_LEFT = 0x0;
			public const int DT_VCENTER = 0x4;
			public const int DT_CALCRECT = 0x400;

			[DllImport("user32.dll", CharSet=CharSet.Auto)]
			public extern static int DrawText(IntPtr hdc, string lpString, int nCount, ref RECT lpRect, int uFormat);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -