「タスクバー上を走るマリオ」のデスクトップマスコットを作りました

「タスクバー上を走るマリオ」スクリーンショット
↑こんな風にタスクバーの上をマリオが走ります。


ぶっちゃけると、っていうかはてブを使ってる人にはバレバレかもしれませんが、
ちょっと前にホットエントリー入りしてた
ちょwwwデスクトップがおかしくなったwwwwwwww - まめ速
これのパクリネタです。


言うまでもないですが、元ネタのとは違い、こちらはただのデスクトップマスコットソフトですのでご安心を(笑)
ちなみに、元ネタのプログラムは実行する勇気がなかったので、同じ動きを再現しているというわけでもないです。

タスクバー上をひたすら走るだけではさびしいので、マニュアル操作機能もつけてみました。

こちらから↓ダウンロードできます。
ダウンロード


以下は内部的なお話。
簡単なプログラムなので、特筆すべきことでもないかもですが、
アニメーションで頻繁にリージョンを変更する場合の注意点を。

// あらかじめビットマップからリージョンを作成しておく
for(int i = 0; i < BMPIMGLIST_MAX; ++i)
{
	m_hRgn[i] = m_pBmpImage[i]->GetRgnHandle();
}
// 作成しておいたハンドルの取得関数
HRGN Mario::GetCurrentRgnHandle()
{
	int index = m_nDir * 5 + m_nState + m_nAnimIndex;
	return m_hRgn[index];
}
// リージョンを設定
HRGN tmpRgn = CreateRectRgn( 0,0,0,0 );
CombineRgn( tmpRgn, g_Mario.GetCurrentRgnHandle(), NULL, RGN_COPY );
SetWindowRgn( hWnd, tmpRgn, TRUE );

ちょっと断片的すぎてわかりにくいコードですが、
これはあらかじめ作っておいたリージョンハンドルを直接渡さずに
直前に一時的なリージョンを作り、それと合成する形でSetWindowRgnに渡しています。


なぜこんな回りくどいことをするかというと、
SetWindowRgnに登録されたリージョンは不必要になったタイミングで
Windows側が勝手に開放してしまうからです。

今回のように同じリージョンを何度も切り替えるという場合には、
いちいち画像からリージョンを作り直すのはもったいないのでこういった処理が必要になってきます。

作っておいてこんなことを書くのもなんですが、元ネタは作成元のわからないウイルスであるから仕方ないってだけで、いくらジョークプログラムと言っても勝手にマリオの名前と画像を使って公開するのはまずそうですねw
怒られそうならすぐに消します(笑)


Android版もこっそり作りました。
ホーム画面上を走るマリオのマスコットを作りました。 - valinstの日記