メールマガジン・新着情報一覧
- TOP
- メールマガジン・新着情報一覧
- A-0090. MFCでGUIソフトウェア作成 — T.T
2019.01.09
A-0090. MFCでGUIソフトウェア作成 — T.T
◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇ MFCでGUIソフトウェア作成 発行:エスオーエル株式会社 https://www.sol-j.co.jp/ 連載「X線CTで高精度寸法測定!?」 2019年1月9日号 VOL.090 平素は格別のお引き立てを賜り、厚く御礼申し上げます。 X線CTスキャンによる精密測定やアプリケーション開発情報などをテーマに、 無料にてメールマガジンを配信いたしております。 ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇ 皆さま、本年も何卒よろしくお願い申し上げます。 さて、2018年12月31日と2019年1月1日の2日間は、 コタツに入ってプログラムを作っていました。 仕事で使うプログラムで、 ファイルを読込んで処理するものです。 あったら便利だなと思うソフトウェアの構想が頭の中にあったので、 (年末年始の退屈な)時間潰しにソフトウェア開発に取り掛かりました。 まずは、どの言語で書くかを決めなくてはなりません。 候補は以下の通りでした: 1) C# と .NET 2) Lisp 3) Python 4) Haskell 5) C++ 最近は何かソフトウェアを作ろうとすると、 言語の選択肢が多くて困ります。 これは贅沢な悩みでもありますが、結構大きな悩みです。 何かを作るときに一番手間が掛かるのは、段取りです。 開発環境を整えるのにそこそこ時間が掛かります。 過去に使ったことのある開発環境があっても、 継続して使っていなければ、結局メンテナンスに時間が掛かります。 頭をその言語に切り替える準備時間も必要です。 さて、いまどきのトレンドからすると、C#で組むのが良いでしょう。 候補にJavaが入っていないのは、好みの問題です。 候補にLispが入っているのも好みの問題です。 結局、Lisp や Haskell で GUI という挑戦はせず、 流行りの C# や Python でもなく、 無難に C++ で作ることにしました。 C++ で GUI(グラフィカルユーザインタフェース)のプログラムを 作るには、MFC(Microsoft Foundation Class)という ソフトウェアの部品を使って組むのが便利です。 (MFCを使わないという選択肢もあるので、ここでも悩みます。) 今回のメルマガでは、 その時に使ったコードの一部をご紹介します。 (これを書いておくと、自分自身も自分の記事をGoogle検索で後から見直すのに便利です。) 以下、「¥」と「’」という文字は、全角で書きます。 本当は半角なのですが、メルマガ配信するソフトウェアに問題が発生するので、 全角に置き換えています。 まず、取得したファイル名を保管しておく箱が必要です。 そこで、 CString csfile; のように用意しました。 csfile という名前を付けたものが箱です。 CString というのは、csfile という名前のものが、 MFCで用意されている CString というタイプのものですよ と宣言するものです。 次に、csfile の中に保管した文字列から、 純粋なファイル名、パス、拡張子 を分離するコードを書きました。 CString str_file = csfile.Right(csfile.GetLength() - csfile.ReverseFind(_T(’¥¥’)) - 1); CString str_path = csfile.Left(csfile.ReverseFind(_T(’¥¥’)) ); CString str_ext = csfile.Right(csfile.GetLength() - csfile.ReverseFind(_T(’.’)) - 1); こんな感じです。 これにより、例えば csfile の中に c:¥aaa¥bbbb¥ccccc¥ddddd.rek という文字列が保管されていれば、 str_file には、「ddddd.rek」 str_path には、「c:¥aaa¥bbbb¥ccccc」 str_ext には、「rek」 が入ることになります。 CString というタイプで名前を付けて用意したものは、 「 名前.機能() 」という形で予め用意されている機能を使うことができます。 まず、.GetLength() で文字列全体の長さをカウントします。 そして、.ReverseFind(_T(’¥¥’)) で、パスの区切り「¥」まで 後ろから探して、見つかった位置を返します。 文字列全体の長さ から 見つかった位置 を差し引くと、 純粋なファイル名の文字数が分かるはずです。 ただし、最後の区切り¥が見つかった位置というのは、 頭を0から数えているので、-1をしています。 最後に、.Right(文字数)で、文字列全体の右側から 文字数分だけ取り出すことで、 str_file の中に純粋なファイル名を入れています。 ¥を探すのに、コードでは¥¥と書いているのは、 ¥という文字がこの言語では特別な意味を持つので、 ¥¥と書くことで、一文字の¥の意味になります。 パスを分離するのは、 純粋なファイル名の処理の片割れを逆方向から拾うコードになっています。 拡張子を分離するのは、 純粋なファイル名の処理と同じようなことを、「.」の区切りで行っています。 なんか言葉で書くとややこしいですが、 プログラムは、単純な機能の組み合わせです。 単純なものに分解して考える習慣があると、 プログラミングも数学も楽になるのですが、 人間は不思議なもので、 単純なものに分解して考えることに徹するには、 練習が必要なようです。 -- 高野智暢