【第2回】
第1章:時計ソフトを作ろう
仕様どおりに制作しよう
(00/04/21)
みなさんこんにちは、nakkaです。2回目の今回は、前回決めた仕様をもとにソフトを制作していきます。作っている間にいろんなアイデアが出てくると思いますが、新しいアイデアはいきなりプログラミングするんじゃなくて、常に仕様書に記入しながら進めましょう。そして、仕様書どおりにプログラミングしていけば、スムーズに進めていけるはず。
ウィンドウサイズを変更
パソコンのデスクトップの大きさは、使う人やマシンによって全く異なるもの。自分で作ったソフトをできるだけ多くの環境で使ってもらおうと考えているなら、ウィンドウサイズを変更できた方が便利。同じ時計ソフトでも、なるべく小さく表示させたい人もいれば、とにかく大きく表示させて見やすくしたい人もいると思う。ウィンドウサイズを変更するには、ウィンドウのイベントを処理する“ウィンドウプロシージャ”で[WM_SIZE]を指定します。ここでウィンドウ内のコントロールのサイズなどの調整を行う処理を入れるといいです。
case WM_SIZE:
//ここで他のコントロールの調整を行う
break;
|
ソースを見てくれた人はわかると思いますが、実は前回は[スタティックコントロール]というラベル表示機能を使用して時刻を表示していました。この場合はフォントや色を設定すればいいので、ただ表示させるだけなら簡単ですが、一文字ごとにフォントや色を変えようと思った場合に、一文字ごとに別々のスタティックコントロールにする必要があるなど、ちょっと凝ったことをしようとすると結構面倒です。プログラミングは見た目にわかりやすくシンプルなソースが基本ですが、今回から数字をビットマップで書き出して時刻を表すように変更します。そして、デジタル時計らしく(?)昔の液晶時計っぽいビットマップで表示させてみました。
いきなり方向転換かと思われるかもしれませんが、プログラミングでは一つのことを行うにしても方法はたくさんあります。どの方法を利用すると自分が求める機能がより簡単に実現できるかとか、後々の拡張を考えたりして方法を選択するといいと思います。前回のように1つのフォントで表示するにはスタティックコントロールを使う方法が最も簡単で、今回のようにウィンドウをリサイズ可能にするならビットマップで書き出した方が簡単だということです。こういう変化に対応できるように、どの方法にでも簡単に変更できるように仕様に柔軟性をもたせておくといいと思います。
タスクトレイに入れる
時計ソフトのように小さなツールは、最小化した際にタスクバーに居座ったままだとパソコンで他の作業をするときに邪魔になります。こういう場合、すぐに思いつくのがタスクトレイにおさめる方法。タスクバーには居座らず、タスクトレイには常に表示されているので必要なときにいつでも呼び出すことができます。タスクトレイを使うのは、すぐに思いつく機能だけあってWindowsではすぐに実現できるようになっています。実際にはAPIを一つ呼び出すだけで登録、変更、解除が簡単に行えます。
Shell_NotifyIcon(dwMessage, &tnd);
|
そしてタスクトレイにおさめる処理をしたときに指定したメッセージIDでウィンドウにメッセージが送られてくるので、それに応じて処理を行えばいいのです。
//ウィンドウメッセージの登録
tnd.uCallbackMessage = WM_TRAY_NOTIFY;
//実際のウィンドウメッセージ
case WM_TRAY_NOTIFY:
switch(lParam)
{
case WM_LBUTTONDOWN: //マウスの左ボタンが押された
case WM_RBUTTONDOWN: //マウスの右ボタンが押された
|
ここで注意しなくてはならないのが、タスクトレイのアイコンがクリックされたときにメニューを出す場合です。タスクバーをクリックした直後はタスクバーがアクティブになるので、操作したいポップアップメニューがアクティブになりません。これではキーボードで操作できないばかりか、ほかのウィンドウをクリックしてもメニューが消えなくなってしまいます。この問題を回避するためには、メニューを表示する前にメニューを所有するウィンドウをアクティブにします。ふだん当たり前のように使っている機能ですが、こんなところにもちょっとした工夫が隠されています。
POINT apos;
SetForegroundWindow(hWnd);
GetCursorPos((LPPOINT)&apos);
TrackPopupMenu(hMenu, TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_LEFTBUTTON, apos.x, apos.y, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0);
|
世界時計機能の実現
今度は3カ国に対応した世界時計機能を実現しましょう。自分の生活には必要ないと思っても、世界を飛び回って時刻を気にするビジネスマンにとって、世界時計は重要な機能のひとつになるでしょう。自分が使う機能だけを盛り込んだソフトは、軽快に動作し自分にはジャストフィットしますが、ちょっと気を利かせて機能を追加するだけで誰にでも便利な汎用ソフトに成長します。
次回は作成中に思いついた機能をさらに追加して、時計ソフトを完成させます。そうするといよいよ公開となりますが、はやる気持ちを抑えてソフトの公開準備について説明したいと思います。それでは、また来週!
(nakka)