これは.dllをリンクする必要があればリンクしなさいという命令です。今回はaygshell.libファイルをリンカ入力として追加します。プロジェクトを右クリックし[プロパティ]からプロジェクトのプロパティウィンドウを開きます。[構成]プルダウンリストより[すべての構成]を選択します。[プラットフォーム]プルダウンリストより[すべてのプラットフォーム]を選択します。[構成プロパティ]-[リンカ]-[入力]を選択します。[追加の依存ファイル]プロパティにaygshell.libを追加します。C++には標準ツールはありません。お勧めなのはdoxygenというドキュメント生成ツールです。ソースファイルのコメントから文書を抜き出し、HTMLをはじめとするさまざまなフォーマットのドキュメントを生成することができます。トを認識してくれます。私はお仕事ではJavaプログラマーなのでJavaDocスタイルのコメントに慣れていますのでJavaDoc形式のコメントは助かります。今回インストールするDoxyCommentですが、そのdoxygen形式のコメントを自動生成してくれるツールです。Studioにアドイン(add-in)して使用します。別にDoxygenでドキュメント作らないよーという場合でも、ソースにコメントは入れると思います。コメント作成の作業をちょっと楽にしてくれるお勧め便利ツールです。インストールプロジェクトのサイトhttp://sourceforge.net/projects/doxycomment/よりインストーラをダウンロードしてインストールしてみました。用と2008用があります。ご自分の環境にあったファイルをダウンロードしてください。※現在2008用はベータバージョンのようです。Studioを起動すると画像のようなツールバーがでます。Commentをクリックすると、コメントが生成されます。カスタムコメントプロバイダで自分好みのコメントを生成するさて、DoxygenのデフォルトではQt形式のタグになっており、JavaDoc形式のコメントになりません。[ツール]-[オプション]のDoxyCommentで設定すればコメントブロックだけはJavaDoc形式にできますが、\authorや\versionなどのコマンドの接頭辞は\(バックスラッシュ(¥マーク))のままです。ここはやはり@で記述してほしいところです。DoxyCommentにはコメントプロバイダというDLLを作成することで、コメントの生成を自分好みにカスタマイズすることができます。これを使ってJavaDoc風のコメントにしてみましょう。C#]より、クラスライブラリを選択します。プロジェクト名:JavaDocCommentOKを押します。2005\DoxyComment.dllにあります。DoxyComment.ICommentProviderインターフェースを実装する新しいパブリッククラスを作成してください。ICommentProviderインターフェースのすべての方法を実装してください。Providerフォルダがあります。これを参考にすると良いでしょう。value;}}[Category("コマンド接頭辞"),Description("コマンドの接頭辞です。value;}}[Category("コマンド接頭辞"),Description("コマンドの接頭辞です。(string[])rv.ToArray(typeof(string));}#endregion}}#endregion}}[ビルド]-[JavaDocCommentのビルド]を選択してDLLを作成します。Providers」という名のサブフォルダを作ってそこへコピーしてください。Providersです。2005を再度起動すればカスタムコメントプロバイダがロードされます。JavaDocCommentプロバイダを使用するように設定します。[ツール]-[オプション]よりオプションウィンドウを開き、ツリー内のDoxyComment-Generalを選択します。次にDoxyComment-Providerを選択します。選択し、コマンド接頭辞やコメントブロック概観を好みのスタイルに設定してください。コメント:0019:モードレスダイアログを作るモードレスダイアログを作るダイアログボックスの場合も、考え方は今まで作ってきたウィンドウのプログラムと同じです。今まではウインドウに発生した色々な処理をウィンドウプロシージャに記述し処理していました。ダイアログボックスの場合も同じです。ダイアログプロシージャを作成し、ダイアログに発生したいろいろな処理をダイアログプロシージャで受け取り、適切に処理します。サンプルを見てみましょう。ダイアログとのデータ受け渡し用。{//ダイアログからのメッセージを処理する。ウィンドウプロシージャで処理する。親ウィンドウのハンドル。FALSE;}動作イメージは次のようになります。起動するとメインウィンドウが表示されます。ボタンをクリックするとダイアログが表示されます。OKを押すと、入力した内容がメインウィンドウに反映されます。キャンセルでダイアログを閉じます。今回は、メインウィンドウを作成後、ダイアログウィンドウを作成します。メインウィンドウにはウィンドウプロシージャ、ダイアログにはダイアログプロシージャをそれぞれ用意しています。メインウィンドウの作成は今までと全く同じですので問題ないでしょう。ウィンドウプロシージャを見てください。ウィンドウを作成するときの初期化処理として、WM_CREATEメッセージがきたら、ウィンドウにボタンを表示しています。ボタンの生成にCreateWindowを使っています。メインウィンドウと同じですよね。実はボタンやエディットコントロール、ラジオボタンといったよく使われるコントロールは皆、特殊なウィンドウなのです。ウィンドウですからCreateWindowで作成します。いままではCreateWindow関数の第1引数lpClassNameにはウィンドウクラス名を定義していました。ここに定義済みのウィンドウクラス名を指定することが出来ます。今回の例ではウィンドウクラス名に_T("BUTTON")を指定して、ボタンのコントロールを生成しています。第3引数dwStyleに、BS_PUSHBUTTONを指定していますので、いわゆるコマンドボタンになります。この第3引数にBS_CHECKBOXを指定するとチェックボックス、BS_GROUPBOXを指定するとグループボックスになります。チェックボックスもグループボックスも「ボタン」の一種ってのがちょっと不思議に感じられるかも知れません。dwStyleに指定できるスタイルはウィンドウクラスによって異なってきます。詳しくはMSDNを参照してください。第8引数hWndParentに親ウィンドウのハンドルを指定します。メインウィンドウのハンドルを指定しましたので、作成するボタンは、メインウィンドウの子ウィンドウになります。第9引数hMenuのメニューハンドルには、このボタンを識別するコードを設定します。あとでこのボタンからのメッセージであることを識別するのに使います。ボタンのIDを作りました。ボタンが押されたときの処理は、ウィンドウプロシージャにWM_COMMANDメッセージが届いたときの処理に記述します。LOWORD(wp)がID_BUTTON1であれば、ボタンが押されたということです。このときにモードレスダイアログを開くようにします。モードレスダイアログはCreateDialogマクロで作成し、DestroyWindow関数でダイアログを破棄します。CreateDialogマクロダイアログボックステンプレートリソースから、モードレスダイアログボックスを作成します。アプリケーションハンドルを指定します。ダイアログボックステンプレートを指定します。指定にはMAKEINTRESOURCEマクロを使用します。親ウィンドウのハンドルを指定します。ダイアログボックスプロシージャを指定します。指定されたウィンドウを破棄します。破棄するウィンドウのハンドル);DlgProc関数がモードレスダイアログボックスのプロシージャです。プロシージャ内で最初に呼ばれるのはWM_INITDIALOGメッセージです。ダイアログが初期化されるときにWM_INITDIALOGメッセージが送られてきます。このメッセージが来たら、ダイアログボックスで必要な初期化処理を記述しておけばよいわけです。ここでは、親ウィンドウの再描画処理のために親ウィンドウのハンドルが必要となりますので取得しておきます。親ウィンドウハンドルの取得にはGetParent関数を使います。親ウィンドウハンドルを返します。子ウィンドウのハンドル);ダイアログのボタンが押されると、WM_COMMANDメッセージが送られてきます。どのボタンが押されたのか判定するにはWPARAMの下位バイトを見ればよかったですよね。OKボタン(IDOK)が押されたらエディットコントロールに入力された値を取得して、グローバル変数に格納します。エディットコントロールから文字列を取得するにはGetDlgItemText関数を使います。GetDlgItemText関数ダイアログボックス内の指定されたコントロールに関連付けられているタイトルまたはテキストを取得します。ダイアログボックスのハンドルを指定します。取得したいコントロールの識別子を指定します。文字列格納用の領域を指定します。ここでは親ウィンドウに文字列を渡したいのでグローバル変数を指定しています。文字列の長さをTCHAR単位で指定します。格納したら親ウィンドウに再描画を指示します。すると親ウィンドウはグローバル変数に格納された文字列を、自分のウィンドウ内に描画します。再描画にはInvalidateRect関数を使います。個の長方形を追加します。消去するかどうかの状態);InvalidateRect関数を使って無効領域(更新領域)を発生させます。無効領域とは、画面が他のウィンドウなどで隠れてしまうことです。通常は、無効領域が発生するとWM_PAINTが発生して、再描画する仕組みになっています。プログラムの中で状態を変化させ、それを画面に反映したい場合もあると思います。そのような場合に、InvalidateRect関数を実行して無効領域を発生させるわけです。意図的に無効領域を発生させると、WM_PAINTが発生します。結果的に、親ウィドウに再描画を指示することが出来るというわけです。ダイアログプロシージャの中に、NKDbgPrintfW関数という見慣れないものがありますね。これはデバッグ出力ストリーム(出力ウィンドウ)に文字列を出力できる関数です。デバッグには重宝します。NKDbgPrintfW関数デバッグ出力ストリームに文字列を出力します。lpszFmt,);引数lpszFmtにはprintfスタイルの書式を指定します。デバッグには結構便利な関数です。関数がたくさん出てきましたね。コメント:0018:モーダイルダイアログを作るモーダルダイアログを作る今まで、ウィンドウを使ったプログラムを作成してきました。した情報の表示や設定を行いたいだけの場合には、ダイアログが便利です。ダイアログの場合は、VisualC++の「リソースエディタ」を用いて、WYSIWYGにダイアログを作成することが可能ですので、ちょっとしたアプリケーションの作成に向いています。ダイアログリソースを作成するまずダイアログリソースの作成を行います。エクスプローラ]の中の、[リソースファイル]を右クリックします。メニューから[追加(D)]-[リソース(R)...]を選択します。[リソースの追加]ウィンドウが開くのでDialogを選択し[新規作成(N)]ボタンをクリックします。OKとキャンセルのボタンがデフォルトで表示されています。Controlを貼り付けてみます。ダイアログの生成方法は、Windowsの場合と同じです。モーダルダイアログ(ダイアログボックスを閉じるまで、他の操作が出来ない)で表示するソースです。FALSE;}リソースエディタでの表示と、WindowsMobile上での表示が異なっていますね。チェックボックスとラジオボタンの上下か切れてしまっています。これを修正するには、ダイアログのフォントをWindowsMobileにデフォルトで導入されているフォントに変更します。フォントをTahomaにかえてサイズを9ポイントに設定して実行してみましょう。このように、正しく表示されました。ダイアログではこのような事が起こるのでしょう。実はダイアログではフォントのサイズを基にして、ダイアログの幅、高さ、オブジェクトの幅、高さを決めているのです。Dlg"がWindowsMobileには存在しないため、ダイアログやオブジェクトの幅が正しく設定されず、文字が切れたり、チェックボックスやラジオボタンの上下が切れてしまったのです。ダイアログボックスには、今回作成したモーダルダイアログボックスの他に、モードレスダイアログボックスというものがあります。ダイアログボックスを閉じるまで、他の操作が出来ません。通常のアプリケーションではよくこれを使いますね。ダイアログボックスを開いている間にも他の操作が出来ます。ダイアログボックスを開いたまま、ブラウザを開いたり、電卓を開いたりすることができます。Excelの検索ダイアログがこれにあたりますね。Excelでは検索ダイアログを開いたまま操作ができますよね。今回のプログラムの説明です。モーダルダイアログを作るには、DialogBox関数を呼び出します。ダイアログボックスを閉じるときにはEndDialog関数を呼び出します。DialogBox関数モーダルダイアログを表示します。ダイアログプロシージャのポインタ);EndDialog関数モーダルダイアログボックスを破棄し、そのダイアログボックスに関係するすべての処理を終了します。返したい値);WinMain関数を見てください。今までのプログラムとは違い、メッセージループがありません。これは、DialogBox関数の処理はEndDialog関数が呼び出されるまで終了しないためです。DialogBox関数のlpTemplateにはダイアログリソースを指定します。下位ワードに識別子を指定しなければなりません。MAKEINTRESOURCEマクロを使用すれはリソース識別子を作成できます。lpDialogFuncにはダイアログプロシージャを指定します。ダイアログプロシージャDlgProcを見てみましょう。ダイアログでは、ボタンが押されるなどのイベントが発生すると、WM_COMMANDメッセージが届きます。これだけでは、どのボタンが押されたのかわかりませんね。追加の情報がwParamに格納されています。どのボタンか判断するにはLOWORD(wParam)とします。これで押されたボタンのIDがわかります。LOWORDは特定の値の下位ワードを取り出すマクロです。wParamの下位ワードに押されたボタンのIDが格納されているのです。サンプルでは、IDOKとIDCANCELの処理を別々に書いていますが、ダイアログプロシージャの中での処理が特にない場合はまとめて下のように書きます。EndDialogの第2引数にLOWORD(wParam)を指定するのがポイントです。IDCANCEL:EndDialog(hDlg,LOWORD(wParam));break;}今日はここまでです。