« 日々の変化 | メイン | アニメな夜 »

2005年04月21日

メッセンジャー

プログラムのことを前から書こうと思ってたけど、Blogでやるより、そういうページ作るべき だなんて考えが先行してた、でも実際ネタがない。

調べればどこかですぐ見つかるような事を書いても意味がないし、調べても見つからないようなモノはあまり作ってない。
でも、なんか作り出したので書いていこう。
(C++のWindowプログラムで作りたいソフト開発出来る人対象。そんな人は現状で読んでいない。)

メッセンジャーというソフトがある。
MSNやらYAHOOやらあるけど、あの通知のシステムは結構便利だと思う。
タスクバーに常駐して、通信があればメッセージを表示する。

いずれ、今つくってるネットワークが関わるゲームに、ユーザーのオン・オフだけでも見れる機能をつけたいと思っていたけれど、それの片鱗に触る機械があったので、忘れないうちに書いていこう。

タスクバーに常駐するなんてのは、どこにでも解説されてることなので割愛するとして、メッセージはどうだろう。
タスクバーの各位置から、にゅにゅにゅっと出てくるアレは何で作るべきなのか。

結論から言うと、自分はアレをウィンドウとして作った。
ただウィンドウを作るだけだと、周りの線があったりして邪魔。
ウィンドウを作る時に指定するパラメータをちょちょっといじれは、真っ白で四角いウィンドウが作れる。

そのパラメータが『WS_POPUP』だ。
MSDNの記載では「ポップアップ ウィンドウを作成します。WS_CHILD スタイルと一緒に使うことはできません。」とある。
このポップアップウィンドウってのは、ユーザーに情報をッパっと表示するためのウィンドウで、枠もタイトルバーも×ボタンも無い。
このパラメータを、CreateWindowやCreateWindowEXのスタイルとして指定してやれば、まっしろで四角いウィンドウを表示できる。

どんなウィンドウを表示すればいいのかわかった。ニュニュって出るのもサイズを変更すればいいわけだから、SetWindowPosか何かを使えばいい。
じゃぁ、コレで完成かといえば、重要な作業が残っている。
表示する場所の指定だ。

一般的な人のPCならタスクバーは下にあるけど、みんながみんな下に設定しているわけじゃない。
特にマカー出身だと上にタスクバーを置く人だって居るし、横にだって出せる。
それに、タスクバーはXPとクラシックでは厚みが違うし、2段や3段にしてる人もいる。
何がわかれば、ちゃんとした位置に表示ができるのか?
答えはタスクバーの位置とサイズだ。

それを得るためにはSHAppBarMessage関数を使う。
これにABM_GETTASKBARPOSというタスクバーのポジションを得るためのオフセットと、入手したポジションを記憶するためのAPPBARDATA構造体のポインタをわたす。
すると、APPBARDATA構造体の中にあるRECT構造体に位置がセットされる。
タスクバーの各座標がそのまま構造体の要素になる。

そして重要なのが、タスクバーのサイズは2ドットはみ出ているということ。
見えない部分に2ドットはみ出ているので、例えば
top=924,bottom=1024,left=-2,right=1026 ってな感じ。
この特性を使えば、topが0であればタスクバーが上にあるという単純計算で位置が算出できる。
その関係は以下の通り。

・leftが0よりも少なければ、左右がはみでているので上下のどちらか。
  ・topが0ならば上、そうでなければ下。
・leftが0未満でなければ、左右。
  ・leftが0なら左、そうでなければ右。

方法はこれ以外にもあるので、決定的な関連情報じゃないけど、まぁ十分判定できるのでこれを使う。

上に書いてきたことを使えば、ニュニュっと出てくるWindowが作れる。
気をつけないといけないのは、生成したWindowがメッセージの表示を終えて見えなくなったとき、プログラムからウィンドウを削除してやらねばならない。
タイトルバーについている×ボタンが無いのでユーザーが閉じる作業ができない。
もし、×ボタンをつけたけば、CreateWindowのスタイルを0にすれば、タイトルバーが出るので使うことも出来る(はず。)

あとは、タスクバーのアプリケーションの表示にウィンドウがでないようにすることくらいか。
その辺は、ツールバー化するスタイル使うとか、非表示のウィンドウの子にするとか方法はあるようだけど、まだ試して無いので後日。


しかし、やっぱりBlogだと自由度に限界があるな。
結局、HTMLに書き直すことになりそう。
専用ページを作ったらソースをアップするつもり。

投稿者 tyoro : 2005年04月21日 03:33

コメント

コメントしてくださいYO




保存しますか?