初歩的なプログラミングでも(’14/9)


ここで述べたように、マイクロソフト社がネット配布している機能限定版の「無料」のVisual
Studio2013Expressを入手し、久しぶりに遊びでWin32APIを用いたVC++プログラミングの
お勉強をしています。前にも書きましたが、2002年頃購入したマイクロソフト出版社発行
のバイブル的な本がどこかに紛れ込んでしまって見つからないため、もう一冊所有してい
る入門本を読み、また、ネットにあるその手のサイトを見ながらやっています。

で、少しだけ断片的に過去にノートにメモ残していたのが大変役に立ったこともあって、
調べたこと、簡単なテストプログラムなどノートにメモしたり張り付けたりしてもう6冊目に
もなりました。

ありがたいことに、Expressは以前所有していたVC++.NetのようなMSDNライブラリは付属
してはいませんが、マイクロソフト自身がインターネットにそれを公開してくれていますの
で助かっています。学んだところに出てくるそういうAPI(関数、構造体など)は全てWord
にコピーし、ファイルにした上に、プリントアウトしてノートに張り付けて・・・

スコッチテープ、ノートなどどんどん使ってますけど、全部¥100ショップで(^^;。
ま、プリントアウト紙、高価なインクジェット用インクの消耗はちょっとですけどね。
これも趣味というか楽しみというか・・・

そんな中で、簡素なデジタル時計とアナログ時計を表示するプログラムを作りました。
ミスしたりで色々苦労しましたが、なんとか簡素ですがちゃんと時を刻んでくれます。
別に使うつもりはないですけどね(笑)。

現在時刻を取得する便利な関数/構造体がありますので、それを使いました。
SYSTEMTIME構造体とSetLocalTime関数です。これはいいですね。年、月、日、曜日、時、
分、秒、msが取得できるのですから。
デジタル時計の方は、六角形を7つ組み合わせて8の字を作り、それらの六角形を数字
に合わせて点灯させる形(緑色を塗りました)のもので、昔バイブルにあった関数を思い
だし使いました。見てまねていただけの当時と違い、わずかの記憶を頼りに自ら考えてや
りましたので、当時より理解が早い(^◇^)。時、分、秒でそれぞれ2個ずつ計6個ものの
「8」という形を示す図形及び2個の「コロン」という形を示す図形を作る必要があるため、
それぞれ1個を描けば残りは座標軸移動だけでずらして描くのに便利な関数を思いだし、
それを使いました。OffsetWindowOrgExなる関数です。最初思い違いしたのですが、動か
してみて勘違いに気が付きました。図形を右にずらすには、この関数のパラメータ数値は
−値としなければならないんですね。で、こちらは比較的早く完成しました。

で、問題はアナログ時計の方でした。こちらも時計の図はSetWindowOrgEx関数も用い、
ウインドウ中央にウインドウサイズに比例する形で描画(針は長針、短針、秒針を入れ
ています)ができたのですが、ちらついてしまうのです。いろいろ試してもうまくいかず、
ネット見たりしましたが、最終的には息子の示唆もあって、解決できました(^◇^)。

ビットマップの手法を適用しました。すなわち、直接ビデオメモリに描画するのではなく、
CreateCompatibleDCとCreateCompatibleBitmap関数を使い、まずビットマップに描画して
からBitBld関数で一括してビデオメモリすなわちウインドウに送る形としたところちらつき
はぴたっと止まりました。やったぁです(^◇^)。

ちなみに、デジタル時計もアナログ時計もメッセージループをPeekMessageを用い、elseの
ところで描く形でコード化しています。よく描画はWM_PAINT処理でと書かれているんです
が、そうでなくても描けてしまうのでそうしています。ま、ちらつくのは当たり前だったのかも
しれません。このメッセージループってすごく高速で回っているのをチェックしてみてわかり
ましたから。sleep関数を入れてウエイトつけてもみたのですが完全には解決しませんでし
たのでちらつきがぴたっととまったとき、思わず万歳でした(^^;

永遠の初心者の私にとって、コードを自分で考えて書いて苦労しましたが成功したというこ
とは一つの喜びです。

ところで、私はかつてQCに挑戦したことがあったのですが、そのときはポインタといのが
なぜか理解できず、挫折してしまった覚えがあり、まえにVC++をバイブルで独学したりし
ていたときもまだわかったつもりでわかっていない状況でした。そもそもMSDNライブラリで
関数の戻り値とかパラメータがポインタ表現だと途端に脳内が迷路に入り込んだりしてき
たのです。しかしながら、今回、色々調べたことで自分の迷路の原因がわかり、糸がほど
けるように以前より今になってやっと理解が進んできたきがします。

私は高度なプログラムを作ろうとかそんな意図はなくて、コードでどう動くか、パソコンの
中身はどうなっているかなどをCプログラムで知りたいという意向があるんですが、意外
に「無料」のExpressでやり始めてそういう楽しみを少しずつできているのに驚いてます。
ビルト前にコード段階で赤波線で間違い指摘してくれますしね。
限定版のため、MFCはついていませんけど、あんなブラックボックス的なのは仕事でも
ないですから興味はありませんのでOKです。あくまで、私の興味はwin32+VC++プログ
ラミングだけですから。


戻る