【C#】タブの無いTabControlっぽいものを作る

重なったパネルを切り替えるのにはTabControlを使う事が多いですが、タブの部分を非表示にしたい場合もあります。

例えば、下図のようにボタンを押すたびに、右半分の画面を切り替えるには、どうするか??

基本的には、切り替える部分をユーザーコントロールで、それぞれ作成し、BringToFront()メソッドでコントロールを全面へ持ってきます。

 

まず、切り替える画面をそれぞれ、ユーザーコントロールで作成します。

 

ユーザーコントロールを作成し、貼り付けるフォーム(ここではForm1)を表示すると、ゆーるボックス上に作成したユーザーコントロールが表示されています。

 

この2つのコントロールを重ねて配置し、それぞれのコントロールのDockプロパティFillにしておきます。

 

DockをFillにすると、それぞれのコントロールを選択しづらくなりますが、プロパティの右上にあるプルダウン(▼マーク)をクリックすると、コントロール一覧が表示されるので、これで選択します。

 

ちなみに、ユーザーコントロール上でマウスの右ボタンを押しても、ユーザーコントロールは一覧に表示されませんでした。。。

 

この状態で、ボタンのイベントで、それぞれのコントロールをBringToFront()メソッドで前面へ持ってくるようにします。

private void button1_Click(object sender, EventArgs e)
{
    this.userControl11.BringToFront();
}

private void button2_Click(object sender, EventArgs e)
{
    this.userControl21.BringToFront();
}

すると、最初の画面のようにウィンドウが切り替わってくれます。

 

これで、ちょっと、ウィンドウを広く使える気分。

 

C#へ戻る

【OpenCvSharp】サンプルプログラムの公開

少し前に、とある記事向けに書いたOpenCvSharpのサンプルプログラム。

少しバージョンが古くなっていますが、眠らせておくのも、もったいないので公開しておきます。

 

 

ダウンロードはこちら↓

OpenCvSharp サンプルプログラム

注)zipファイルを解凍してから使って下さい。

zipのプレビューからslnファイルを実行すると、プロジェクトファイルの読込に失敗します。

 

このサンプルだけで、

 

平滑化(Blur、GaussianBlur、Median)

二値化(普通の二値化、大津の二値化)

輪郭処理(ソーベルフィルタ、Cannyエッジ)

モフォロジー(膨張、収縮、オープニング、クロージング)

ヒストグラム表示

 

ができます。

OpenCVでなかなかカラーのヒストグラムまでのサンプルプログラムを書いてあるのは、あまりないので、そこそこ良いサンプルプログラムだと思っていたのですが、なんでボツったんだろう??

【PowerPoint】部分的にカラーにする(セレクトカラー処理)

少し前のビールのコマーシャルなどでもあった、カラー画像の一部分だけを残して、他をモノクロ画像にする画像処理(カラーセレクトでもないか、、領域抽出(背景除去)の処理)をPower Pointを使って処理する方法を紹介します。

 

【オリジナル画像】

【セレクトカラー処理後の画像】

 

まず、PowerPointを起動し、新規作成しますが、クリックしてタイトルを入力クリックしてサブタイトルを入力が邪魔なので削除しておきます。

 

次にセレクトカラー処理を行いたい画像を挿入します。

挿入方法は挿入→図を選択して、画像ファイルを選択します。

 

 

これで、とりあえず何もしていない画像が配置されます。

 

最初に背景となるモノクロの画像を作成します。

画像をモノクロにするには、画像上でマウスのダブルクリックし、書式→色を選択し、色の処理効果からグレースケールを選択します。

 

これで、背景用のモノクロ画像が作成されます。

 

次に、もう一度、挿入→図と選択し、カラー画像をモノクロ画像の上に重なった状態で配置します。

 

この状態で、画像をダブルクリックし、書式→背景の削除と選択します。

 

 

すると、領域選択用の四角形が表示され、周りが紫色になります。

この紫色の部分が画像の背景となります。

 

最初に、大まかにカラーで残す部分を選択します。

 

この状態だと、まだ、消したい部分が残っていたり、余計に消えていたりすると思います。

細かい領域の追加、削除は左側2つのアイコン(保持する領域としてマーク、削除する領域としてマーク)を使います。

 

 

下図は、削除する領域としてマークを使って、不要な部分を削除している様子ですが、不要な領域を線でなぞるようにして選択します。

 

 

一通り、領域を指定すると、カラーで残したい部分以外が紫色になってくれます。

 

 

これで、領域選択がOKの場合、変更を保持を選択します。

 

 

すると、目的の画像が現れます。

 

 

 

この画像を保存するには、上図の状態では、モノクロの画像とカラーで切り抜いた画像の二枚が重なった状態なので、この2つを選択するため、Ctrl+Aキーを押して二枚とも選択します。

二枚選択せれた状態で、画像上をマウスの右ボタンでクリックし、図として保存を選択します。

 

 

 

これで、画像を名前を付けて保存すると、セレクトカラー画像の完成!!

 

 

今回は、背景をただのグレースケールに変換しましたが、他にもいろいろな効果があるので、試してみると面白いと思います。

 

Word/Excelへ戻る

【C#】引数の値渡し、参照渡し(ref, out)

メソッドに値を引数で渡す場合、値渡し参照渡しというものがあります。

メソッド内で処理した結果を処理後に必要な場合には参照渡しにする必要があるのですが、まずはコード例から。

static void Main(string[] args) 
{ 
	int a1; 
	int a2; 
	int a3; 
	
	a1 = 1; // 値を代入しておく必要がある 
	Method1(a1); // 処理後:a = 1 

	a2 = 1; // 値を代入しておく必要がある 
	Method2(ref a2); // 処理後:a = 11 

	//a3 = 1; // 値を代入しておく必要がない(意味がない) 
	Method3(out a3); // 処理後:a = 10 
} 

// 値渡し 
public static void Method1(int a) 
{ 
	a += 10; // メソッド内では a = 11 となる 
} 

// 参照渡し(ref) 
public static void Method2(ref int a) 
{ 
	a += 10; 
} 

// 参照渡し(out) 
public static void Method3(out int a) 
{ 
	//a += 10; // エラー:未割り当てのoutパラメータ'a'が使用されました。 
	a = 10; 
}

Method1は値渡しの例ですが、aの値はメソッドで受け取れるものの、処理後のaは処理前のaの値と同じままです。

 

Method2は参照渡し(ref)の例ですが、aの値はメソッドで受け取れ、処理後のaもメソッド内で処理した値が繁栄されます。

参照渡し(ref)で渡す引数はメソッドに渡す前に必ず初期化(値を代入)しておく必要があります。

 

Method3は参照渡し(out)の例ですが、aの値を受け取れないものの、処理後の値はメソッド内で処理した値となります。

参照渡し(out)で渡す引数はメソッドに渡す前に初期化しておく必要はありません。

 

これらの動きは私のイメージではこんな感じ↓なのですが、伝わるでしょうか?

 

使い分け的には、一般的な処理では値渡しで十分な場合が多いかと思いますが、処理した結果が必要な場合には参照渡しとなります。

refとoutの違いについては、refでは引数の初期化が必要になりますが、outではその必要がありません。

そのため、メソッド内で引数で渡された値が必要な場合には、ref、必要の無い場合にはoutを使うとよいかと思います。

 

C#へ戻る

【Word/Excel】図形内に文字を挿入する

WordやExcelで下図のように図形の内側に文字を挿入する方法の紹介です。

 

まず、メニューの挿入→図形と選択し、四角形や丸などの図形を選択し、本文中に配置します。

 

 

古いWordやExcelでは、図形を選択し、マウスの右ボタンでテキストの追加を選択する必要がありました。

 

しかし、最近のWord/Excel(少なくともOffice2010以降)では、マウスの右ボタンでメニューを選択すつ必要はなく、まず、図形を選択されている状態にします。

この状態のままで、文字をキー入力すると、図形の中央に文字が挿入されます。

 

このように図形に文字列を挿入できるのは、閉じた図形であれば、だいたい大丈夫なようです。

逆に線などには文字を追加する事ができません。

 

Word/Excelへ戻る

【C#】NumericUpDownコントロール

パラメータの設定など、数値を入力するコントロールとして、これまでTextBoxを使うことが多かったのですが、TextBoxを使うと、TryParseを使い、文字列入力のエラー処理や、整数、小数の確認、最小値、最大値の確認などのエラー処理を行う必要が出てきます。

 

しかし、NumericUpDownコントロールを使うと、これらのエラー処理をコントロール側でやってくれます。

 

 

NumericUpDownコントロールは▲▼のボタンで、数値を上下させるだけ?と思い込んでいたのですが、数値の部分に直接、数値を入力する事もできます。

 

NumericUpDownコントロールには、以下のようなプロパティが用意されています。

 

 

主なプロパティは以下の通り

 

■DecimalPlacesプロパティ

小数点以下の桁数を指定します。

0にすると、整数に制限できます。

例)DicimalPlaces = 3のとき

 

■Incrementプロパティ

▲▼のボタンをクリックするごとに増減する量を指定します。

 

■Maximumプロパティ

入力する値の最大値を指定します。

 

■Minimumプロパティ

入力する値の最小値を指定します。

 

 

■ThousandsSeparatorプロパティ

3ケタごとにカンマ(,)区切り表示するか?を指定します。

表示例)

 

■Valueプロパティ

表示されている数値の値をdecimal型で取得/設定します。

値取得のコード例)

var a = (int)numericUpDown1.Value;

var b = (float)numericUpDown1.Value;

など。

 

使い始めると、むしろ▲▼のアップダウン部分だ邪魔に感じますが、入力の文字列チェック、最小最大値の制限などをしてくれるのは、とても便利!

 

C#へ戻る

ニコン D3400 VS D5500 仕様比較

現在、ソニーのミラーレスカメラNEX-5Rを主に使用しているのですが、そろそろデジタル一眼レフに行くか?!と思い、最近、デジタル一眼レフを物色中。

もう、ほとんどNikonのD5500のダブルズームキットで決まり!

 

と思っていた矢先にD3400なるカメラが登場。

とりあえず、D3400がどういう代物か?分からないので、気になる仕様比較から

 

D3400 D5500
有効画素数 2416万画素 2416万画素
センササイズ ニコンDXフォーマット ニコンDXフォーマット
感度 ISO100~25600 ISO100~25600
画像処理エンジン EXPEED 4 EXPEED 4
保存フォーマット JPEG、RAW(12bit)  JPEG、RAW(12bit,14bit)
質量  約445g(バッテリー、SD

込み)

 約470g(バッテリー、SD

込み)

フォーカスポイント 11点の中から1点 11点or39点の中から1点
調光方式 420分割 2016分割
ローパスフィルタ レス レス
バッテリーのもち 1200枚 820枚
通信接続 Bluetooth(SnapBridge)

WiFiなし

WiFi

Bluetoothなし

GPS対応 なし 別売りのGP-1A、GP-1にて対応
液晶モニタ 3型固定? 3.2型、バリアングル、タッチパネル付き
発売日 2016.9.16 2015.2.5
本体価格最安値

2016.8.24現在

\58,310 \58,599

 

個人的にはGPSがオプションでもD3400は付けられない?のは痛い。

旅行先で写真を撮って、GPSのピンを立てるのもひそかな楽しみなもので。

(下図はiPhoneで撮影した画像の位置です)

 

今のところ、発表されたばかりなので、D3400には価格的メリットはありませんが、SnapBridgeに、どれだけ魅力を感じるか?でD3400を選ぶ可能性が出てくると思います。

 

対して、D5500は、バリアングル、タッチパネル、GPSがオプションで対応という部分が私にとっては魅力的。

 

という事で少し戸惑いましたが、D5500で決定かな!

 

 

(2016.10.11追記)

SDカードを東芝のFlashAir W-03というものにして、SDカード側で常時Wifi接続する事で、SnapBrigeでなくてもいいっか?!

ということで、結局、D5500を購入しました。

実際のレビューは別途記事にしました。

ニコン 一眼レフカメラ D5500レビュー

 

【C#】MDIフォームにリサイズ可能なPanelを設置する

普通のFormに実行中に幅や高さを変えられるパネルを設置する場合は、SplitContainerを配置すればOKですが、MDIフォーム↓に

 

 

SplitContainerを配置すると、

 

 

のようになり、MDIフォームの子フォームの配置する領域(濃いグレーの部分)がPanelで埋まってしまうため、MDIフォームの機能をなしてくれません。

 

そこで、この場合のみSplitterの登場となります。

以下、MDIフォームの右側にリサイズ可能はPanelを配置する例で示します。

 

まず、MDIフォームにPanelを配置します。

 

 

このPanelを右側にDockします。

 

 

すると、MDIフォームの右側にPanelが配置されます。

 

 

この状態だと、まだ、リサイズしてくれないので、次にSplitterを配置します。

すると、Splitterはデフォルトでは左側にDockされてしまうため、Dockプロパティを右(Right)に設定します。

 

 

Splitterが右側に配置された様子↓

 

 

この状態で実行すると、リサイズ可能なPanelとなります。

 

 

しかしながら、MSDNを見るとSplitterは互換性のために残してあるだけで、新規にプログラムを作るときは使わないようにと書いてあります。

いつまで、この方法が使えるかは、かなり怪しいところではありますが、現状、MDIフォームにリサイズできるパネルを配置するには、この方法しか無いと思われ。。

 

C#へ戻る

【Visual Studio 2015】文字の色が変、かすむ

Visual Studioを使っていると、いつのまにかに文字の色味がモニタの見る角度で違って見えたり、文字がかすんで見えたりすることがあります。

 

分かりづらいですが、こんな感じ↓

 

 

これは、文字の表示倍率が中途半端な倍率の時にこのように見えるのですが、上図の例では110%になっています。

文字の表示倍率は、Ctrlキー+マウスホイールの上下で調整できますが、倍率はコードエディタの左下に表示されています。

この部分で倍率の調整もできます。

 

 

この表示倍率を100%にすると文字がくっりきしてくれます。

110%の画像だけを見ると分かりづらいですが、100%の表示と比べてみると、110%の表示が変に見えるのが分かりやすいでしょうか?

 

100%表示

110%表示

 

Visual Studioへ戻る

【Visual Studio】行のコピー、切り取り、貼り付け

Wordやメモ帳のような一般的なテキストエディタで、行全体のコピーや切り取りをするには、下図のように、マウスやキーボードで全体を選択してからコピー(Ctrl+C)や切り取り(Ctrl+X)をする場合が多いかと思います。

 

 

しかし、Visual Studioでは、コピーや切り取りをする行の位置(横方向はどこでもOK)にカーソルを置いて、コピー(Ctrl+C)や切り取り(Ctrl+X)をするだけで大丈夫です。

 

 

コピー、切り取りした行を貼り付け(挿入)するには、貼り付ける位置にカーソルを置き、貼り付ける(Ctrl+V)とカーソルの位置の上側に貼り付けられます。

 

 

↓貼り付け結果

 

この操作を知っておくと、不要な行の削除などもかなり楽になると思います。

 

 

Visual Studioへ戻る