for Push.
This commit is contained in:
@@ -0,0 +1,332 @@
|
||||
using DocumentFormat.OpenXml.Office2010.CustomUI;
|
||||
using KssSmaPlaLib.Forms.ContextMenuFunction;
|
||||
using KssSmaPlaLib.Ini;
|
||||
using KssSmaPlaLib.Input.Gamen;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Windows.UI.Popups;
|
||||
|
||||
namespace KssSmaPlaLib.Forms
|
||||
{
|
||||
public static class ContextMenuHelper
|
||||
{
|
||||
private const string INI_KEY_TITLE = "Title";
|
||||
private const string INI_KEY_BACK_COLOR = "BackColor";
|
||||
|
||||
/// <summary>
|
||||
/// フォーム背景色選択
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
public static void SelectBackColor(Form form)
|
||||
{
|
||||
using (ColorDialog cd = new ColorDialog())
|
||||
{
|
||||
// 今の色を初期選択にしておく
|
||||
cd.Color = form.BackColor;
|
||||
|
||||
if (cd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
// 1. フォームの背景色を即時変更
|
||||
form.BackColor = cd.Color;
|
||||
|
||||
// 2. 🔥 Colorを16進数(#RRGGBB)に変換してINIに書き込み
|
||||
string colorHex = ColorTranslator.ToHtml(cd.Color);
|
||||
IniHelper.WriteValue(null, form.Name, INI_KEY_BACK_COLOR, colorHex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 背景色をINIから取得して設定
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
public static void SetBackColorFromIni(Form form)
|
||||
{
|
||||
var colorHex = IniHelper.ReadValue(null, form.Name, INI_KEY_BACK_COLOR, ColorTranslator.ToHtml(form.BackColor));
|
||||
form.BackColor = ColorTranslator.FromHtml(colorHex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// INIに登録されている色選択
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
public static void SelectIniColor(Form form, string key, Color defaultColor)
|
||||
{
|
||||
var colorHex = IniHelper.ReadValue(null, form.Name, key, ColorTranslator.ToHtml(defaultColor));
|
||||
var color = ColorTranslator.FromHtml(colorHex);
|
||||
|
||||
using (ColorDialog cd = new ColorDialog())
|
||||
{
|
||||
// 今の色を初期選択にしておく
|
||||
cd.Color = color;
|
||||
|
||||
if (cd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
// 2. 🔥 Colorを16進数(#RRGGBB)に変換してINIに書き込み
|
||||
colorHex = ColorTranslator.ToHtml(cd.Color);
|
||||
IniHelper.WriteValue(null, form.Name, key, colorHex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// INIに設定されている色取得
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="defaultColor"></param>
|
||||
/// <returns></returns>
|
||||
public static Color GetIniColor(Form form, string key, Color defaultColor)
|
||||
{
|
||||
var colorHex = IniHelper.ReadValue(null, form.Name, key, ColorTranslator.ToHtml(defaultColor));
|
||||
return ColorTranslator.FromHtml(colorHex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// チェックボックスのメニュー項目のチェック値のロード
|
||||
/// </summary>
|
||||
/// <param name="frm"></param>
|
||||
/// <param name="menuItem"></param>
|
||||
public static void MenuCheckBoxItemLoad(Form frm, ToolStripMenuItem menuItem)
|
||||
{
|
||||
menuItem.Checked =
|
||||
//bool.TryParse(
|
||||
// IniHelper.ReadValue(
|
||||
// null, frm.Name, menuItem.Name, false.ToString()),
|
||||
// out var boolVal) ? boolVal : false;
|
||||
IniHelper.ReadBoolValue(null, frm.Name, menuItem.Name, false);
|
||||
}
|
||||
|
||||
public static void LoadAllMenuStates(Form form, ContextMenuStrip contextMenu)
|
||||
{
|
||||
foreach (ToolStripItem item in contextMenu.Items)
|
||||
ProcessMenuItemLoad(form, item);
|
||||
}
|
||||
|
||||
private static void ProcessMenuItemLoad(Form form, ToolStripItem item)
|
||||
{
|
||||
// ToolStripMenuItem かつ CheckOnClick が true の場合のみ処理
|
||||
if (item is ToolStripMenuItem menuItem && menuItem.CheckOnClick)
|
||||
{
|
||||
// 🚀 ご提示のヘルパーメソッドを1行呼び出すだけ!
|
||||
ContextMenuHelper.MenuCheckBoxItemLoad(form, menuItem);
|
||||
}
|
||||
|
||||
// 子メニュー(階層)がある場合は再帰的に奥まで処理
|
||||
if (item is ToolStripDropDownItem dropDownItem && dropDownItem.HasDropDownItems)
|
||||
{
|
||||
foreach (ToolStripItem subItem in dropDownItem.DropDownItems)
|
||||
ProcessMenuItemLoad(form, subItem);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// メニューのチェックボックスアイテムのクリック時
|
||||
/// </summary>
|
||||
/// <param name="frm"></param>
|
||||
/// <param name="menuItem"></param>
|
||||
public static void MenuCheckBoxItemClick(Form frm, ToolStripMenuItem menuItem)
|
||||
{
|
||||
menuItem.Checked = !menuItem.Checked;
|
||||
IniHelper.WriteValue(null, frm.Name, menuItem.Name, menuItem.Checked.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// メニューのフォント設定
|
||||
/// ※フォームロードでCallしてください
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <param name="menu"></param>
|
||||
public static void SetFont(Form form, ContextMenuStrip menu)
|
||||
{
|
||||
menu.Font = FontUxer.GetFont(form.Name, menu.Name + ".Font", menu.Font);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// コントロール(ラベル等)のフォント設定
|
||||
/// ※フォームロードでCallしてください
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <param name="menu"></param>
|
||||
public static void SetControlFont(Form form, Control control)
|
||||
{
|
||||
control.Font = FontUxer.GetFont(form.Name, control.Name + ".Font", control.Font);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// メニュー自身のフォント選択
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <param name="menu"></param>
|
||||
public static void SelectMenuFont(Form form, ContextMenuStrip menu)
|
||||
{
|
||||
if (FontUxer.SelectFont(form, form.Name, menu.Name + ".Font", menu.Font, out var font))
|
||||
menu.Font = font;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// コントロール(ラベル等)のフォント選択
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <param name="control"></param>
|
||||
public static void SelectControlFont(Form form, Control control)
|
||||
{
|
||||
if (FontUxer.SelectFont(form, form.Name, control.Name + ".Font", control.Font, out var font))
|
||||
control.Font = font;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// フォームのタイトル設定
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
public static void SetFormTitle(Form form)
|
||||
{
|
||||
var title = IniHelper.ReadValue(null, form.Name, INI_KEY_TITLE, form.Text);
|
||||
using (var dlg = new TextInputForm(title))
|
||||
{
|
||||
if (dlg.ShowDialog() == DialogResult.Cancel) return;
|
||||
IniHelper.WriteValue(null, form.Name, INI_KEY_TITLE, dlg.EditedText);
|
||||
form.Text = IniHelper.ReadValue(null, form.Name, INI_KEY_TITLE, form.Text);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// バージョン表示
|
||||
/// </summary>
|
||||
/// <param name="menuItem"></param>
|
||||
public static void DispVersion(ToolStripMenuItem menuItem, bool isDispCraftedBy = true)
|
||||
{
|
||||
// バージョン
|
||||
menuItem.Font = new Font(menuItem.Font.FontFamily, 8.0f);
|
||||
menuItem.Enabled = false;
|
||||
menuItem.Text = "Ver." + Application.ProductVersion + (isDispCraftedBy ? " | Crafted by のぼぼ工房" : "");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ショートカットキーで動作するようにする
|
||||
/// ※フォームのKeyPreviewをtrueにして、
|
||||
/// フォームのKeyDownイベントでCallしてください。
|
||||
/// private void Form1_KeyDown(object sender, KeyEventArgs e)
|
||||
// {
|
||||
// // メニューのEnabledを制御している場合、そのOpeningを呼んでおく。
|
||||
// contextMenuStrip1_Opening(contextMenuStrip1, new System.ComponentModel.CancelEventArgs());
|
||||
//
|
||||
// if (ExecuteShortcutWithEnabledCheck(contextMenuStrip1.Items, e.KeyData))
|
||||
// {
|
||||
// e.Handled = true;
|
||||
// }
|
||||
// }
|
||||
/// </summary>
|
||||
/// <param name="items"></param>
|
||||
/// <param name="keyData"></param>
|
||||
/// <returns></returns>
|
||||
public static bool ExecuteShortcutWithEnabledCheck(ToolStripItemCollection items, Keys keyData)
|
||||
{
|
||||
foreach (ToolStripItem item in items)
|
||||
{
|
||||
if (item is ToolStripMenuItem menuItem)
|
||||
{
|
||||
// ショートカットが一致し、かつ「有効(Enabled)」な時だけ実行!
|
||||
if (menuItem.ShortcutKeys == keyData && menuItem.Enabled)
|
||||
{
|
||||
menuItem.PerformClick();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (menuItem.HasDropDownItems)
|
||||
{
|
||||
if (ExecuteShortcutWithEnabledCheck(menuItem.DropDownItems, keyData)) return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// コンボメニューの選択値をINIに保存
|
||||
/// (ToolStripComboBoxのSelectedIndexChangedでCallしてね!💖)
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <param name="combo"></param>
|
||||
public static void SaveComboMenuToIni(Form form, ToolStripComboBox combo)
|
||||
{
|
||||
IniHelper.WriteValue(null, form.Name, combo.Name + ".Values", combo.Text);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// コンボメニューの選択値をINIから復元
|
||||
/// (FormのLoadでCallしてね💖)
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <param name="combo"></param>
|
||||
/// <param name="defaultValue"></param>
|
||||
public static void LoadComboMenuFromIni(Form form, ToolStripComboBox combo, string defaultValue)
|
||||
{
|
||||
combo.Text = IniHelper.ReadValue(null, form.Name, combo.Name + ".Values", defaultValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// コンボメニューの選択値をINIから取得
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <param name="combo"></param>
|
||||
/// <param name="defaultValue"></param>
|
||||
/// <returns></returns>
|
||||
public static string ComboMenuFromIni(Form form, ToolStripComboBox combo, string defaultValue)
|
||||
{
|
||||
return IniHelper.ReadValue(null, form.Name, combo.Name + ".Values", defaultValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// フォームガチャ
|
||||
/// </summary>
|
||||
/// <param name="form"></param>
|
||||
/// <returns></returns>
|
||||
public static async Task FormGacha(Form form)
|
||||
{
|
||||
// 現在の状態をバックアップ
|
||||
var originalState = form.Controls.Cast<Control>()
|
||||
.Select(c => new { Ctrl = c, Loc = c.Location, Txt = c.Text, Font = c.Font }).ToList();
|
||||
var formLoc = form.Location;
|
||||
|
||||
Random rng = new Random();
|
||||
|
||||
// 5秒間の狂宴(癒し)
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
// 1. フォーム自体が震える
|
||||
form.Location = new Point(formLoc.X + rng.Next(-20, 21), formLoc.Y + rng.Next(-20, 21));
|
||||
|
||||
foreach (var item in originalState)
|
||||
{
|
||||
// 2. コントロールがバラバラに踊る
|
||||
item.Ctrl.Location = new Point(item.Loc.X + rng.Next(-15, 16), item.Loc.Y + rng.Next(-15, 16));
|
||||
|
||||
// 3. ラベルが叫び、ボタンが点滅する
|
||||
if (item.Ctrl is System.Windows.Forms.Label) item.Ctrl.Text = "がちゃ!";
|
||||
item.Ctrl.BackColor = Color.FromArgb(rng.Next(256), rng.Next(256), rng.Next(256));
|
||||
}
|
||||
|
||||
// 4. マウスカーソルを中央に拘束(逃がさない)
|
||||
Cursor.Position = form.PointToScreen(new Point(form.Width / 2, form.Height / 2));
|
||||
|
||||
await Task.Delay(30);
|
||||
}
|
||||
|
||||
// 祭りのあと(完全復旧)
|
||||
form.Location = formLoc;
|
||||
foreach (var item in originalState)
|
||||
{
|
||||
item.Ctrl.Location = item.Loc;
|
||||
item.Ctrl.Text = item.Txt;
|
||||
item.Ctrl.Font = item.Font;
|
||||
item.Ctrl.BackColor = SystemColors.Control;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user