This commit is contained in:
HuangHai
2026-01-29 08:22:08 +08:00
parent 8aa397cea7
commit 8101a3eafc
38 changed files with 1167 additions and 261 deletions

View File

@@ -18,6 +18,10 @@ namespace WordAddIn
private NumericUpDown numSize;
private CheckBox chkBold;
private ComboBox cmbAlign;
private Button btnColor; // 颜色选择按钮
private Panel pnlColorPreview; // 颜色预览面板
private int _selectedColor = 0; // 存储选中的颜色值 (Word WdColor)
private bool _showAlign;
/// <summary>
@@ -70,6 +74,17 @@ namespace WordAddIn
this.Controls.Add(numSize);
this.Controls.Add(chkBold);
// 颜色选择
Label lblColor = new Label { Text = "颜色:", Location = new Point(180, 67), AutoSize = true };
btnColor = new Button { Text = "选择...", Location = new Point(220, 63), Width = 60, Height = 25 };
pnlColorPreview = new Panel { Location = new Point(290, 65), Width = 20, Height = 20, BorderStyle = BorderStyle.FixedSingle, BackColor = Color.Black };
btnColor.Click += BtnColor_Click;
this.Controls.Add(lblColor);
this.Controls.Add(btnColor);
this.Controls.Add(pnlColorPreview);
// 对齐方式 (可选)
if (_showAlign)
{
@@ -83,6 +98,35 @@ namespace WordAddIn
}
}
private void BtnColor_Click(object sender, EventArgs e)
{
using (ColorDialog colorDialog = new ColorDialog())
{
// Set initial color based on current selection
colorDialog.Color = pnlColorPreview.BackColor;
if (colorDialog.ShowDialog() == DialogResult.OK)
{
pnlColorPreview.BackColor = colorDialog.Color;
// Convert .NET Color to Word WdColor (int)
// Word stores colors as BGR (0xBBGGRR) in lower 24 bits
// But .NET Color.ToArgb() returns ARGB (0xAARRGGBB)
// WdColor is weird.
// wdColorBlack = 0
// wdColorRed = 255 (0x0000FF)
// It seems to be standard RGB or BGR integer value.
// Let's use ColorTranslator or manual conversion.
// Word Interop usually expects BGR int for some properties, or standard OLE color.
// Actually, WdColor enum has values like wdColorRed = 0xFF.
// The safest way is to cast the RGB value.
// However, ColorTranslator.ToOle(c) returns BGR, which is what Office usually expects.
_selectedColor = ColorTranslator.ToOle(colorDialog.Color);
}
}
}
/// <summary>
/// 将 TextStyle 对象应用到界面控件。
/// </summary>
@@ -98,6 +142,17 @@ namespace WordAddIn
numSize.Value = (decimal)style.FontSize;
chkBold.Checked = style.IsBold;
_selectedColor = style.Color;
// Convert OLE Color back to .NET Color for preview
try
{
pnlColorPreview.BackColor = ColorTranslator.FromOle(_selectedColor);
}
catch
{
pnlColorPreview.BackColor = Color.Black;
}
if (_showAlign && cmbAlign != null)
{
@@ -116,6 +171,8 @@ namespace WordAddIn
style.FontName = cmbFont.Text;
style.FontSize = (float)numSize.Value;
style.IsBold = chkBold.Checked;
style.Color = _selectedColor;
if (_showAlign && cmbAlign != null)
{
style.Alignment = cmbAlign.SelectedIndex;