Home > Tags > Win32猫

Win32猫

猫マスコット第一段完成

●砂時計カーソル解消


これまで,猫にカーソルを合わせると砂時計にされたり(されなかったり)していて,「なんで?ぼうやだから??」と残念に思っていましたが,原因はどうやらウィンドウクラス登録時にカーソルを指定していなかったためのようです(安易にNULLを食わしていたことが判明…).
LoadCursor( NULL, IDC_ARROW ) を食わせることで無事に解消できたようです.





●アニメーションを微増してとりあえずの第一段!


絵を描くのが大変です.
「歩行パターンとかで右足と左足の区別をつけなくていい」というメリットを考えて猫を一色べた塗りのデザインにしたのですが,これによって奥行き的な方向の変化を表現できないというデメリットが発生中.
「動く興味対象にとびかかる前に体勢を低くしつつお尻を振り振りする構え」等が描けなくなってしまいました.畜生,畜生ー!


あと,アニメーションの切り替わり時に(画像サイズが違ったり,猫の位置が違ったりするので)ウィンドウを移動させて位置をうまく合わせるひつようがあるのですが,これがまた大変です(フレーム毎に猫位置が違ったりするから).


そのような問題を乗り越えつつ(描けないものはあきらめつつ),アニメーションパターンをいくつか増やし,とりあえずの第一段完成とします.


Nekos苦労のわりには少ない採用パターンたち.ニャーン.


[ここから黒猫デスクトップマスコット第一段をダウンロードできます]





●第一段の問題点


前述のように,アニメーション間の位置合わせ等が面倒なのですが,現在,その移動量等がなんと「直値がハードコーディング」されています.ひどい悪夢ですね.


というわけで,まずはそのような設定というか,アニメーション制御の部分を外部ファイルから読み込むようにしたいところです.
(一番先にやっとくべきことなハズなのですが,外部ファイルの仕様とか考えだすとそこで止まったままモチベーションが切れる体質なので……)


今後,時間が取れたらLua辺りでアニメーション制御できるようにしていきたいと考えています.
(利用側でカスタマイズ可能にしておけば,誰かが絵を描いてくれるかもしれませんし)

  • Comments (Close): 0
  • Trackbacks (Close): 0

タスクトレイに猫入れる

●タスクトレイに入れる


この手の(常駐?)アプリケーションでは,タスクバー(デフォルトで画面一番下にある,開いたウィンドウとかが並ぶところ)に表示せずに,タスクトレイ(タスクバー右側の時計の辺り)にアイコンを表示するのが一般的なようです.
そこで,猫ウィンドウクラスCCatWndのウィンドウ生成用メソッドであるCCatWnd::CreateWnd()に引数を追加し,猫ウィンドウ生成時にタスクトレイに入れるかどうかを選べるようにします.


  virtual bool CreateWnd( …, bool bInTaskTray, UINT IconID );


bInTaskTrayがtrueのときは,IconIDでタスクトレイに表示するためのアイコンを指定します.
(コレ,IconIDの値だけで判断すれば,bInTaskTray引数はいらないような…)
(と,ここまでコード書いたところで,ウィンドウクラス(RagisterClassExで登録する方の「ウィンドウクラス」ね)自体のアイコンを指定する手段」が無いことに気付きました……後で考えよう)





●タスクトレイへのアイコン登録方法


…については,先に他者が書いた記事があるようなので簡潔に箇条書き.



  • ウィンドウの拡張スタイルにWS_EX_TOOLWINDOWを指定すればタスクバーに表示されなくなる.
  • タスクトレイへは ::Shell_NotifyIcon(NIM_ADD,…) で登録する.(要#include “shellapi.h”)
  • タスクトレイへ登録したアイコンは,最後にちゃんと Shell_NotifyIcon(NIM_DELETE,…) で登録解除する必要がある.
  • 登録時に Shell_NotifyIcon() に与える構造体にウィンドウハンドルとイベント通知用のメッセージ番号を指定しておけば,タスクトレイ上でアイコンに対するマウスイベント等が起こったときに通知される.

といった感じです.登録はCCatWnd::CreateWnd()内にて

if( bInTaskTray ) //タスクトレイに入れる指定がされていたら
 {//※このコードは一部省略して抜粋しています.
  NOTIFYICONDATA ncd = { 0 };//Shell_NotifyIcon()に与える構造体
  ncd.hWnd = m_hWnd;//猫ウィンドウのウィンドウハンドル
  ncd.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  ncd.hIcon = ::LoadIcon( GetHInstance(), MAKEINTRESOURCE(IconID) );//アイコン指定.※GetHInstance()はインスタンスハンドルを取得してくるメンバ関数
  ncd.uCallbackMessage = CATWNDIMPL_TASKTRAY_EVENT;//メッセージ番号.WM_APP+1あたりにしてあります.

  m_bIsInTaskTray = ( ::Shell_NotifyIcon( NIM_ADD, &ncd ) == TRUE );//登録が成功したことはメンバ変数で覚えておく(登録解除処理のために)
 }

のようにしています.
これで,タスクトレイ上のアイコンにイベントが起こったら,m_hWnd宛にCATWNDIMPL_TASKTRAY_EVENTメッセージが送られてくるので,ウィンドウプロシージャでしかるべき処理を行うことができます.
猫ウィンドウではタスクトレイ上のアイコンが右クリックされたら,猫が右クリックされたときと同じポップアップメニューを表示することにしました.
CATWNDIMPL_TASKTRAY_EVENTメッセージ時に,イベントの種類はlParamに入っているので,猫ウィンドウでは lParam==WM_RBUTTONUP を条件にしてポップアップメニューを出しています.
なお,このときにメニューを出すべき場所は,::GetCursorPos()でマウスカーソル位置を取得して使っています.
(動き回る猫をクリックするのはそれなりに難しかった.これでやっと安定してメニューを出せます)


TaskTrayアイコン表示できた


アイコン出たけど…なんということでしょう……ぼけている……
32*32と16*16のサイズを持つアイコンを指定したら大きい方が使われてしまいぼけ具合が激しくなるようなので,16*16サイズだけのアイコンを用意して与えていますが,やはりぼけている.
(見たところ,タスクトレイに表示されている大きさは16*16ピクセルなはずなのだが……なんで??)


タスクトレイからの登録解除は,NOTIFYICONDATA構造体のnIDメンバとhWndメンバを,登録時と同じ値にして, ::Shell_NotifyIcon( NIM_DELETE, &構造体変数 ) とすればOK.
猫ウィンドウではウィンドウ破棄時に行っています.
(登録解除処理を忘れると,アプリ終了後も残ってしまいます.残骸をクリックしたりするとOSが消してくれる(?)ように見えますが)


第一段完成

  • Comments (Close): 0
  • Trackbacks (Close): 0

Home > Tags > Win32猫

Search
Feeds
Meta

Return to page top