using KssSmaPlaLib.Ini;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace KssSmaPlaLib.Forms
{
public static class FormHelper
{
///
/// フォームのコンストラクタで行う処理集
///
///
public static void FormConstructorProc(Form frm)
{
frm.KeyPreview = true;
FormHelper.SetTitle(frm);
foreach (var control in frm.Controls)
{
if (control is DataGridView)
{
// DGVで行う共通処理
var dgv = control as DataGridView;
dgv.Dock = DockStyle.Fill;
dgv.AllowUserToResizeRows = false;
dgv.AllowUserToAddRows = false;
dgv.AllowUserToDeleteRows = false;
dgv.AllowUserToOrderColumns = false;
dgv.AllowUserToResizeColumns = true;
dgv.AllowUserToResizeRows = false;
dgv.ReadOnly = true;
dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgv.RowHeadersVisible = false;
dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
// 列ヘッダのユーザによるソートを無効化する
foreach (DataGridViewColumn col in dgv.Columns) col.SortMode = DataGridViewColumnSortMode.NotSortable;
}
}
}
///
/// フォームのロードで行う処理集
///
///
///
public static void FormLoadProc(Form frm, ContextMenuStrip[] menus, bool isDgvColAutoFit = false)
{
FormHelper.LoadFormBounds(frm);
foreach (var control in frm.Controls)
{
if (control is DataGridView)
{
// DGVで行う共通処理
var dgv = control as DataGridView;
DgvHelper.DgvLoadColVisible(dgv);
DgvHelper.DgvLoadColDisplayIndex(dgv);
DgvHelper.DgvLoadColFrozen(dgv);
if (isDgvColAutoFit)
{
DgvHelper.DgvColumnWidthAutoAdjust(dgv);
}
else
{
DgvHelper.DgvLoadColWidth(dgv);
}
DgvHelper.DgvLoadFontFromIni(dgv);
}
}
foreach (var menu in menus)
{
ContextMenuHelper.SetFont(frm, menu);
}
}
///
/// フォーム閉じるときの処理集
///
///
public static void FormClosingProc(Form frm)
{
FormHelper.SaveFormBounds(frm);
foreach (var control in frm.Controls)
{
if (control is DataGridView)
{
// DGVで行う共通処理
var dgv = control as DataGridView;
DgvHelper.DgvSaveColVisible(dgv);
DgvHelper.DgvSaveColDisplayIndex(dgv);
DgvHelper.DgvSaveColFrozen(dgv);
DgvHelper.DgvSaveColWidth(dgv);
DgvHelper.DgvSaveFontToIni(dgv);
}
}
}
private const string INI_KEY_RESTORE_BOUNDS_CSV = "RestoreBoundsCsv";
///
/// フォームのバウンズ保存
/// ※フォームのClosingイベントでCallしてください。
///
///
public static void SaveFormBounds(Form form)
{
var csv = string.Empty;
if (form.WindowState == FormWindowState.Maximized || form.WindowState == FormWindowState.Minimized)
{
csv = $"{form.RestoreBounds.Width},{form.RestoreBounds.Height},{form.RestoreBounds.Top},{form.RestoreBounds.Left},{form.WindowState == FormWindowState.Maximized}";
}
else
{
csv = $"{form.Bounds.Width},{form.Bounds.Height},{form.Bounds.Top},{form.Bounds.Left},{form.WindowState == FormWindowState.Maximized}";
}
IniHelper.WriteValue(null, form.Name, INI_KEY_RESTORE_BOUNDS_CSV, csv);
}
///
/// フォームのバウンズ復元
/// ※フォームのLoadイベントでCallしてください。
///
///
public static void LoadFormBounds(Form form)
{
var csv = IniHelper.ReadValue(null, form.Name, INI_KEY_RESTORE_BOUNDS_CSV);
if (string.IsNullOrEmpty(csv)) return;
var items = csv.Split(',');
if (items.Length != 5) return;
if (!int.TryParse(items[0], out var width)) return;
if (!int.TryParse(items[1], out var height)) return;
if (!int.TryParse(items[2], out var top)) return;
if (!int.TryParse(items[3], out var left)) return;
if (!bool.TryParse(items[4], out var isMaximum)) return;
form.Bounds = new System.Drawing.Rectangle(left, top, width, height);
if (isMaximum) form.WindowState = FormWindowState.Maximized;
}
private const string KEY_NAME_TITLE = "Title";
///
/// タイトル設定(INI優先)
/// ※フォームのコンストラクタでCallしてください
///
///
public static void SetTitle(Form form)
{
form.Text = IniHelper.ReadValue(null, form.Name, KEY_NAME_TITLE, form.Text);
}
///
/// フォームの画面キャプチャを取得し画像ファイルに保存する
///
///
///
public static void GetCaptureAndSaveBitmap(Form form, string bitmapFilePath)
{
// フォームと同じサイズのBitmapを作成
Bitmap bitmap = new Bitmap(form.Width, form.Height);
// Bitmapにフォームの内容を描画
form.DrawToBitmap(bitmap, new Rectangle(0, 0, form.Width, form.Height));
// 画像ファイルとして保存
bitmap.Save(bitmapFilePath, System.Drawing.Imaging.ImageFormat.Jpeg);
// リソースの解放
bitmap.Dispose();
}
}
}