C++)2008年10月018:モーダイルダイアログを作る(10/19)Excel関数メモ(10/15)017:WindowsMobile特有のウィンドウ作成(10/15)016:リージョンを結合する(10/14)015:リージョン(10/13)018:モーダイルダイアログを作るモーダルダイアログを作る今まで、ウィンドウを使ったプログラムを作成してきました。した情報の表示や設定を行いたいだけの場合には、ダイアログが便利です。ダイアログの場合は、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;}今日はここまでです。コメント:0Excel関数メモメモメモ。今まで、通常のWindowsと同じようにメインウィンドウを作成してきました。単純にウィンドウを表示すると、下のメニューバーの部分が切れているのがわかると思います。Panel)の高さを考慮したウィンドウサイズを作成し、メニューバーを作成したいと思います。SIPを考慮したウィンドウサイズの設定SIPの情報を得るにはSHSipInfo関数を使用します。SIP領域を除いた有効なウィンドウサイズを取得し、MoveWindow関数でウィンドウサイズを変更しています。SIPの状態を取得・設定します。指定されたウィンドウの位置とサイズを変更します。再描画オプション);SHSipInfo関数はaygshell.hに含まれています。<aygshell.h>これだけだとビルド時にエラーとなってしまいます。そこで必要であればaygshell.libをリンクするようにリンカに指示を行います。)SHSipInfo関数のほかに、SipGetInfo関数を使用することで同じようにSIPの情報を得ることが出来ますが、今回は使用しません。SPI_SETSIPINFOがセットされます。このイベントが通知されたら、ShShipInfo関数でSIP領域を除いた有効なウィンドウサイズを取得し、MoveWindow関数でウィンドウサイズを変更しています。次にメニューバーを作成します。作成にはSHCreateMenuBar関数を使用します。pmb);SHMENUBARINFO構造体に、メニューの情報を格納してSHCreateMenuBar関数に渡します。サンプルの例ではSHCMBF_EMPTYBARを指定することで、空のメニューバーを作成しています。{sizeof(SHMENUBARINFO),hWnd,SHCMBF_EMPTYBAR};SHCreateMenuBar(&smi);メニューの作成については、また別の機会に説明しますが、ここでは単純に見た目を整えるための空のメニューを作成して表示しています。リンクするよう、リンカに指示をする。親ウィンドウのハンドル。メニューバーを作成する。MoveWindow関数でウィンドウサイズを変更する。0;}今日はここまでです。コメント:0016:リージョンを結合するリージョンの結合WindowsMobileでは長方形のリージョンしか作成できません。そのため複雑な図形の描画には適していませんが、リージョンの結合はサポートされています。二つの長方形を組み合わせた図形をリージョンとすることが出来ます。つのリージョンを結合した結果が格納されます。結合先リージョンはどのようなものでもかまわないため、サンプルプログラムではCreateRectRgn(0,0,1,1)としています。1番目の結合元リージョンのハンドルを指定します。2番目の結合元リージョンのハンドルを指定します。つのリージョンの結合方法を指定します。fnCombineModeは次の値を指定できます。両方のリージョンが重なり合う領域を除いた領域では早速、RGN_XORで結合したリージョンでクリッピングしてみましょう。ソースは前回「リージョン」と同じですので、ウインドウプロシージャ「WndProc関数」のみ記載します。描画処理を開始します。描画処理を終了します。0;}きょうはここまでです。コメント:0015:リージョンリージョンregionとは地方、地域、領域などと訳されますが、WindowsAPIでは、多角形で定義された領域を表す図形要素を表します。日本語では、図形領域、とでも訳せばわかりやすいでしょうか。リージョンを作成するにはCreateRectRgn関数を使用します。右下隅のY座標);リージョンは領域を表す情報なので、リージョンを作っただけでは画面には何も描画されません。これだけでは利用価値がありませんが、通常はクリッピングリージョンとして利用します。リージョンをデバイスコンテキストに設定すると、そのリージョンの範囲内のみが描画可能な領域となるのです。このように画面の一部分だけを描画可能にすることをクリッピングといいます。リージョンをデバイスコンテキストに割り当てるにはSelectClipRgn関数を使用します。リージョンのハンドル);作成したリージョンは、他のオブジェクト同様、DeleteObject関数で破棄します。リージョンを使った描画をおこなってみましょう。親ウィンドウのハンドル。描画処理を開始します。描画処理を終了します。横長の長方形リージョンに限定することで、円の上下がリージョンからはみ出るために描画されず切り取られました。リージョンを駆使して、複雑な図形を表現するのに使われるもので、高度な描画処理には欠かせません。WindowsMobileの場合、長方形のリージョンしか扱うことが出来ません。円や、多角形を用いたリージョンは用意されていなのです。そのため、リージョンを用いた複雑な描画は期待できませんね。Windowsには、リージョンとよく似た機能でありリージョンと同時に説明されることの多い「パス」という機能があります。パスは直線と曲線を表すもので、複雑な図形をあらわことができます。このパスをリージョンに変換することができるため、複雑な描画処理に使われます。WindowsMobileではパスは一切使用できないようです。まとめると、WindowsMobileにおいては、リージョンを用いた複雑な図形の描画は出来ない、ということになりますね。