おはようございます。それでは始めましょうか。
C:ドライブ直下にdevという名前のフォルダを作成し、そこに2022-03-15という名前のフォルダを作成して下さい。 そして、その中(C:\dev\2022-03-15 )へ昨日の作業分を移動して下さい。「dev」は、developer/developmentの略です。
GitHubのkatahiromz/ImeStudy
を更新しましたので、再度ダウンロードして下さい:
https://github.com/katahiromz/ImeStudy
フォルダ C:\dev\2022-03-16 を作成し、ダウンロードしたものをそこに展開して下さい。
サクラエディタの「設定」→「共通設定」→「外部HTMLヘルプの設定」でWin32.chmの場所を指定してOKをクリックすると、単語の上でF1キーを押すだけでヘルプが見れます。
MsgCrackの中に「winwords.txt」というテキストファイルがありますね。これはWin32の単語集です。 これをサクラエディタの「設定」→「タイプ別設定(C/C++)」→「支援」の「単語ファイル」で指定し、 「候補:編集中のファイル」にチェックを入れてOKをクリック。 これで、「関数名を少し入力してCtrl+Space」で入力補完が効きます。
hello6は、コマンドライン引数がどのように渡されるかを表すサンプルプログラムです。 hello6.exeに適当に引数を渡して実行してみましょう。
「hello6 123 456」
「hello6 123 456 789」
「hello6 "This is a test" ABC 123」
コマンドライン引数を使うとプログラムを変更しなくてもさまざまな処理に対応できます。
hello7は、ボタンを押すと足し算をするダイアログです。 リファレンスでGetDlgItemInt/SetDlgItemIntを参照。
hello8は、文字列処理をするダイアログの例です。 リファレンスのGetDlgItemText/SetDlgItemTextを参照。
StringCchPrintfA/Wは、リファレンスに記載されていませんが、C言語のsprintfやWin32のwsprintfA/Wに似た関数で、 バッファの長さを考慮した<strsafe.h>という比較的安全に文字列を操作するライブラリを使っています。
hello9は、ボタンを押さなくても掛け算をするダイアログです。リファレンスでEN_CHANGEを参照。
hello10は、ダイアログアプリではないウィンドウアプリの例です。 とりあえず、hello10を動かしてみましょう。目玉が動きますね。ややこしいですが、一つ一つ見てみましょう。
独自のウィンドウを作成するには、ウィンドウクラスの登録が必要です。登録にはRegisterClass[Ex]を使用します。 WNDCLASS[EX]構造体を使ってウィンドウプロシージャなどのウィンドウクラスの属性を指定します。WNDCLASS/WNDCLASSEXを参照。 メニュー、ダイアログ、テキストボックスなどのよく使われる種類のウィンドウはシステム起動時にクラスが登録済みになっています。
ウィンドウプロシージャはダイアログプロシージャに似ていますが、戻り値の型がINT_PTRではなくLRESULTであり、デフォルトのときにDefWindowProcを呼ぶことになっています。INT_PTRとLRESULTは整数型です。
WS_OVERLAPPEDWINDOWウィンドウスタイルにWS_THICKFRAMEスタイルが含まれていますので、ウィンドウの大きさを変更できます。 CS_HREDRAW | CS_VREDRAWクラススタイルにより、大きさを変えたときに自動で再描画されます。 「|」は、ビット演算子のORであり、複数のフラグを指定するときに使います。
ウィンドウ作成時には、WM_INITDIALOGの代わりにWM_CREATEメッセージが発生します。 そこでSetTimer関数で一定時間ごとにWM_TIMERメッセージを発生させます。SetTimerとWM_TIMERを参照。 WM_DESTROYメッセージではKillTimerでタイマーを破棄し、PostQuitMessageでメッセージループを終了します。 WM_DESTROYとKillTimerとPostQuitMessageを参照。 WM_TIMERの処理OnTimerでInvalidateRectが呼ばれます。これで一定時間ごとに再描画されます。 InvalidateRectを参照。
WinMainのGetMessage、TranslateMessage、DispatchMessageのところがメッセージループです。 PostQuitMessageを呼ばなければウィンドウを閉じてもループが終わりません。 アプリが終了しないときはタスクマネージャーなどで強制終了するしかありません。
WM_PAINTの処理OnPaintでは、PAINTSTRUCT構造体とBeginPaint/EndPaintを使ってクライアント領域の描画をします。 クライアント領域とは、ウィンドウのタイトルバーや外枠を除いた中身の長方形領域のことです。 BeginPaintは、HDC(デバイスコンテキストのハンドル)を返すので、これを使って描画します。 HDCは画面、画像、印刷機(プリンタ)などの描画対象を抽象化したものです。 実際に描画する関数はgdi32.dllに含まれていてGDI関数と言います。
GDIでは、ペンやブラシ、フォントなどのGDIオブジェクトをSelectObjectでHDCに選択して描画関数を呼ぶことで描画できます。 CreatePenやCreateSolidBrushなどのGDI関数を使えばペンやブラシなどのオブジェクトを作成できます。 作成して要らなくなったGDIオブジェクトはDeleteObjectで削除します。 後始末をしないとアプリの使用メモリーが増大します。 デフォルトのGDIオブジェクトやストックされたGDIオブジェクト(GetStock...)は削除する必要はありません。
POINT構造体とRECT構造体は画面上の位置を表しています。 通常、画面の座標系はx軸が右向き、y軸が下向きになっています。 GetCursorPosでマウスカーソルの位置を取得できます。 GetClientRectでクライアント領域のRECTを取得できます。 GetWindowRectでスクリーン座標のRECTを取得できます。(RECTは長方形rectangleの略です) atan2関数は<math.h>に含まれていて、線分の傾きを取得できます。 それを三角関数に渡して、目玉の位置を決定しています。
テキストは「第三コロニー」の「RisohEditorまとめ」:
0ページ(RisohEditorについて):https://katahiromz.web.fc2.com/colony3rd/risoheditor/page00.html リソースに関する説明です。
3ページ(拡張子とファイルの種類):https://katahiromz.web.fc2.com/colony3rd/risoheditor/page03.html ファイルの種類についてです。
6ページ(データの種類):https://katahiromz.web.fc2.com/colony3rd/risoheditor/page06.html リソースデータの種類と関連するAPIをご覧下さい。
7ページ(言語):https://katahiromz.web.fc2.com/colony3rd/risoheditor/page07.html Windowsのリソースは様々な言語に対応しています。
11ページ(定義済みのコントロールID):https://katahiromz.web.fc2.com/colony3rd/risoheditor/page11.html 定義済みのコントロールIDを使えば、ダイアログ項目の指定が楽になります。
12ページ(ウィンドウクラス名):https://katahiromz.web.fc2.com/colony3rd/risoheditor/page12.html さまざまな定義済みのウィンドウクラスがあります。InitCommonControls[Ex]を呼ばないと使えないものもあります。
今日はここまでです。