C#でコントロールの拡大縮小を一括変更

サンプルプログラム付きDLLを無償配布しています。

VisualStudio2010Expressで動く、拡大縮小コントロールのクラスライブラリDLLを無償配布として配布しています。

この配布物には簡単なサンプルプログラムもついています。

ソース付きDLLを販売しています。

VisualStudio2015用のC#ソースを含む、DLLプロジェクトとテストプロジェクト、サンプルプログラムプロジェクトが同梱されています。

ダウンロード販売用Zipファイル(ライセンス認証は必要です)

http://ringing-web.com/wp-content/uploads/2017/05/SettingsToAccessDB_vs2015_ver1.0.zip

本文

まず、拡大縮小の責務を持つインターフェースを定義します。

[csharp]

namespace UserClass
{
public interface IControlResizable
{
int pWidth { get; set; }
int pHeight { get; set; }
float pFontSize { get; set; }
int pTop { get; set; }
int pLeft { get; set; }
int OrgHeight { get; set; }
int OrgWidth { get; set; }
float OrgFontsize { get; set; }
int OrgTop { get; set; }
int OrgLeft { get; set; }
float TuneRatio { get; set; }

// 拡大縮小の比率の元となる原寸大を設定する
void InitSize();

// このメソッドで拡大縮小する。ratioは、比率のチューニング用で、通常は1.0のままでOK
void ChangeViewRatio(int ratio);
}
}

[/csharp]

次に、上のインターフェースをコントロールに継承させます。

まずは、Buttonコントロール

[csharp]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using 波佐見弁利v2.UserClass;

namespace UserClass
{
public class MyButtonKnowsOrgSize : Button, IControlResizable
{
private ControlResizableAdapter adapt_ = null;
public MyButtonKnowsOrgSize() : base()
{
//フォーカスをとらない
this.SetStyle(ControlStyles.Selectable, false);

// ControlResizableAdapterアダプタークラスに、拡大縮小機能を委譲する(任せる)
this.adapt_ = new ControlResizableAdapter(this);
}

public void ChangeViewRatio(int ratio)
{
// 拡大縮小メソッドを、ControlResizableAdapterアダプタークラスに委譲する(任せる)
this.adapt_.ChangeViewRatio(ratio);
}
public void InitSize()
{
// 初期化メソッドを、ControlResizableAdapterアダプタークラスに委譲する(任せる)
this.adapt_.InitSize();
}

public float TuneRatio
{
get
{
return this.adapt_.tuneratio;
}
set
{
this.adapt_.tuneratio = value;
}
}

public int OrgHeight { get; set; }
public int OrgWidth { get; set; }
public float OrgFontsize { get; set; }
public int OrgTop { get; set; }
public int OrgLeft { get; set; }
public int pHeight
{
get
{
return this.Height;
}
set
{
this.Height = value;
}
}
public int pWidth
{
get
{
return this.Width;
}
set
{
this.Width = value;
}
}
public float pFontSize
{
get
{
return this.Font.Size;
}
set
{
this.Font = new System.Drawing.Font(“MS UI Gothic”, value, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
}
}
public int pTop
{
get
{
return this.Top;
}
set
{
this.Top = value;
}
}
public int pLeft
{
get
{
return this.Left;
}
set
{
this.Left = value;
}
}
}
}

[/csharp]

次の例として、チェックボックス

[csharp]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using 波佐見弁利v2.UserClass;

namespace UserClass
{
public class MyCheckBoxKnowsOrgSize : CheckBox, IControlResizable
{
private ControlResizableAdapter adapt_ = null;
public MyCheckBoxKnowsOrgSize() : base()
{
//フォーカスをとらない
this.SetStyle(ControlStyles.Selectable, false);

// ControlResizableAdapterアダプタークラスに委譲する(任せる)
this.adapt_ = new ControlResizableAdapter(this);
}

public void ChangeViewRatio(int ratio)
{
// 拡大縮小を、ControlResizableAdapterアダプタークラスに委譲する(任せる)
this.adapt_.ChangeViewRatio(ratio);
}
public void InitSize()
{
// 初期化を、ControlResizableAdapterアダプタークラスに委譲する(任せる)
this.adapt_.InitSize();
}

public float TuneRatio
{
get
{
return this.adapt_.tuneratio;
}
set
{
this.adapt_.tuneratio = value;
}
}

public int OrgHeight { get; set; }
public int OrgWidth { get; set; }
public float OrgFontsize { get; set; }
public int OrgTop { get; set; }
public int OrgLeft { get; set; }
public int pHeight
{
get
{
return this.Height;
}
set
{
this.Height = value;
}
}
public int pWidth
{
get
{
return this.Width;
}
set
{
this.Width = value;
}
}
public float pFontSize
{
get
{
return this.Font.Size;
}
set
{
this.Font = new System.Drawing.Font(“MS UI Gothic”, value, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
}
}
public int pTop
{
get
{
return this.Top;
}
set
{
this.Top = value;
}
}
public int pLeft
{
get
{
return this.Left;
}
set
{
this.Left = value;
}
}
}
}

[/csharp]

なお、IControlResizableのメソッドは、各コントロールで共通の処理なので、ControlResizableAdapterアダプタクラスに委譲しています。

[csharp]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using メールのみ.UserClass;

namespace UserClass
{
public class ControlResizableAdapter
{
private IControlResizable ctl_ = null;
public float tuneratio = 1.0F;

// IControlResizableというインターフェースとして受け取る
public ControlResizableAdapter(IControlResizable ctl)
{
this.ctl_ = ctl;
}

public void InitSize()
{
// IControlResizableのもつプロパティを利用する
this.ctl_.OrgWidth = this.ctl_.pWidth;
this.ctl_.OrgHeight = this.ctl_.pHeight;
this.ctl_.OrgFontsize = this.ctl_.pFontSize;
this.ctl_.OrgTop = this.ctl_.pTop;
this.ctl_.OrgLeft = this.ctl_.pLeft;
}
public void ChangeViewRatio(int ratio) //ratio: 50-200
{
// IControlResizableのもつプロパティを利用する
this.ctl_.pHeight = (int)((this.ctl_.OrgHeight * ratio / 100) * this.tuneratio);
this.ctl_.pWidth = (int)((this.ctl_.OrgWidth * ratio / 100) * this.tuneratio);
this.ctl_.pFontSize = (float)((this.ctl_.OrgFontsize * ratio / 100) * this.tuneratio);
this.ctl_.pTop = (int)((this.ctl_.OrgTop * ratio / 100) * this.tuneratio);
this.ctl_.pLeft = (int)((this.ctl_.OrgLeft * ratio / 100) * this.tuneratio);
}
}
}
[/csharp]

では、main側ではどうやって実行するかといいますと、以下のように、this.ControlsコレクションにLINQの拡張メソッドOfType()を使って、IControlResizableインターフェースを継承したコントロールを全て抜き出して、各個拡大縮小を実行しています。

[csharp]

// LINQのOfTypeメソッドで、CotrolsコレクションからIControlResizableインターフェースを持つコントロールだけ抜き出す。
foreach (IControlResizable ctl in this.Controls.OfType())
{
//各IControlResizableをインターフェースを持つコントロールを拡大縮小する
ctl.ChangeViewRatio(ratio);
}

[/csharp]