#html #.net #webbrowser-control
#HTML #.net #веб-браузер-управление
Вопрос:
Мне нужно придумать способ ставить водяные знаки на пользовательский HTML-код и отображать его пользователю.
Я поиграл с изменением HTML, установив фоновое изображение, но решение не сработало, если какой-либо html-элемент содержал цвет фона или изображение.
Итак, я подумал, что было бы проще отобразить HTML в элементе управления веб-браузера и поставить водяной знак на элементе управления. Мальчик, я был неправ.
Я попытался создать пользовательский элемент управления и получить его из WebBrowser и перезаписать метод paint. Это не сработало.
Следующей идеей было просто рисовать поверх элемента управления webbrowser.
вот что у меня получилось. В этом примере я поместил в форму ярлык, элемент управления webbrowser и два графических поля. Я создаю изображение и устанавливаю его в оба графических поля. Я поместил одно графическое поле поверх метки, а другое поверх водяного знака.
Поле с картинками над меткой отображалось так, как я ожидал, но поле с картинками над элементом управления webbrowser — нет.
У меня закончились идеи. Есть предложения?
public partial class Form1 : Form
{
string WatermarkText = "Confidential";
Font WatermarkFont = new Font("Microsoft Sans Serif", 24, FontStyle.Bold);
int WatermarkAngle = 45;
Color WatermarkColor = Color.PaleTurquoise;
public Form1()
{
InitializeComponent();
AllowTransparency = true;
label1.AutoSize = false;
label1.Text = "Test Text";
label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
webBrowser1.Navigate("http://www.google.com");
var img = creategraphics(WatermarkText);
label1.Size = pictureBox2.Size = pictureBox1.Size = img.Size;
label1.Controls.Add(pictureBox1);
pictureBox1.Image = img;
pictureBox1.BackColor = Color.Transparent;
pictureBox1.Location = new Point(0, 0);
webBrowser1.Controls.Add(pictureBox2);
pictureBox2.Image = img;
pictureBox2.BackColor = Color.Transparent;
pictureBox2.Location = new Point(0, 0);
}
Image creategraphics(string text)
{
if (String.IsNullOrWhiteSpace(text)) return null;
var size = getWatermarkSize(text, WatermarkAngle, WatermarkFont, out double hypotenuse);
var img = new Bitmap(size.Width, size.Height);
var g = Graphics.FromImage(img);
var brush = new SolidBrush(WatermarkColor);
var stringFormat = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
g.RotateTransform((float)-WatermarkAngle);
g.DrawString(text, WatermarkFont, brush, new Point(0, (int)hypotenuse / 2), stringFormat);
return img;
}
private static Size getWatermarkSize(string text, int angle, Font font, out double hypotenuse)
{
if (angle > 90) throw new ArgumentOutOfRangeException("angle");
using (var bitmap = new Bitmap(1, 1))
using (var graphics = Graphics.FromImage(bitmap))
{
var size = graphics.MeasureString(text, font);
hypotenuse = size.Width size.Height;
double radians = (angle / 180.0) * Math.PI;
var width = (Math.Cos(radians) * size.Width) (Math.Sin(radians) * size.Height);
var height = (Math.Cos(radians) * size.Height) (Math.Sin(radians) * size.Width);
return new Size((int)width, (int)height);
}
}
}
Это то, что я получаю