Visaul C++で自動生成されたソースへの変更は最小限にして、独自のコードは別ファイルにした方が管理しやすいという考え方で、新しいソースファイルを追加します。

C++ソースファイルを選び、適当な名前 a.cpp を入力します。

追加する独自コードとしては、ウィンドウハンドルのhWndAと描画コードOnPaintです。これをa.cppに書きます。

自動生成されているEva.hにこれらを共通利用するための宣言を書きます。関数プロトタイプには最後にセミコロンをつけ、グローバル変数には最初にexternをつけます。最初の#include "framework.h"はEva.cppから移動させます。これは共通利用するためです。

そして自動生成されたEva.cppへの変更点です。まず#inlcude "framework.h"を削除します。

 

次にWndProcの中のWM_PAINTの対応とWM_CREATE(これは自動生成には含まれないので追加する)に追加コードを書きます。

ここまででビルドして動かすと最初と同じ画面が出ます。ちなみに、実行させるにはデバッグメニューのデバッグなしで実行を使います。

 

ここから拡張して、ここをクリックというアプリを作ります。さて、ここをクリックという操作は、まずマウスを移動させて対象をポイントし、次に左ボタンを押してから、そのボタンを離すという三つの動作からなる一連の処理です。

あまり、ここまで意識しないでしょうが、プログラムを書くときには、そうはいきません。まずマウスの移動を捕捉します。それには、OnMouseMoveという関数を作成します。マウス位置をリアルタイムで表示させるにはタイトルバーにSetWindowTextで表示させるのが手早いです。

この関数をWndProcから呼び出せるように関数プロトタイプをヘッダに書きます。コピペしておいてセミコロンを追加すれば簡単です。

最後に呼び出すコードをWndProcに書き込みます。ここは次のように書くのがお約束です。

これを実行すると次のようになります。

マウスを動かすとリアルタイムにその位置がタイトルバーに表示されます。このようにSetWindowTextは、お客さんには出せないけど、まかない料理としては手軽で美味しいものです。

 

それでは、いよいよ本題に入ります。まず、次のような変数を定義します。

描画関数を次のようにします。ここでは、クリックされる文字のサイズを取得しておくことがポイントです。

文字の位置とサイズが分かりましたので、マウスを動かしたときにその中に入っていればスイッチをオンにします。

ボタンのクリックは押したときは気にせずに、離したときに実行します。それではドラッグの時はどうするのかというと、クリックとドラッグの両方を可能にするとユーザーも混乱します。なので、通常はクリックするものはドラッグは無視します。

これらの処理関数のプロトタイプをヘッダに書きます。

呼び出し側のコーディングも書きます。

これで完成なので実行すると次のようになります。

日本語という文字をクリックすると次のように変わります。英語という文字をクリックすると元に戻ります。

お気づきかと思いますが、ここまでは前置きにすぎません。大変に簡単な処理なのに、いくつものイベントの処理があちこちに分散して大変に読みにくいことがお分かりかと思います。要するに、Windowsとはそういうものです。

 

それなら、クリックされるものを主体性のある存在として扱い、それにEva = Expanded Visual Automaon という名前を付けることは意味のあることだという話に同意していただけるかと思います。それでは、Evaの存在と動作をどのように記述するか、それはCのコーディングとは別のスクリプト言語で作成して実行時に読み込むのが良いだろうと思われるわけです。このスクリプト言語をA言語と呼びますが、これはWindowsに限定されないように設計することも可能と思われます。

 

ここからは、A言語で行こう  Take the A Talk をご覧ください。   まだ工事中ですが