886 lines
32 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.IO;
using System.Drawing.Drawing2D;
public class DialogGenerator
{
[DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
[DllImport("gdi32.dll")]
private static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
private const int LOGPIXELSX = 88;
private const int LOGPIXELSY = 90;
// 基础尺寸常量 (96 DPI下的尺寸当前尺寸/2)
private const int BASE_WIDTH = 450; // 900/2 = 450
private const int BASE_HEIGHT = 175; // 350/2 = 175
private const int BASE_PADDING = 15; // 30/2 = 15
private const int BASE_BUTTON_HEIGHT = 25; // 50/2 = 25
private const int BASE_BUTTON_WIDTH = 70; // 140/2 = 70
private const int BASE_INPUT_HEIGHT = 20; // 40/2 = 20
private const int BASE_SPACING = 10; // 20/2 = 10
// 实际使用的缩放尺寸
private static int DEFAULT_WIDTH;
private static int DEFAULT_HEIGHT;
private static int PADDING;
private static int BUTTON_HEIGHT;
private static int BUTTON_WIDTH;
private static int INPUT_HEIGHT;
private static int SPACING;
// 添加获取DPI缩放比例的方法
private static float GetScaleFactor()
{
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
{
IntPtr desktop = g.GetHdc();
int dpiX = GetDeviceCaps(desktop, LOGPIXELSX);
g.ReleaseHdc(desktop);
return dpiX / 96f;
}
}
// 初始化缩放尺寸的方法
private static void InitializeScaledSizes()
{
float scaleFactor = GetScaleFactor();
DEFAULT_WIDTH = (int)(BASE_WIDTH * scaleFactor);
DEFAULT_HEIGHT = (int)(BASE_HEIGHT * scaleFactor);
PADDING = (int)(BASE_PADDING * scaleFactor);
BUTTON_HEIGHT = (int)(BASE_BUTTON_HEIGHT * scaleFactor);
BUTTON_WIDTH = (int)(BASE_BUTTON_WIDTH * scaleFactor);
INPUT_HEIGHT = (int)(BASE_INPUT_HEIGHT * scaleFactor);
SPACING = (int)(BASE_SPACING * scaleFactor);
}
private static void InitializeDPIAwareness()
{
if (Environment.OSVersion.Version.Major >= 6)
{
SetProcessDPIAware();
}
}
public static DialogResult Show(string[] args)
{
InitializeScaledSizes(); // 初始化缩放尺寸
string type = GetArgumentValue(args, "-type");
string title = GetArgumentValue(args, "-title");
string content = GetArgumentValue(args, "-content");
string iconPath = GetArgumentValue(args, "-iconpath");
if (string.IsNullOrEmpty(type) || string.IsNullOrEmpty(title))
{
ShowHelp();
return DialogResult.None;
}
Form dialog = CreateBaseDialog(title);
// 设置图标
if (!string.IsNullOrEmpty(iconPath) && File.Exists(iconPath))
{
try
{
using (Bitmap bmp = new Bitmap(iconPath))
{
dialog.Icon = Icon.FromHandle(bmp.GetHicon());
}
}
catch (Exception ex)
{
MessageBox.Show("加载图标失败: " + ex.Message);
}
}
switch (type.ToLower())
{
case "message":
CreateMessageDialog(dialog, content);
break;
case "input":
CreateInputDialog(dialog, content);
break;
case "confirm":
CreateConfirmDialog(dialog, content);
break;
case "buttons":
CreateButtonsDialog(dialog, content);
break;
case "textarea":
CreateTextAreaDialog(dialog, content);
break;
default:
MessageBox.Show("不支持的对话框类型");
return DialogResult.None;
}
return dialog.ShowDialog();
}
private static Form CreateBaseDialog(string title)
{
Form dialog = new Form();
dialog.Text = title;
dialog.Width = DEFAULT_WIDTH;
dialog.Height = DEFAULT_HEIGHT;
dialog.StartPosition = FormStartPosition.CenterScreen;
dialog.AutoScaleMode = AutoScaleMode.None; // 禁用自动缩放
// 禁止调整窗口大小
dialog.FormBorderStyle = FormBorderStyle.FixedDialog;
dialog.MaximizeBox = false;
dialog.MinimizeBox = false;
float scaleFactor = GetScaleFactor();
dialog.Font = new Font("Microsoft YaHei UI", 9F * scaleFactor, FontStyle.Regular, GraphicsUnit.Pixel);
dialog.Paint += delegate(object sender, PaintEventArgs e) {
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
};
return dialog;
}
private static void CreateMessageDialog(Form dialog, string content)
{
const int MAX_CONTENT_HEIGHT = 500;
const int MIN_CONTENT_HEIGHT = 200;
int iconSize = 96;
// 先计算所需的内容高度
int requiredHeight = Math.Max(
TextRenderer.MeasureText(content,
new Font("Microsoft YaHei UI", 10F, FontStyle.Regular),
new Size(dialog.ClientSize.Width - PADDING * 3 - iconSize, int.MaxValue),
TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl
).Height + 20,
MIN_CONTENT_HEIGHT
);
int contentHeight = Math.Min(requiredHeight, MAX_CONTENT_HEIGHT);
dialog.Height = contentHeight + PADDING * 3 + BUTTON_HEIGHT;
// 创建内容面板
Panel contentPanel = new Panel
{
AutoScroll = false,
Width = dialog.ClientSize.Width - PADDING * 2,
Height = dialog.ClientSize.Height - PADDING * 3 - BUTTON_HEIGHT,
Location = new Point(PADDING, PADDING),
BackColor = SystemColors.Control
};
dialog.Controls.Add(contentPanel);
// 添加图标
PictureBox iconBox = new PictureBox
{
Width = iconSize,
Height = iconSize,
Location = new Point(0, 0),
SizeMode = PictureBoxSizeMode.Zoom,
BackColor = Color.Transparent
};
try
{
Icon sysIcon = SystemIcons.Information;
Bitmap bmp = new Bitmap(iconSize, iconSize);
using (Graphics g = Graphics.FromImage(bmp))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.DrawIcon(sysIcon, new Rectangle(0, 0, iconSize, iconSize));
}
iconBox.Image = bmp;
}
catch
{
iconBox.Visible = false;
}
contentPanel.Controls.Add(iconBox);
// 使用普通TextBox替代RichTextBox
TextBox messageBox = new TextBox
{
Text = content,
ReadOnly = true,
Multiline = true,
BorderStyle = BorderStyle.None,
BackColor = SystemColors.Control,
Location = new Point(iconSize + PADDING, 0),
Width = contentPanel.ClientSize.Width - iconSize - PADDING,
Height = contentPanel.Height,
Font = new Font("Microsoft YaHei UI", 10F, FontStyle.Regular),
WordWrap = true,
TabStop = false,
Cursor = Cursors.IBeam,
ScrollBars = requiredHeight > MAX_CONTENT_HEIGHT ? ScrollBars.Vertical : ScrollBars.None
};
// 隐藏光标但允许选择
messageBox.GotFocus += delegate(object sender, EventArgs e) {
if (messageBox.SelectionLength == 0)
{
NativeMethods.HideCaret(messageBox.Handle);
}
};
contentPanel.Controls.Add(messageBox);
// 添加确定按钮
Button okButton = CreateStyledButton("确定", DialogResult.OK);
okButton.Location = new Point(
dialog.ClientSize.Width - BUTTON_WIDTH - PADDING,
dialog.ClientSize.Height - PADDING - BUTTON_HEIGHT
);
dialog.Controls.Add(okButton);
// 确保按钮始终在最上层
okButton.BringToFront();
}
private static void CreateInputDialog(Form dialog, string content)
{
const int MAX_CONTENT_HEIGHT = 500;
const int MIN_CONTENT_HEIGHT = 200;
string[] prompts = content.Split(new[] { "|||||" }, StringSplitOptions.None);
var textBoxes = new System.Collections.Generic.List<TextBox>();
// 创建一个临时窗体和面板来准确计算高度
using (Form tempForm = new Form())
{
tempForm.Width = dialog.Width;
Panel tempPanel = new Panel
{
Width = dialog.ClientSize.Width - PADDING * 2,
AutoSize = true
};
tempForm.Controls.Add(tempPanel);
// 添加临时控件来计算实际高度
int currentY = (int)(PADDING * 1.5); // 起始位置
foreach (string prompt in prompts)
{
Label label = new Label
{
Text = prompt,
AutoSize = true,
Location = new Point(PADDING, currentY),
Font = new Font("Microsoft YaHei UI", 10F, FontStyle.Regular)
};
tempPanel.Controls.Add(label);
TextBox textBox = new TextBox
{
Width = tempPanel.Width - PADDING * 2,
Height = INPUT_HEIGHT,
Location = new Point(PADDING, currentY + label.Height + 5),
BorderStyle = BorderStyle.FixedSingle
};
tempPanel.Controls.Add(textBox);
currentY += label.Height + INPUT_HEIGHT + SPACING;
}
// 获取实际需要的高度
int totalContentHeight = currentY + PADDING; // 添加底部边距
int requiredHeight = Math.Max(totalContentHeight, MIN_CONTENT_HEIGHT);
int contentHeight = Math.Min(requiredHeight, MAX_CONTENT_HEIGHT);
// 设置对话框高度,保持原有的总体布局
dialog.Height = contentHeight + PADDING * 3 + BUTTON_HEIGHT;
// 创建实际的内容面板
Panel contentPanel = new Panel
{
AutoScroll = false,
Width = dialog.ClientSize.Width - PADDING * 2,
Height = dialog.ClientSize.Height - PADDING * 3 - BUTTON_HEIGHT,
Location = new Point(PADDING, PADDING),
BackColor = SystemColors.Control
};
// 只有当实际内容超过最大高度时才启用滚动
if (requiredHeight > MAX_CONTENT_HEIGHT)
{
contentPanel.AutoScroll = true;
contentPanel.AutoScrollMinSize = new Size(0, requiredHeight);
}
dialog.Controls.Add(contentPanel);
// 添加实际的输入控件
currentY = (int)(PADDING * 0.5);
bool needScroll = requiredHeight > MAX_CONTENT_HEIGHT;
int scrollWidth = needScroll ? SystemInformation.VerticalScrollBarWidth + 10 : 0;
foreach (string prompt in prompts)
{
Label label = new Label
{
Text = prompt,
AutoSize = true,
Location = new Point(0, currentY),
Font = new Font("Microsoft YaHei UI", 10F, FontStyle.Regular)
};
contentPanel.Controls.Add(label);
TextBox textBox = new TextBox
{
Width = contentPanel.ClientSize.Width - scrollWidth,
Height = INPUT_HEIGHT,
Location = new Point(0, currentY + label.Height + 5),
BorderStyle = BorderStyle.FixedSingle,
Font = new Font("Microsoft YaHei UI", 10F, FontStyle.Regular)
};
contentPanel.Controls.Add(textBox);
textBoxes.Add(textBox);
currentY += label.Height + INPUT_HEIGHT + SPACING;
}
}
// 添加确定按钮
Button okButton = CreateStyledButton("确定", DialogResult.OK);
okButton.Location = new Point(
dialog.ClientSize.Width - BUTTON_WIDTH - PADDING,
dialog.ClientSize.Height - PADDING - BUTTON_HEIGHT
);
// 处理确定按钮点击事件
okButton.Click += (sender, e) => {
bool hasInput = false;
foreach (var textBox in textBoxes)
{
if (!string.IsNullOrEmpty(textBox.Text))
{
hasInput = true;
break;
}
}
if (hasInput)
{
Console.Write("[");
for (int i = 0; i < textBoxes.Count; i++)
{
string value = textBoxes[i].Text ?? "";
Console.Write("\"" + value.Replace("\"", "\\\"") + "\"");
if (i < textBoxes.Count - 1)
{
Console.Write(",");
}
}
Console.Write("]");
}
else
{
Console.Write("[]");
}
};
dialog.Controls.Add(okButton);
okButton.BringToFront();
}
private static void CreateConfirmDialog(Form dialog, string content)
{
const int MAX_CONTENT_HEIGHT = 500;
const int MIN_CONTENT_HEIGHT = 200;
int iconSize = 96;
// 先计算所需的内容高度
int requiredHeight = Math.Max(
TextRenderer.MeasureText(content,
new Font("Microsoft YaHei UI", 10F, FontStyle.Regular),
new Size(dialog.ClientSize.Width - PADDING * 3 - iconSize, int.MaxValue),
TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl
).Height + 20,
MIN_CONTENT_HEIGHT
);
int contentHeight = Math.Min(requiredHeight, MAX_CONTENT_HEIGHT);
dialog.Height = contentHeight + PADDING * 3 + BUTTON_HEIGHT;
// 创建内容面板
Panel contentPanel = new Panel
{
AutoScroll = false,
Width = dialog.ClientSize.Width - PADDING * 2,
Height = dialog.ClientSize.Height - PADDING * 3 - BUTTON_HEIGHT,
Location = new Point(PADDING, PADDING),
BackColor = SystemColors.Control
};
dialog.Controls.Add(contentPanel);
// 添加图标
PictureBox iconBox = new PictureBox
{
Width = iconSize,
Height = iconSize,
Location = new Point(0, 0),
SizeMode = PictureBoxSizeMode.Zoom,
BackColor = Color.Transparent
};
try
{
Icon sysIcon = SystemIcons.Warning; // 改为警告图标
Bitmap bmp = new Bitmap(iconSize, iconSize);
using (Graphics g = Graphics.FromImage(bmp))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.DrawIcon(sysIcon, new Rectangle(0, 0, iconSize, iconSize));
}
iconBox.Image = bmp;
}
catch
{
iconBox.Visible = false;
}
contentPanel.Controls.Add(iconBox);
// 使用TextBox显示内容
TextBox messageBox = new TextBox
{
Text = content,
ReadOnly = true,
Multiline = true,
BorderStyle = BorderStyle.None,
BackColor = SystemColors.Control,
Location = new Point(iconSize + PADDING, 0),
Width = contentPanel.ClientSize.Width - iconSize - PADDING,
Height = contentPanel.Height,
Font = new Font("Microsoft YaHei UI", 10F, FontStyle.Regular),
WordWrap = true,
TabStop = false,
Cursor = Cursors.IBeam,
ScrollBars = requiredHeight > MAX_CONTENT_HEIGHT ? ScrollBars.Vertical : ScrollBars.None
};
// 隐藏光标但允许选择
messageBox.GotFocus += delegate(object sender, EventArgs e) {
if (messageBox.SelectionLength == 0)
{
NativeMethods.HideCaret(messageBox.Handle);
}
};
contentPanel.Controls.Add(messageBox);
// 添加确定和取消按钮
Button okButton = CreateStyledButton("确定", DialogResult.OK);
Button cancelButton = CreateStyledButton("取消", DialogResult.Cancel);
// 修改取消按钮样式为灰色
cancelButton.BackColor = Color.FromArgb(153, 153, 153);
cancelButton.MouseEnter += delegate(object sender, EventArgs e) {
cancelButton.BackColor = Color.FromArgb(133, 133, 133);
};
cancelButton.MouseLeave += delegate(object sender, EventArgs e) {
cancelButton.BackColor = Color.FromArgb(153, 153, 153);
};
// 调整按钮位置,靠右对齐,确认在最右边
okButton.Location = new Point(
dialog.ClientSize.Width - BUTTON_WIDTH - PADDING,
dialog.ClientSize.Height - PADDING - BUTTON_HEIGHT
);
cancelButton.Location = new Point(
dialog.ClientSize.Width - BUTTON_WIDTH * 2 - PADDING * 2,
dialog.ClientSize.Height - PADDING - BUTTON_HEIGHT
);
// 处理按钮点击事件
okButton.Click += (sender, e) => {
Console.Write("true");
};
cancelButton.Click += (sender, e) => {
Console.Write("false");
};
// 处理窗口关闭事件
dialog.FormClosing += delegate(object sender, FormClosingEventArgs e) {
if (dialog.DialogResult == DialogResult.None)
{
Console.Write("{}");
}
};
dialog.Controls.Add(okButton);
dialog.Controls.Add(cancelButton);
// 确保按钮始终在最上层
okButton.BringToFront();
cancelButton.BringToFront();
}
private static void CreateButtonsDialog(Form dialog, string content)
{
const int MAX_CONTENT_HEIGHT = 500;
const int MIN_CONTENT_HEIGHT = 200;
string[] buttonTexts = content.Split(new[] { "|||||" }, StringSplitOptions.None);
// 计算所需的内容高度
int totalHeight = buttonTexts.Length * (BUTTON_HEIGHT + SPACING) - SPACING; // 减去最后一个按钮后的间距
int requiredHeight = Math.Max(totalHeight + PADDING * 2, MIN_CONTENT_HEIGHT); // 添加上下内边距
int contentHeight = Math.Min(requiredHeight, MAX_CONTENT_HEIGHT);
// 设置对话框高度,根据按钮数量添加底部空间
int bottomPadding = buttonTexts.Length > 1 ? Math.Min(buttonTexts.Length * 10, 50) : 0; // 根据按钮数量增加底部空间但不超过PADDING
dialog.ClientSize = new Size(dialog.ClientSize.Width, contentHeight + bottomPadding);
// 创建内容面板
Panel contentPanel = new Panel
{
AutoScroll = false,
Width = dialog.ClientSize.Width - PADDING * 2,
Height = dialog.ClientSize.Height - PADDING * 2,
Location = new Point(PADDING, PADDING),
BackColor = SystemColors.Control
};
// 只有当实际内容超过最大高度时才启用滚动
if (requiredHeight > MAX_CONTENT_HEIGHT)
{
contentPanel.AutoScroll = true;
contentPanel.AutoScrollMinSize = new Size(0, totalHeight);
}
dialog.Controls.Add(contentPanel);
// 添加按钮
int currentY = PADDING; // 从内边距开始
bool needScroll = requiredHeight > MAX_CONTENT_HEIGHT;
int scrollWidth = needScroll ? SystemInformation.VerticalScrollBarWidth + 10 : 0;
for (int i = 0; i < buttonTexts.Length; i++)
{
Button button = new Button
{
Text = buttonTexts[i],
Width = contentPanel.ClientSize.Width - scrollWidth,
Height = BUTTON_HEIGHT,
Location = new Point(0, currentY),
Tag = i,
FlatStyle = FlatStyle.Flat,
BackColor = Color.FromArgb(0, 122, 204), // 使用蓝色背景
ForeColor = Color.White, // 白色文字
Font = new Font("Microsoft YaHei UI", 10F, FontStyle.Regular),
Cursor = Cursors.Hand,
TextAlign = ContentAlignment.MiddleCenter // 文字居中
};
// 设置边框
button.FlatAppearance.BorderSize = 0;
// 添加圆角效果
GraphicsPath path = new GraphicsPath();
int radius = 8; // 圆角半径
Rectangle rect = new Rectangle(0, 0, button.Width, button.Height);
path.AddArc(rect.X, rect.Y, radius * 2, radius * 2, 180, 90);
path.AddArc(rect.X + rect.Width - radius * 2, rect.Y, radius * 2, radius * 2, 270, 90);
path.AddArc(rect.X + rect.Width - radius * 2, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 0, 90);
path.AddArc(rect.X, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 90, 90);
path.CloseFigure();
button.Region = new Region(path);
// 修改鼠标悬停效果的颜色
button.MouseEnter += delegate(object sender, EventArgs e) {
button.BackColor = Color.FromArgb(0, 102, 184); // 深一点的蓝色
};
button.MouseLeave += delegate(object sender, EventArgs e) {
button.BackColor = Color.FromArgb(0, 122, 204); // 恢复原来的蓝色
};
// 修改文本绘制部分
button.Paint += delegate(object sender, PaintEventArgs e) {
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
using (GraphicsPath buttonPath = new GraphicsPath())
{
Rectangle newRect = new Rectangle(0, 0, button.Width, button.Height);
buttonPath.AddArc(newRect.X, newRect.Y, radius * 2, radius * 2, 180, 90);
buttonPath.AddArc(newRect.X + newRect.Width - radius * 2, newRect.Y, radius * 2, radius * 2, 270, 90);
buttonPath.AddArc(newRect.X + newRect.Width - radius * 2, newRect.Y + newRect.Height - radius * 2, radius * 2, radius * 2, 0, 90);
buttonPath.AddArc(newRect.X, newRect.Y + newRect.Height - radius * 2, radius * 2, radius * 2, 90, 90);
buttonPath.CloseFigure();
e.Graphics.FillPath(new SolidBrush(button.BackColor), buttonPath);
// 绘制文本(居中对齐)
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center; // 水平居中
sf.LineAlignment = StringAlignment.Center; // 垂直居中
e.Graphics.DrawString(button.Text, button.Font, new SolidBrush(button.ForeColor), newRect, sf);
}
};
// 添加按钮点击事件
button.Click += delegate(object sender, EventArgs e) {
Button clickedButton = (Button)sender;
int id = (int)clickedButton.Tag;
string text = clickedButton.Text;
Console.Write("{\"id\":" + id + ",\"text\":\"" + text.Replace("\"", "\\\"") + "\"}");
dialog.DialogResult = DialogResult.OK;
};
contentPanel.Controls.Add(button);
currentY += BUTTON_HEIGHT + SPACING;
}
// 处理窗口关闭事件
dialog.FormClosing += delegate(object sender, FormClosingEventArgs e) {
if (dialog.DialogResult == DialogResult.None)
{
Console.Write("{}");
}
};
}
private static void CreateTextAreaDialog(Form dialog, string content)
{
dialog.Height = 600; // 改为600
TextBox textArea = new TextBox
{
Multiline = true,
ScrollBars = ScrollBars.Vertical,
Width = dialog.ClientSize.Width - PADDING * 2,
Height = dialog.ClientSize.Height - PADDING * 3 - BUTTON_HEIGHT,
Location = new Point(PADDING, PADDING),
ForeColor = SystemColors.WindowText,
Text = content, // 使用传入的content作为默认文本
Font = new Font("Microsoft YaHei UI", 10F, FontStyle.Regular),
BorderStyle = BorderStyle.FixedSingle
};
dialog.Controls.Add(textArea);
// 添加确定按钮
Button okButton = CreateStyledButton("确定", DialogResult.OK);
okButton.Location = new Point(
dialog.ClientSize.Width - BUTTON_WIDTH - PADDING,
dialog.ClientSize.Height - PADDING - BUTTON_HEIGHT
);
// 处理确定按钮点击事件
okButton.Click += delegate(object sender, EventArgs e) {
Console.Write(textArea.Text ?? ""); // 直接输出文本,不加引号
};
dialog.Controls.Add(okButton);
okButton.BringToFront();
}
private static string GetArgumentValue(string[] args, string key)
{
int index = Array.IndexOf(args, key);
if (index >= 0 && index < args.Length - 1)
{
return args[index + 1];
}
return string.Empty;
}
private static void StyleButton(Button button)
{
button.FlatStyle = FlatStyle.Flat;
button.FlatAppearance.BorderSize = 0;
button.BackColor = Color.FromArgb(0, 122, 204);
button.ForeColor = Color.White;
button.Font = new Font("Microsoft YaHei UI", 9F, FontStyle.Regular);
button.Cursor = Cursors.Hand;
button.Width = BUTTON_WIDTH;
button.Height = BUTTON_HEIGHT;
// 圆角绘制
GraphicsPath path = new GraphicsPath();
int radius = 8; // 圆角半径
Rectangle rect = new Rectangle(0, 0, button.Width, button.Height);
path.AddArc(rect.X, rect.Y, radius * 2, radius * 2, 180, 90);
path.AddArc(rect.X + rect.Width - radius * 2, rect.Y, radius * 2, radius * 2, 270, 90);
path.AddArc(rect.X + rect.Width - radius * 2, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 0, 90);
path.AddArc(rect.X, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 90, 90);
path.CloseFigure();
button.Region = new Region(path);
// 添加鼠标悬停效果
button.MouseEnter += delegate(object sender, EventArgs e) {
button.BackColor = Color.FromArgb(0, 102, 184);
};
button.MouseLeave += delegate(object sender, EventArgs e) {
button.BackColor = Color.FromArgb(0, 122, 204);
};
// 自定义绘制
button.Paint += delegate(object sender, PaintEventArgs e) {
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
using (GraphicsPath buttonPath = new GraphicsPath())
{
Rectangle newRect = new Rectangle(0, 0, button.Width, button.Height);
buttonPath.AddArc(newRect.X, newRect.Y, radius * 2, radius * 2, 180, 90);
buttonPath.AddArc(newRect.X + newRect.Width - radius * 2, newRect.Y, radius * 2, radius * 2, 270, 90);
buttonPath.AddArc(newRect.X + newRect.Width - radius * 2, newRect.Y + newRect.Height - radius * 2, radius * 2, radius * 2, 0, 90);
buttonPath.AddArc(newRect.X, newRect.Y + newRect.Height - radius * 2, radius * 2, radius * 2, 90, 90);
buttonPath.CloseFigure();
e.Graphics.FillPath(new SolidBrush(button.BackColor), buttonPath);
// 绘制文本
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
e.Graphics.DrawString(button.Text, button.Font, new SolidBrush(button.ForeColor), newRect, sf);
}
};
}
private static Button CreateStyledButton(string text, DialogResult dialogResult)
{
Button button = new Button();
button.Text = text;
button.DialogResult = dialogResult;
StyleButton(button);
return button;
}
public static void Main(string[] args)
{
if (Environment.OSVersion.Version.Major >= 6)
{
SetProcessDPIAware();
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Show(args);
}
private class NativeMethods
{
[DllImport("user32.dll")]
public static extern bool HideCaret(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, ref RECT lParam);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
}
private static void ShowHelp()
{
string help = @"
Windows 对话框生成工具使用说明
==========================
基本语法:
dialog.exe -type <对话框类型> [参数...]
对话框类型:
----------
1. message - 消息对话框,显示一条消息
2. input - 输入对话框,支持多个输入框
3. confirm - 确认对话框,带确定和取消按钮
4. buttons - 按钮对话框,支持多个自定义按钮
5. textarea - 文本区域对话框,用于编辑大段文本
通用参数:
--------
-type 对话框类型(必需)
可选值message, input, confirm, buttons, textarea
-title 对话框标题(必需)
示例:-title ""提示""
-content 对话框内容
- message/confirm/textarea显示的文本内容
- input输入框提示文本多个输入框用|||||分隔
- buttons按钮文本多个按钮用|||||分隔
-iconpath 对话框图标路径(可选)
示例:-iconpath ""D:\icons\app.ico""
使用示例:
--------
1. 显示消息对话框:
dialog.exe -type message -title ""提示"" -content ""操作已完成""
2. 显示输入对话框(单个输入):
dialog.exe -type input -title ""输入"" -content ""请输入用户名:""
3. 显示输入对话框(多个输入):
dialog.exe -type input -title ""用户信息"" -content ""用户名:|||||密码:|||||邮箱:""
4. 显示确认对话框:
dialog.exe -type confirm -title ""确认"" -content ""确定要删除这个文件吗?""
5. 显示按钮对话框:
dialog.exe -type buttons -title ""选择操作"" -content ""保存|||||不保存|||||取消""
6. 显示文本区域对话框:
dialog.exe -type textarea -title ""编辑文本"" -content ""在这里输入内容...""
返回值:
------
1. message对话框
无返回值
2. input对话框
返回JSON数组包含所有输入框的值
示例:[""user"",""123456"",""user@email.com""]
用户取消:[]
3. confirm对话框
确定true
取消false
关闭窗口:{}
4. buttons对话框
返回JSON对象包含按钮id和文本
示例:{""id"":0,""text"":""保存""}
关闭窗口:{}
5. textarea对话框
返回编辑后的文本内容
取消:空字符串
注意事项:
--------
1. 包含空格的参数值需要用引号括起来
2. 多个输入框或按钮的文本用|||||5个竖线分隔
3. 所有对话框都支持自定义图标(使用-iconpath参数
4. 对话框会自动适应DPI缩放
5. 所有对话框都支持文本选择和复制
更多信息:
--------
遇到问题请查看错误信息,错误信息会提供详细的原因说明。
";
Console.WriteLine(help);
}
}