インデックス付きのピクセル形式をもつイメージとは?

System::Drawing::GraphicsクラスFromImageメソッドSystem::Drawing::BitmapクラスSetPixel、GetPixelメソッドで、モノクロの画像データを指定すると

 

追加情報: インデックス付きのピクセル形式をもつイメージからグラフィックス オブジェクトを作成することはできません。

 

というエラーが出る場合があります。

 

このインデックス付きのピクセル形式というのは、ビットマップフォーマットをご存じの方には、話が早いのですが、例えばモノクロ8Bitの画像データの場合は0~255の輝度値で画像データを指定しますが、モニタ上にモノクロの画像を表示するには、輝度値に対応したR、G、Bの値をカラーテーブルを使って指定する必要があります。

 

このカラーテーブルをもつファイル形式(例えば、1ビットの二値化画像、8ビットのモノクロ画像など)の画像データをインデックス付きのピクセル形式をもつイメージと言います。

 

画像処理ではモノクロ8Bitの画像データを使う機会が多いのですが、.NETのプログラムでは少し工夫しないといけない場合がありますが、この辺はおいおい紹介したいと思います。

 

【C++/CLI】メニューを付ける

新規プロジェクトの作成のページでは、何もしないだたのウィンドウ表示のプログラムを作成しましたが、このウィンドウにメニューを付けたいと思います。

 

と、その前に簡単にVisualStudioの操作説明をしたいと思います。

 

フォーム(ウィンドウ)上にメニューやボタンなどを配置するときは、ソリューションエクスプローラのタブを選択し、フォームのファイル(*.h)を選択し、デザイナの表示アイコンをクリックします。

 

 

デザイナの表示からイベント処理などのソースコードを書くときはコードの表示アイコンをクリックします。

 

 

オブジェクト(メニューやボタン、ピクチャボックスなど)の名前や大きさ、位置などの情報を設定するには右下のプロパティタブを選択し、プロパティアイコンをクリックします。

 

 

メニューをクリックしたときなどの処理(イベント処理)を表示するにはイベントアイコンをクリックします。

 

 

と、準備はここまで。

 

フォームファイル(*.h)を選択し、デザイナを表示します。
右側のツールボックスをタブを選択し、この中からMenuStripを選択し、フォームの上にドラッグ&ドロップします。

 

 

次にここへ入力と書かれた部分に表示するメニューの文字を記入していきます。

 

 

ここで、ファイルの文字の右側に(F)と表示されていますが、これはメニューをAltキーを使って操作するときの文字で、文字の入力時にはファイル(&F)のようにアルファベットの頭に&を付けます。
また、メニューの間に表示されている仕切り線(Separator)はここへ入力の部分に - (ハイフン)を入力します。

 

 

ここで、デフォルトではそれぞれのメニューの名前(Name)は開くOToolStripMenuItemなどとなっており、このままだとソースコードに日本語が入ってしまっていまいちなので、それぞれ下表のように名前を付けておきます。

 

Text (Name)
ファイル(&F) mnuFile
開く(&O) mnuFileOpen
終了(&X) mnuFileExit

 

この名前の付け方はVB6.0の時に使っていたプレフィックスを用いていますが、詳しく知りたい方は
このページ↓を参照すると良いと思います。
http://msdn.microsoft.com/en-us/library/aa263493(VS.60).aspx

 

次にメニューをクリックしたときの処理(イベント処理)を追加していきます。
メニューのイベント処理は開く(O)をダブルクリックすると、メニューをクリックした時の処理のソースコードが自動的に作成されます。このへんはVB6.0と同じです。

private: System::Void mnuFileOpen_Click(System::Object^  sender, System::EventArgs^  e) {

             }

 

この{ } の間にメニューをクリックしたときの処理を書いていきます。
下記は開くメニューをクリックした時にファイルを開くダイアログボックスを表示し、ファイル名を眼セージボックスで表示するソースコードです。

 private: System::Void mnuFileOpen_Click(System::Object^  sender, System::EventArgs^  e) {
                 //ファイル→ファイルを開く

                 //ファイルを開くダイアログの作成
                 OpenFileDialog^ dlg = gcnew OpenFileDialog;
                 //ファイルフィルタ
                 dlg->Filter = "画像ファイル(*.bmp,*.jpg,*.png,*.tif,*.ico)|*.bmp;*.jpg;*.png;*.tif;*.ico";
                 //ダイアログの表示 (Cancelボタンがクリックされた場合は何もしない)
                 if (dlg->ShowDialog() == System::Windows::Forms::DialogResult::Cancel) return;
                 //取得したファイル名の表示
                 MessageBox::Show(dlg->FileName);
             }

 

終了メニューは下記の通りです。

 

private: System::Void mnuFileExit_Click(System::Object^  sender, System::EventArgs^  e) {
                 //ファイル→終了
                 this->Close();
             }

【C++/CLI】新規プロジェクトの作成

VisualStudioで新規にC++/CLIのプログラムを作成する場合は以下の手順で行います。

 

VisualStudioを起動すると下図のようなウィンドウが開きます。

 

 

次に作成の文字の右側にあるプロジェクトの文字をクリックします。
すると下図ウィンドウが開きます。

 

 

ここで、

プロジェクトの種類:CLR
テンプレート:Windowsフォームアプリケーション

 

を選択し、プロジェクト名に適当な名前を入力し、OKボタンをクリックします。
(ソリューションのディレクトリを作成のチェックは入れておきます。)
すると下図のようなウィンドウが表示されます。

 

 

この状態で、ツールバーにある再生ボタン(デバッグ開始)をクリックすると、ビルドの確認ダイアログボックスが表示されるので、はいボタンをクリックします。

 

 

するとプログラムがビルドされ、これだけで空のウィンドウが表示されるだけのプログラムが実行されます。

 

 

ところで、ソリューションって何???と思う人もいるかと思いますが、今回はTestというプロジェクトを
作成しましたが、このとき作成されたファイルのディレクトリ構造は以下のようになっています。

Test ←ソリューションフォルダ
┣ Test ←プロジェクトフォルダ
┃  ┣ app.ico
┃  ┣ apprc
┃  ┣ AssemblyInfo.cpp
┃  ┣ Form1.h
┃  ┣ Form1.resX
┃  ┣ ReadMe.txt
┃  ┣ resource.h
┃  ┣ stdafx.cpp
┃  ┣ stdafx.cpp
┃  ┣ stdafx.h
┃  ┣ Test.cpp
┃  ┗ Test.vcproj ←プロジェクトファイル
┣ Test.ncb
┣ Test.sln ←ソリューションファイル
┗ Test.suo

 

となっています。
つまり、プロジェクトの1つ上の階層にソリューションが作成されているのですが、アプリケーションを開発するときに、メインのプロジェクト、ライブラリのプロジェクト、ユーザコントロールのプロジェクトなどを
同時進行で開発する場合など、各プロジェクトを取りまとめるのがソリューションの役目です。
このようにすることで、各プロジェクトをまたいでデバッグができるようになるので、うまく使うと便利な機能です。
もっとも、1つのプロジェクトしか使わない場合はソリューションは邪魔にしか思えないと思いますが、
ソリューションファイル(*.sln)は、必ず1つ作成されます。

 

 

C++/CLIって何?

よく、お使いの言語は何ですか?と尋ねると

 

『Visual C++』

 

です。
という答えが返ってくるのですが、このC++/CLIの登場によって、Visual C++が差すものが何なのか?ますます分からなくなってきました。

 

現在、Visual StudioでC++言語が扱えるのは

  • MFC(Microsoft Foundation Class)
  • SDK(Software Development Kit)
  • C++/CLI

の3つでしょうか?

 

C++/CLIはこれらの良いとこ取りをしたような言語で、GUI部分はVB6.0のようなフォームエディタで作成し、ボタンをダブルクリックする事でイベント処理を追加していきます。
また、従来のWin32 APIも使えるし、MFCのクラスも使えるし、最近主流になってきているVB.NETやC#などが使っている.NET Frameworkも使う事が可能です。

 

また、C#などでは基本的に使えないポインタもそのまま使う事が可能です。

 

もし、これまで、GUIはVB6.0で作って、処理部分はWin32APIや自作のライブラリを作って来たような人にとっては、比較的とっつき易いと思います。

 

ただ、あまりにゴチャゴチャに開発ができるようにしてしまったせいか、最新のVisual Studio 2010ではIntellisenseが使えないなど、ここ最近は、いまいちMicrosoftのやる気が感じられません。

 

という事で、これから先が不透明感のある感じなのですが、これまで作成してきたC++の資産を生かしつつ簡単なGUI周りを作成したい方にはオススメです。
ただし、多少凝ったソフトになると、フォーム間の参照や64bitの対応など、他のVB.NETやC#と比べてかなり面倒なので、評価用のサンプルを作る程度に留めておいた方が無難です。

 

もし、新規にプログラムを始めたい方にはC#の方が良いと思います。
C#もC++/CLIも.NET Frameworkを使うプログラムなので、基本的には同じような物と言いつつも、少しずつC#の方が優遇されているような気がします。

 

なので、C++/CLIで従来のC++のライブラリを使ったクラスライブラリを作成し、画面周りなどのアプリケーションよりな部分はC#で作る!というのが私なりの現在の結論なのですが、C++/CLIの情報は非常に少ないので、記事にまとめていこうと思います。

 

【追記】

結局、C++/CLIを使うのは辞めました。

フォーム間参照が面倒だし、/MT(d)が指定できないし、Any CPUがないし・・・

AnyCPUが無いと、OSが64bitであっても32bitで動いているVisual Studioでは、フォームエディタにカスタムコントロールを配置しようとすると、64bitにコントロールを対応させようとすると、AnyCPUでないと都合が悪いんですよね。

 

という事で、フォーム周りはC#で作る方がおすすめです。

フリーで使えるVisual Studio Expressの入手

2012年10月現在、最新版はVisual Studio 2012となりました。

VS2012 Expressについては、下記、記事にまとめました。

Visual Studio 2012 Expressが公開されました

 

以下は、旧版の内容です。

———————————————————

VB.NET、C#、C++/CLIをこれから始めようとしている方は、まずは無料で使えるVisual Studio Expressを試すのがオススメです。
このVisual Studio Expressは、プログラム初心者や学生向けという位置づけですが、そこそこの事ができます。

 

入手先はこちら

 

http://www.microsoft.com/japan/msdn/vstudio/express/

 

旧版のVisual Studio 2008 Express Editionもこちらから入手可能です。

 

http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/

 

Visual Studio 2010のC++/CLIではIntellisense(携帯で言うところの予測入力みたいなもの)が使えないので、C++/CLIをやりたい場合は、VS2008の方がいいと思います。

 

 

このExpressでは何ができないか?というと、細かい事はVisual Studio 2005の場合ですが、

 

@IT
http://www.atmarkit.co.jp/fdotnet/special/vs2005compare/vs2005compare_01.html

 

に任せるとして、私がExpressで不便に感じたのは

 

  • C++/CLIのExpressにはリソースエディタが無い
    →バージョン管理ができない、SDKのウィンドウが作れない。
  • ユーザーコントロールが作れない
  • マクロ機能が無い
  • ソリューションが多言語をまたげない
    →VB.NETやC#の混在が出来ない。

 

などなど。

 

と、言いながらもちょっとしたアプリケーションを作るだけなら、かなりの事が出来るので、まずはこのExpressから初めてみては如何でしょうか?

 

Visual Studioへ戻る