ホーム | Software Lab | Profile | Favorites | Diary | Links | About This Site | Feedback

 

 

第4回は、 実践的なサンプルということで、SDI アプリケーションをベースにしたツールを作りながら WTL を体験していただこうと思います。

今回のポイント
SDI アプリケーションを Wizard を使って作成してみよう。また、View という概念を理解しよう!

  • 次なる課題

    今回作るアプリケーションをどんなものにしようか、かなり迷ったのですが、結局普段自分が使うことのできるツールということで、プログラムのソースを Web にアップするときに HTML に変換してくれるツールを作成してみようかと思います。

    どんなものかというと、

int Run(LPTSTR /*lpstrCmdLine*/ = NULL, int nCmdShow = SW_SHOWDEFAULT)
{
    CMessageLoop theLoop;
    _Module.AddMessageLoop(&theLoop);

    CMainFrame wndMain;

    if(wndMain.CreateEx() == NULL)
    {
        ATLTRACE(_T("Main window creation failed!\n"));
        return 0;
    }

    wndMain.ShowWindow(nCmdShow);

    int nRet = theLoop.Run();

    _Module.RemoveMessageLoop();
    return nRet;
}

という感じに、HTML 内でソースを引用する部分の HTML ソースを出力してくれるツールです。これは、Pre タグ(FrontPage では書式付き)というタグで囲い、カスケードスタイルシートで色とかを指定しています(黄色とか、マージンとか)。でもキーワードを青くしたりコメントを緑にしたり、タブをスペースに変換したりする部分は手作業なわけで、すごく効率が悪いわけです。

また、ユーザーごとに好きなスタイルが違う可能性もあります。色はこれがいいとか、このキーワードはこの色で着色したいとか、行番号を出したいとか・・・。ま、キリがないわけですが、この辺を自動化する GUI ベースのツールを今回の題材にしようということです。

  • 概要設計(大雑把)

    では、今回のツールですが、SDI のアプリケーションにします。文字の解説ではわかりにくいので、ちょうど Visio に UI を作図できる機能があったので作ってみました。

    あ、ちなみに Source To Html Converter の略で S2H_Conv と名づけました(直球だな・・・)

    画面は可変の境(Splitter)を持たせる感じでまず、 左半分と右半分に分かれます。左半分はエクスプローラのように、ファイルデバイスを参照できるようなツリービューです。「フォルダ」って書いてあるペインも使います(CPaneContainer:atlctrlx.h)。

    右半分は元のソースと変換結果の HTML を見れるように二つの Edit 系クラスを使います。それぞれのウィンドウは可変にしたいので、CSplitterWindow(atlsplit.h) を利用します。

    その他、CFrameWindow や CUpdateUI などの基本的なクラス、そしてステータスバーやツールバーの使い方についても述べていこうと思っています。

    若干面倒なのが UI の設計の部分なんですが、全ソースを引用する頻度って低いと思うわけで、一部を選択して変換することが多いと思うのです。そのアクションをどうするかを決めなくてはなりません。範囲選択したいということはソースの内容を表示しなくてはならないということで、取り合えず右上のウィンドウから右クリックのメニューで変換という操作を行うと、右下のウィンドウに結果が表示されるということにしましょう。

    また、HTML のタグを見せられてもうまく表示されているのかはわかりません。これもプレビューできるようにする必要があるかと思います。この辺は IE を使う方向で行きたいと思うのですが、問題はどう表示させるかですね・・・。

    最初は直接 Explorer を起動する形にして、そのあとで右下をタブ化したりして表示できるようになるとうれしいかもしれません。どこまでやれるかは要望しだいですが、そのような変更をするときに WTL を使っていると楽だなぁと体感していただければ幸いです。

  • 早速プロジェクトを作る

    それでは ATL/WTL AppWizard を使ってプロジェクトを作成します。

    プロジェクトは S2H_Conv としました。

    日本語化されたウィザードがほしい方は環境編のほうからダウンロードしてパッチを当ててください。デフォルトで SDI になっているので、大きく変えるところはありませんが、とりあえずアプリケーションの種類のページで cpp を生成するようにしました。

    ユーザーインタフェースの特徴のところは、どうせすぐに変えてしまうのでそのままにしておきました。

    これで完了を押してプロジェクトを作成します。

    あ、今回の開発環境は Visual Studio.net 2003、WTL 7.1、StlPort 4.6.0 を利用しています。そんなに面倒なことをしていないので、VC6 や .net の STL で動くと思います。WTL はあまり古いのを利用する意義がないと思うので、この機会に最新にしてみてください。

  • 出来上がったソースの解説

  • できあがったプロジェクトは当然このままでコンパイルできます。それでは、ここのファイルの役割について大雑把に述べていきます。 が、その前に MFC の最大の挫折点は何かというとドキュメント・ビューアーキテクチャだったと個人的に思うわけなのですが(たぶん今はわかるはず・・・)、WTL でも Frame と View という概念が出てきますので、簡単に説明しておきます。

    上の図を見ていただければわかると思うのですが、MFC と大して変わるわけでもないような気がします。ただ Document という概念がないので、データ部分をどう持つかという点に関しては自由度がある感じがします(あまり余計なことを書くよくわかってないのがばれるんですが)

    Frame の部分は Window の動作を大きく変えない限り(MDI or SDI)変わりません。つまりアプリケーションの唯一の親ウィンドウってことになります。その中にいくつもの子ウィンドウ(View、コントロール)を作っていくという形になります。

    • stdafx.h と stdafx.cpp

      プリコンパイルヘッダです。cpp は置いておいて(めったに触らないので)ヘッダファイルのほうは目を通しておいたほうが良いでしょう。基本となる Windows のバージョン指定や IE、RichText などのバージョンの指定があります。これらのバージョンはフレームやメニュー、コモンコントロールなどで特定のバージョン以降で実装された機能を有効にするためなどに使います。

    • S2H_Conv.cpp

      メインファイルです。といっても頻繁に書き換えるようなところではなく、スタートアップルーチンなどが含まれていると考えてください。SDK とかでいう WinMain() が置かれるファイルです。ここも滅多にいじりません。

    • MainFrm.h と MainFrm.cpp

      このアプリケーションの基本部分です。WTL では基本となる親 Window とメニュー、ステータスバーなどを管理するのが Frame という呼び名をつけられたクラスです。

      メッセージマップやイベントハンドラ、子ウィンドウ(View)の作成などの基本的な処理が行われています。アイコンのクリックやメニューのクリックなどのイベントを View に伝えたりします。

      今回は SplitterWindow を使うので、先にここを変更することになります。

    • S2H_ConvView.h と S2H_ConvView.cpp

      これらは MainFrm を親とする子ウィンドウになります。たとえばここを CEdit から継承すると(AppWizard でビューの基本クラスを変更する) Edit が作成されます。今回はこのファイルを使いません。なぜならちょっと名前から意味が想像しにくいからです。

      あとで適切な名前のビューを作成することになりますが(たとえば CSourceView、CHtmlView など)、雛形になるかもしれないのでとっておいてください。

    • AboutDlg.h と AboutDlg.cpp

      メニューのヘルプから About を選択したときに表示されるダイアログです。ダイアログはリソースで作成したあと、CDialogImpl を継承したクラスで実体化します。

      今回は簡単な設定ダイアログを追加するかもしれません。

    • resource.h、その他のファイル(.rc、.bmp、.ico)

      これらはこのアプリケーションで使うリソースです。WTL のフレームワークからの利用には特徴があるので、あとでその辺を述べたいと思います。

以上が、今回作成したアプリケーションの雛形になるわけですが、さて、どこからいじっていこうかな・・・。ちょっと大変かもしれないですが、フレームのほうから修正していきたいと思います。

簡単で短いのでアレですが、わからない人用の解説のつもりです。
もし今回の内容でわからないことがあったら掲示板に書き込んでください。

第5回へ

最終更新日 : 2005/01/10