【VisualStudio】任意キーワード(Int32など)に色を付ける

VisualStudioを使っていると、int doubleの文字は青く表示されますが、これを.NETっぽくInt32Doubleなどと書くと、色が付いてくれないので、ちょっと見づらくなります。

 

しかし、これらの任意の文字列に色を付けて表示する方法があります。

 

その方法は、

  1. 色を付けたいキーワードを1行に1つずつテキストエディタで書き、これを「usertype.dat」というファイル名で保存する。
  2. 保存したファイル(usertype.dat)を「devenv.exe」というファイルのあるフォルダに保存する。
    Visual C++ 2005 Express Editionでの私の環境では
    C:\Program Files\Microsoft Visual Studio 8\Common7\IDE
    のフォルダに保存します。
  3. VisauStudioを起動する。

 

(情報元)
http://msdn.microsoft.com/ja-jp/library/aa301710(VS.71).aspx

 

すると、こんな感じになります。

 

【キーワード設定前】

 

【キーワード設定後】

 

これで少しは見やすくなる?と思います。
参考までに私のusertype.datのテキストを以下に示します。
各自、使いやすいように編集してみて下さい。

 

System

Array
Boolean
Byte
Char
DateTime
Double
Enum
EventArgs
Int16
Int32
Int64
IntPtr
Math
Random
SByte
Single
String
UInt16
UInt32
UInt64

Collections
ComponentModel
Container
Data
Drawing
EventArgs
EventHandler
Object

Bitmap
Brush
Brushes
Color
Font
Graphics
Image
Pen
Pens
Point
PointF
Rectangle
RectangleF
SolidBrush
Size
SizeF

Drawing2D
DashStyle
FillMode
LineCap

Imaging

BitmapData

Diagnostics
Stopwatch

IO

BinaryReader
BinaryWriter
FileStream
StreamReader
StreamWriter
StringReader
StringWriter

Windows

Forms

Application
Button
CheckBox
ComboBox
CommonDialog
Control
Cursor
DataGrid
DataGridView
FileDialog
FontDialog
Form
GroupBox
HScrollBar
ImageList
KeyEventArgs
Label
ListBox
ListView
MainMenu
Menu
MenuStrip
MessageBox
MonthCalender
OpenFileDialog
Padding
Panel
PictureBox
RadioButton
RichText
SaveFileDialog
Screen
ScrollBar
Splitter
SatusBar
SatusStrip
TabControl
TextBox
ToolBar
ToolBarButton
ToolStrip
ToolStripButton
ToolStripComboBox
ToolStripLabel
ToolStripMenuItem
ToolStripSeparator
ToolStripStatusLabel
TreeNode
TreeView
VScrollBar

NULL

IplImage

Ipp8u
Ipp16u

IppStatus
IppiSize
IppiRect

 

Visual Studioへ戻る

 

【VisualStudio】『元の位置へ移動』はどこへ行った?

VisualStudio6.0を使っている頃には右ボタン→元の位置へ移動のメニューをよく使っていた
のですが、これがVisualStudio2005には無い!!!

 

よくよく探してみると、ツールバーののボタンか、メニューの表示→戻るで元の位置へ移動する
ことができる。

 

でも、結局は表示→戻るのショートカットキーに設定されている、Ctrl + 負符号(-)を使って
元の位置へ移動するので、落ち着いています。

 

他にもショートカットキーはいろいろ用意されているみたいです。
詳細はこちら↓を見ると参考になると思います。
http://msdn.microsoft.com/ja-jp/vstudio/dd183141.aspx


 

と思ったのですが、最近、このキーボードとマウスのセット

 

 

を購入したのですが、5つボタンの設定で、左右のボタンにデフォルトの設定でブラウザの進む、戻るが割り振られていて、このボタンがVisual Studioにおいても進む/戻るに対応していたので、5つボタンマウスを持っている人はこっちの方が簡単だと思います。

 

このマウス、ちょっと大きいのですが、左手でマウスを使う私にとっても、握りやすい形で、会社と自宅の両方で使っているぐらい、最近のちょっとお気に入りです。

 

昔は、キーボードやマウスと言えば、レスポンスの良いPS/2の有線接続、キーボードはキータッチの気持ちいメカスイッチじゃないとヤダ!

とか思っていたのですが、レスポンスは悪くないし、無線なので、机のまわりがスッキリするし、キーボードも、キーストロークの短いキーボードは、慣れてくると速くキー入力ができるような気がします。

 

Visual Studioへ戻る

 

【VisualStudio】ブレークポイントが無効になる場合

ブレークポイントを設定しデバッグ実行を行っても、ブレークポイントが赤丸から白丸になり、
三角のビックリマークが付いて、ブレークポイントが無効になり、指定したブレークポイントでも
その場所で止まってくれない場合があります。

 

 

そんな時にはメニューのツール→オプション→デバッグ→全般を選択し、

 

元のバージョンと完全に一致するソースファイルを必要とする

 

に付いているチェックマークを外すと、ブレークポイントが有効になります。

 

 

上図はVisual Studio C++ Service Pack 1の場合です。
SP1があたっていない場合?ではデフォルトではデバッグが表示されていない場合があるようです。

 

 

この場合、左下のすべての設定を表示にチェックを入れると↓

 

 

デバッグが表示されるので、元のバージョンと完全に一致するソース ファイルを必要とするのチェックを外します。

 

この現象は古いVisualStudio(Ver6.0など)で作成したソースコードを新しいVisualStudio
(2005など)でデバッグ実行を行った場合などに起こる場合があるようです。

 

もし、この『元のバージョンと・・・』のチェックマークを外してもブレークポイントが無効になって
しまう場合は、デバッグしようとしているプロジェクトがユーザコントロールやライブラリで、
他の実行ファイル(*.exe)から参照して実行した場合に起こったりもします。
その場合は、

●デバッグ実行した時(コンパイル時)にエラーは無かったか?
●実行ファイルの参照設定は正しく行われているか?(ReleaseとDebugとの違いにも注意)

 

を確認してみて下さい。

 

Visual Studioの記事一覧へ戻る

【C++/CLI】画像データの拡大縮小

画像表示の拡大縮小については画像の拡大縮小表示(高機能版)として紹介しましたが、今回は画像データのそのものを拡大縮小する方法を紹介します。

 

画像データを拡大縮小するにはSystem.Drawing.Bitmapクラスの以下のコンストラクタを用いる事で可能となります。

 

Bitmap (
    Image^ original,
    int width,
    int height
)

 

概要

指定したサイズを使用して、指定した既存のイメージで Bitmap クラスの新しいインスタンスを初期化します。

 

パラメータ

original 新しい Bitmap の作成元の Image
width 新しい Bitmap の幅 (ピクセル単位)
height 新しい Bitmap の高さ (ピクセル単位)

 

処理例

//元の画像
Bitmap^ src = gcnew Bitmap("test.bmp");
//縮小画像(1/2に縮小)
Bitmap^ dstSmall = gcnew Bitmap(src, src->Width / 2, src->Height / 2);
//画像の保存
dstSmall->Save("SmallImage.bmp", Imaging::ImageFormat::Bmp);
//拡大画像(2倍に拡大)
Bitmap^ dstBig = gcnew Bitmap(src, src->Width * 2, src->Height * 2);
//画像の保存
dstBig->Save("BigImage.bmp", Imaging::ImageFormat::Bmp);

 

処理結果

元の画像(test.bmp)

 

縮小画像(SmallImage.bmp)

 

拡大画像(BigImage.bmp)

 

補間モード(InterpolationMode)を指定して保存したい場合は、いったんGraphicsを通して画像を描画することで、補間モードを設定します。

 

//元の画像
Bitmap^ src = gcnew Bitmap("test.bmp");
//拡大画像データの確保
Bitmap^ dst = gcnew Bitmap(src->Width * 2, src->Height * 2);
//Graphicsオブジェクトの確保
Graphics^ g = Graphics::FromImage(dst);
//補間モードの設定
g->InterpolationMode = Drawing2D::InterpolationMode::HighQualityBicubic;
//拡大してGraphicsへ描画
g->DrawImage(src, 0, 0, src->Width * 2, src->Height * 2);
//画像の保存
dst->Save("BigImage.bmp", Imaging::ImageFormat::Bmp);

ただし、この方法では元の画像データ(src)がモノクロデータ(8Bit)の場合、上記のプログラムのままではR,G,Bの値が等しい24Bitのカラー画像として保存されてしまいます。
モノクロ画像データとして保存したい場合は、カラー画像からモノクロ画像に変換するしかなさそうです。

【C++/CLI】画像の拡大縮小表示(高機能版)

画像の拡大縮小表示(簡易版)のページでは、簡単に画像の拡大縮小表示する方法を紹介しましたが、画像サイズが大きいときなど、不都合な場合があるのですが、その時にはDrawImageメソッドを使って画像を拡大縮小表示します。

Win32APIのStretchDIBits関数に相当するのが、.NETではGraphicsクラスのDrawImageメソッドになります。
DrawImageメソッドには実に30個ものオーバーロードがあり、その分だけ高機能になっているのですが、詳細はMSDNに任せるとして、これまで慣れ親しんできたStretchDIBitsに近いメソッドを紹介します。

 

DrawImageの構文は以下の通り

void DrawImage (
	Image^ image,
	Rectangle destRect,
	Rectangle srcRect,
	GraphicsUnit srcUnit
)
image 描画するImageオブジェクト
通常はBitmapオブジェクトを渡す
destRect 描画先(ピクチャボックスなど)の描画領域
srcRect 描画するImageオブジェクトの領域
srcUnit srcRect パラメータで使用する単位を指定する GraphicsUnit 列挙体のメンバ
通常はGraphicsUnit::Pixelと指定すればOK

 

また、Win32APIのSetStretchBltModeのように伸縮モードを設定するには、.NETでは
GraphicsオブジェクトのInterpolationModeプロパティで設定します。

 

Default 規定の補間モード
High 高品質補間
Low 低品質補間
NearestNeighbor 最近傍補間
Bilinear 双一次補間
Bicubic 双三次補間
HighQualityBilinear 高品質双一次補間
HighQualityBicubic 高品質双三次補間

 

画像処理のプログラムでは画素の1つ1つが良くわかるNearestNeighborがオススメです。

 

ということで、画像を等倍で表示する場合は、srcRectとdestRectを同じサイズに指定します。

 

画像を n倍に拡大する場合は、srcRectをdestRectの1/n倍のサイズに指定します。

 

 

この処理のサンプルプログラムは以下に示しておきます。
ただし、エラー処理などはまるで無視しています。

 

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

     //PictureBoxと同じ大きさのBitmapクラスを作成する。
     Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
     //空のBitmapをPictureBoxのImageに指定する。
     pictureBox1->Image = bmpPicBox;
     //Graphicsクラスの作成(空のピクチャボックスからGraphicsを作成する)
     Graphics^g = Graphics::FromImage(pictureBox1->Image);

     //伸縮モードをNearestNeighborに設定
     g->InterpolationMode = Drawing2D::InterpolationMode::NearestNeighbor;

     //描画するビットマップ
     Bitmap^ bmp = gcnew Bitmap("c:\\test.bmp");
     //画像の描画
     int DrawScale = 5;
     g->DrawImage(bmp,
      System::Drawing::Rectangle(0, 0, pictureBox1->Width, pictureBox1->Height),
      System::Drawing::Rectangle(140, 100, pictureBox1->Width / DrawScale, pictureBox1->Height / DrawScale),
      GraphicsUnit::Pixel);
    }

 

実行画面

 

OpenCVのバグ

本記事は古い情報となります。

 

OpenCVには、いくつか有名なバグがあります。

 

バグの情報に関しては、こちらのページ

https://code.ros.org/trac/opencv/report

で確認できますが、私の知っている気になったバグは以下の通り

 

  • cvErode/cvDilate
    iterationsに2以上の値を指定すると、膨張/収縮の中心位置がずれる
  • 画像の読み込み(cvLoadImage、cv::imread)(Ver2.1)
    大きな画像を開けない
  • Windows7 64bitでUSBカメラが使えない (Ver2.2)

 

などなど。

 

以前に使えていた物も、新しいバージョンではバグになるという、ソフト屋さんではやってはいけないような事もあるので、要注意ですね。

 

OpenCVへ戻る

 

【C++/CLI】Graphicsオブジェクトの作成

.NETではピクチャボックスに画像や線、文字などを描画するには、Graphicsオブジェクトを作成し、このGraphicsオブジェクトに対して描画を行います。

 

Graphicsオブジェクトを作成する方法は3つ。
1.Imageオブジェクトから作成(オススメ!)
2.CreateGraphicsメソッドを使う方法(使わないことをオススメ!)
3.PaintイベントのPaintEventArgsから取得する方法

 

Graphiscオブジェクトを作成したら、画像の描画は

g->DrawImage(bmp, 0, 0);

線の描画は

g->DrawLine(Pens::Blue,0, 0, 100, 100);

というような具合で。

 

Imageオブジェクトから作成

(コード例)

//PictureBoxと同じ大きさのBitmapクラスを作成する。
Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
//空のBitmapをPictureBoxのImageに指定する。
pictureBox1->Image = bmpPicBox;
//Graphicsオブジェクトの作成(FromImageを使う)
Graphics^ g = Graphics::FromImage(pictureBox1->Image);

 

上記コードをフォームのResizeイベントなどで処理を行い、作成したGraphicsオブジェクトを使い回せばよいかと思います。
この手法だと再描画は勝手にやってくれる上に、CreateGraphicsを使うよりも
格段に描画が速くなります。
.NET(GDI+)による描画が遅い!と思っている方は、まずはこの方法をお試し下さい。
(でも個人的には、それでも遅く感じます)

 

CreateGraphicsメソッドを使う

(コード例)

//Graphicsオブジェクトの作成(CreateGraphicsを使う)
Graphics^ g = pictureBox1->CreateGraphics();

 

この手法だと簡単ですが描画がかなり遅くなります。
しかも再描画してくれません...
説明が簡単なので、使っちゃう場合もありますが。

 

PaintイベントのPaintEventArgsから取得する

(コード例)

private: System::Void pictureBox1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {
//PaintEventArgsから取得
Graphics^ g = e->Graphics;
}

この方法が一番高速ですが、ちょっと扱いにくい。

 

ImageオブジェクトからGraphicsオブジェクトを作成する方法とCreateGraphisメソッドを使った方法の処理時間の比較などを「モノクロ画像の上に線などを描画」のページで紹介しています。
もしよろしければご参照下さい。

【C++/CLI】モノクロ画像の上に線などを描画

モノクロ画像の上に線などを描画する方法をまとめました。

 

【目標】

  • モノクロ/カラー区別なく画像の上に描画できること
  • 高速に描画できること
  • 再描画すること

     

    作成したサンプルプログラムはこんな感じ↓です。

     

    (サンプルプログラムの使い方)
    各ボタンをクリックするとファイルを開くダイアログボックスが開きますので、ビットマップファイルを指定して下さい。
    (ダウンロード)MonoImageDisp2005.zip(Visual Studio 2005 Express Edition版)

     

    準備

    線の描画は条件を同じにするため、以下の関数を使い回しました。

    void DrawGraphics(Graphics^ g){
    	//ギザギザ模様を画像の上に描画
    
    	int i, j;
    
    	//ギザギザの線の描画
        for (j = 0; j < 256; j+= 3){
    	    for (i = 0; i < 25; i++){ g->DrawLine(Pens::Blue, i * 10, j, i * 10 + 5, j - 5);
    		    g->DrawLine(Pens::Blue, i * 10 + 5, j - 5, i * 10 + 10, j);
    	    }
        }
    }

    よくあるサンプルプログラム

    private: System::Void btnBitmap_Click(System::Object^  sender, System::EventArgs^  e) {
    		 //ビットマップファイルからBitmapクラスを作成し、ピクチャボックスへ渡す方法
    		 //モノクロ画像だとエラーになります。
    
    	     try{
    			//描画時間計測用
    		    Diagnostics::Stopwatch^ sw = gcnew Diagnostics::Stopwatch;
    
    			//ピクチャボックスの画像クリア
    			pictureBox1->Image = nullptr;
    
    			//画像ファイル名の取得
    			String^ FileName = GetImageFilename();
    			//Bitmapクラスの作成
    			Bitmap^ bmp = gcnew Bitmap(FileName);
    			//PictureBoxへBitmapを表示する。
    			pictureBox1->Image = bmp;
    
    			//Graphicsクラスの作成
    			//※モノクロ画像ファイルを開くと、ここでエラーになります。
    			Graphics^ g = Graphics::FromImage(bmp);
    			//画像の上にギザギザ模様の描画
    			sw->Start();
    			DrawGraphics(g);
    			sw->Stop();
    			//描画時間表示
    			MessageBox::Show("描画時間 = " + sw->ElapsedMilliseconds.ToString() + " msec");
    
    		 }catch(Exception^ err){
    			//エラーの表示
    			MessageBox::Show(err->Message);
    		 }
    	 }

    このプログラムではカラー画像では問題ないのですが、8ビットモノクロ画像ファイルを開くとFromImageメソッドでエラーとなります。

     

    CreateGraphicsを使ってGraphicsクラスを作成する方法

    private: System::Void btnCreateGraphics_Click(System::Object^  sender, System::EventArgs^  e) {
    		 //CreateGraphicsを使ってGraphicsクラスを作成し描画する。
    		 //モノクロ画像の上にも描画できますが、描画時間がかなり遅くなります。
    		 //描画したギザギザ模様は再描画されません。
    
    		 try{
    			//描画時間計測用
    		    Diagnostics::Stopwatch^ sw = gcnew Diagnostics::Stopwatch;
    
    			//ピクチャボックスの画像クリア
    			pictureBox1->Image = nullptr;
    
    			//Graphicsクラスの作成(CreateGraphicsを使う)
    			Graphics^ g = pictureBox1->CreateGraphics();
    
    			//画像ファイル名の取得
    			String^ FileName = GetImageFilename();
    			//Bitmapクラスの作成
    			Bitmap^ bmp = gcnew Bitmap(FileName);
    			//PictureBoxへBitmapを表示する。
    			pictureBox1->Image = bmp;
    			pictureBox1->Refresh();
    
    			//画像の上にギザギザ模様の描画
    			sw->Start();
    			DrawGraphics(g);
    			sw->Stop();
    			//描画時間表示
    			MessageBox::Show("描画時間 = " + sw->ElapsedMilliseconds.ToString() + " msec");
    
    		 }catch(Exception^ err){
    			//エラーの表示
    			MessageBox::Show(err->Message);
    		 }
    	 }

    このプログラムでは、モノクロ画像ファイルを開いても、モノクロ画像の上に線を描画することができます。
    ただし、遅い!!!
    再描画もされません。

    PictureBoxと同じ大きさのBitmapクラスを作成し、ピクチャボックスのImageへ。画像データはDrawImageで描画

    /private: System::Void btnDrawImage_Click(System::Object^  sender, System::EventArgs^  e) {
    		 //ピクチャボックス表示用と画像データ用と別のBitmapクラスを作成し、
    		 //ピクチャボックスにはDrawImageを使って画像を描画する。
    		 //モノクロ画像でも表示可能
    		 //再描画可能、CreateGraphicsを使うより高速
    
    		 try{
    			//描画時間計測用
    		    Diagnostics::Stopwatch^ sw = gcnew Diagnostics::Stopwatch;
    
    			//ピクチャボックスの画像クリア
    			//pictureBox1->Image = nullptr;
    
    			//画像ファイル名の取得
    			String^ FileName = GetImageFilename();
    			//Bitmapクラスの作成
    			Bitmap^ bmpFileImage = gcnew Bitmap(FileName);
    
    			//PictureBoxの大きさを画像の大きさに合わせる
    			pictureBox1->Width  = bmpFileImage->Width;
    			pictureBox1->Height = bmpFileImage->Height;
    
    			//PictureBoxと同じ大きさのBitmapクラスを作成する。
    			Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height);
    			//空のBitmapをPictureBoxのImageに指定する。
    			pictureBox1->Image = bmpPicBox;
    			//Graphicsクラスの作成(CreateGraphicsを使う)
    			Graphics^ g = Graphics::FromImage(pictureBox1->Image);
    
    			//PictureBoxへBitmapを描画する。
    			g->DrawImage(bmpFileImage, 0, 0);
    			pictureBox1->Invalidate();
    
    			//画像の上にギザギザ模様の描画
    			sw->Start();
    			DrawGraphics(g);
    			sw->Stop();
    			//描画時間表示
    			MessageBox::Show("描画時間 = " + sw->ElapsedMilliseconds.ToString() + " msec");
    
    		 }catch(Exception^ err){
    			//エラーの表示
    			MessageBox::Show(err->Message);
    		 }
    	 }

    最初にピクチャボックスと同じ大きさのBitmapクラスを作成し、ピクチャボックスのImageクラスへ渡す。ピクチャボックスのImageからFromImageメソッドでGraphicsクラスを作成。
    このようにすると、モノクロ画像の上にも線を描画することができ、再描画も勝手にしてくれます。
    しかも、CreateGraphicsを使ってGraphicsクラスを作成した場合よりも、描画速度は10倍くらい速くなります。

    【C++/CLI】大文字/小文字、全角/半角、ひらがな/カタカナを区別せず比較する

    字列を比較する際に、文字の大文字/小文字、全角/半角、ひらがな/カタカナを区別せず比較したい場合があります。

    大文字/小文字を区別せずに比較するのは、比較的、情報も多く、

    System.StringクラスのCompareメソッド

    を使います。
    使用例はこんな感じ↓

     

    String^ strA = "Labeling";
    String^ strB = "labeling";
    
    if (String::Compare(strA, strB, true) == 0){
    MessageBox::Show("strAとstrBは同じ");
    }

     

    ただ、実際には、日本語を比較する場合は、全角/半角、ひらがな/カタカナを区別しないで比較したい場合が多く、この場合はSystem.Globalization.CompareInfoクラスCompareメソッドを使います。

     

    (使用例)

    System::Globalization::CompareInfo^ ci =
    System::Globalization::CultureInfo::CurrentCulture->CompareInfo;
    
    String^ strA = "ラベリング";
    String^ strB = "らべりんぐ";
    
    if (ci->Compare(strA, strB,
    System::Globalization::CompareOptions::IgnoreWidth |         //全角/半角を無視
    System::Globalization::CompareOptions::IgnoreCase |          //大文字/小文字を無視
    System::Globalization::CompareOptions::IgnoreKanaType    //ひらがな/カタカナを無視
    ) == 0){
    MessageBox::Show("strAとstrBは同じ");
    }

     

    詳しくはDOBON.NETの

    2つの文字列が等しいかを調べる
    大文字小文字、半角全角、ひらがなカタカナの区別をしないで文字列を比較する

    が参考になります。

     

    実は”ラベリング”と”ラベリング”の文字列を比較するのに大はまりして、
    ひらがなの”ベ” と カタカナの ”ベ” がある事に気が付くまで、とても苦労してしまいました...

    【C++/CLI】VB.NET固有の関数を使用する方法

    .NET Framework ではVisual Basic.NETであっても、ただのVisualBasicという名前空間であるだけなので、C#やC++/CLIからVB.NET固有の関数を使うことが可能です。

     

    以下、VB固有の関数の代表格のInputBox関数の使用方法を紹介します。

     

    まず、VisualBasicの名前空間を参照できるように参照設定を行います。

     

    プロジェクトの名前の部分で右ボタンをクリックし、参照を選択します。

     

     

    次に新しい参照の追加ボタンをクリックします。

     

     

    すると、使用可能な.NETの名前空間を表示されるので、この中からMicrosoft.VisualBaicを選択しOKボタンをクリックします。

     

     

    すると、現在参照設定している名前空間の一覧にMicrosoft.VisualBasicの名前か追加されます。

     

     

    これで準備は完了です。

     

    実際にInputBoxを呼び出すのは、こんな感じ↓です。

     

    String^ str = Microsoft::VisualBasic::Interaction::InputBox(“入力文字?”, “タイトル”, “初期値”, -1, -1);

     

    とすると、このよう↓に表示されます。

     

     

    C++からVBの関数が呼べてしまうのは不思議な感じもしますが、他にも使いたいVBの関数があったので、今回わざわざ記事にしてみました。

    【C++/CLI】大文字/小文字、全角/半角、ひらがな/カタカナ変換

    大文字/小文字の変換をするには System.String クラスToLowerToUpper メソッドを用います。

     

    【コード例】

    String^ str;
    
    //大文字→小文字変換
    str = "ImagingSolution";    // → imagingsolution
    str = str->ToLower();
    //小文字→大文字変換
    str = "Imagingsolution";    // → IMAGINGSOLUTION
    str = str->ToUpper();

    さらにVBの関数を用いると全角/半角、ひらがな/カタカナの変換も行う事が出来ます。
    VBの関数をC++/CLIから使う方法は VB.NET固有の関数を使用する方法 を参照願います。

     

    【コード例】

    using namespace Microsoft::VisualBasic;
    
    String^ str;
    
    //大文字→小文字変換
    str = "ImagingSolution";    //→imagingsolution
    str = Strings::StrConv(str, VbStrConv::Lowercase, 0);
    //小文字→大文字変換
    str = "Imagingsolution";    //→IMAGINGSOLUTION
    str = Strings::StrConv(str, VbStrConv::Uppercase, 0);
    
    //全角→半角変換
    str = "画像処理ソリューション";    //→画像処理ソリューション
    str = Strings::StrConv(str, VbStrConv::Narrow, 0);
    //半角→全角変換
    str = "画像処理ソリューション";            //→画像処理ソリューション
    str = Strings::StrConv(str, VbStrConv::Wide, 0);
    
    //ひらがな→カタカナ
    str = "画像処理そりゅーしょん";    //→画像処理ソリューション
    str = Strings::StrConv(str, VbStrConv::Katakana, 0);
    //カタカナ→ひらがな
    str = "画像処理ソリューション";    //→画像処理そりゅーしょん
    str = Strings::StrConv(str, VbStrConv::Hiragana, 0);
    

    (参考)
    http://msdn.microsoft.com/ja-jp/library/7wtc81z6%28v=VS.80%29.aspx
    http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.vbstrconv.aspx

    【C++/CLI】ファイルパス(フルパス)からファイル名、拡張子、ディレクトリの取得

    ファイルを開くダイアログボックスなどから取得したファイル名(フルパス)からファイル名や拡張子、
    ディレクトリなどを取得する場合には

    System::IOクラスのGet×××メソッド

    を用います。

     

    以下、サンプルプログラムです。

    //ファイル名(フルパス)
    String^ FullPath = "c:\\Dir1\\Dir2\\Bitmap.bmp";
    String ^FileName, ^Extension, ^Directory;
    
    //ファイル名の取得(拡張子を含む)        → "Bitmap.bmp"
    FileName = IO::Path::GetFileName(FullPath);
    //ファイル名の取得(拡張子を含まない) → "Bitmap"
    FileName = IO::Path::GetFileNameWithoutExtension(FullPath);
    //拡張子の取得                         → ".bmp"  ※ピリオド"."を含みます。
    Extension = IO::Path::GetExtension(FullPath);
    //ディレクトリの取得                    → "c:\Dir1\Dir2"
    Directory = IO::Path::GetDirectoryName (FullPath);
    //相対パスから絶対パスを取得            → "c:\Dir1\Dir2\Bitmap.bmp"
    FullPath = IO::Path::GetFullPath("Bitmap.bmp");

     

    相対パスから絶対パスを取得する場合、指定したファイル名がカレントディレクトリに無い場合は
    カレントディレクトリにファイル名が追加された文字列が返されます。

    【C++/CLI】数値の書式(フォーマット)指定文字列

    数値の表示桁数などの設定にはFormatメソッドかToStringメソッドなどで可能ですが、ここではToStringメソッドによる設定方法を紹介します。

     

    【コード例】
    int Val = 123;
    String^ Txt = Val.ToString(“D5”);

     

    とすると
    Txt = “00123”
    となります。

     

    以下、主なフォーマットの設定例です。

     

    標準書式指定文字列

    書式 書式設定文字列 データ型 出力
    10進数 D Int32 123 123
    10進数(桁数設定) D5 Int32 123 00123
    固定小数点 F Double 123.456 123.46
    固定小数点(桁数設定) F6 Double 123.456 123.456000
    パーセント P Double 0.12345 12.35%
    パーセント(桁数設定) P3 Double 0.123456 12.346%
    16進数(小文字) x Int32 123456 1e240
    16進数(大文字) X Int32 123456 1E240
    通貨 C Double 1234567 \1,234,567
    数字 N Double 123456 123,456.00
    数字(桁数設定) N1 Double 12345678 123,456.8

    詳細は下記ページを参照願います。

    http://msdn.microsoft.com/ja-jp/library/241ad66z(VS.80).aspx

     

    カスタム数値書式指定文字列

    書式 書式設定文字列 データ型 出力
    ゼロプレースホルダ 00000 Double 123 00123
    000.000 Double 12.3456 012.346
    000.000 Double 123.45 123.450
    桁プレースホルダ ##### Double 123 123
    #.# Double 1.2 1.2
    #.# Double 1 1
    #.# Double 123.456 123.5
    #,# Double 123456789 123,456,789
    (00)####-#### Double 312345678 (03)1234-5678
    正、負、0別表示 +#;-#;±0 Double 123 +123
    +#;-#;±0 Double -123 -123
    +#;-#;±0 Double 0 ±0
    #;(#) Double 123 123
    #;(#) Double -123 (123)

    詳細は下記ページを参照願います

    http://msdn.microsoft.com/ja-jp/library/7x5bacwt(VS.80).aspx

     

    【右寄せ】
    int Val = 123;
    String^ Txt = Val.ToString()->PadLeft(5);
    とすると
    Txt = ”  123″
    となります。

     

    【左寄せ】
    int Val = 123;
    String^ Txt = Val.ToString()->PadRight(5);
    とすると
    Txt = “123  ”
    となります。

     

    右寄せ/左寄せは、少し紛らわしいですが、左側を穴埋めして右寄せ(PadLeft)、右側を穴埋めして左寄せ(PadRight)となります。
    カッコ内の数値が文字数になります。

     

    【C++/CLI】文字列の分割(System.String.Splitメソッド)

    文字列を特定の文字で分割し、Stringの配列に格納するには

    System.String.Splitメソッド

    を用います。
    CSVファイルを読み込む時などはカンマ(,)で区切るので、このSplitメソッドを使います。

     

    このメソッドの定義は

    array^ Split (
        array<String^>^ separator,
        StringSplitOptions options
    )

     

    パラメータ

    separator

    分割する文字列をString配列で指定します。

    options

    StringSplitOptions::Nodeを指定すると分割した文字列が空の場合でもそのまま返します。
    StringSplitOptions::RemoveEmptyEntriesを指定すると分割した文字列が空の場合、除去されます

     

    【サンプルプログラム】

    String^ SrcText = "A,B;C,,E,F";
    
    //分割する文字列の配列
    array<String^>^ SepString ={",", ";"};
    
    //文字列の分割
    array<String^>^ TextArr1 = SrcText->Split(SepString, StringSplitOptions::RemoveEmptyEntries);
    array<String^>^ TextArr2 = SrcText->Split(SepString, StringSplitOptions::None);

    このコードを実行し、TestArr1とTestArr2の中身をウォッチで確認すると、以下の通りとなります。

     

     

    区切り文字が1つの場合は

    array<String^>^ TextArr3 = SrcText->Split(‘,’);

    のように区切ることもできます。
    ただし、この場合はシングルクォーテーション( )なので注意して下さい。

    【C++/CLI】改行文字

    メッセージボックスなどの文字列を改行させる時には

    System.Environment.NewLineプロパティ

    を用います。

    以下、サンプルと実行例です。

     

    【サンプルプログラム】

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
             button1->Text = "1行目の文字列" + Environment::NewLine +
                                     "2行目の文字列";
             label1->Text  = "1行目の文字列" + Environment::NewLine +
                                    "2行目の文字列";
    
             MessageBox::Show("ボタンとラベルの文字列が" + Environment::NewLine +
                                           "変更されました。");
         }

     

    【実行例】

     

    ボタンやラベルに関しては、プロパティウィンドウで文字列を入力すると改行も繁栄されます。

    また、System.Environment.NewLineプロパティを使わずとも、\n\rを使って

     

    MessageBox::Show(“ボタンとラベルの文字列が\r\n変更されました。”);

     

    のように書くことも可能です。

     

    【C++/CLI】テキストボックスの文字列を変数へ代入

    テキストボックスの文字列はtextbox1->Textのようにすると取得できますが、この文字列を数値へ変換するには各型に用意されているParseメソッドを使います。

     

    (例)
    int Val= int::Parse(textbox1->Text);

     

    文字列変換する型は必要に応じて変えてください。
    ただし、この場合、テキストボックスに数値ではない文字列が入力された場合、エラーとなるので、エラー処理を行う場合はTryParseメソッドを用います。

    (例)
    int Val;
    bool result = int::TryParse(textbox1->Text, Val );

     

    テキストボックスの文字列がint 型として判断された場合、変数(上の例ではVal)に値が代入され、戻り値(result)にtrueが戻されます。
    失敗した場合は戻り値がfalseとなります。

     

    このエラー処理を用いると、数値としてByte型の値(0~255)が欲しいときなど便利です。

     

    (例)
    Byte Val ;
    bool result = Byte::TryParse(textbox1->Text, Val );

     

    詳細はmsdn2の「Int32.TryParse メソッド 」に記載されています。