Google

2008年1月6日日曜日

現状報告など

あけましておめでとうございます。
・・・てかもう七草がゆな日じゃないすか。
えーと、ごぶさたです。
ふた月以上ほど放置しておりましたが、まぁ・・・振り返ると実生活の方でやっぱり余裕が無くなってるな、てな感じす。
でも、自分のペースで少しずつは進めていこうかと。
変にプレッシャーかけて潰れてもよろしくないですからね・・・。

さてPopClockの方ですが、冬休みの間に少し触ってみました。
1つ残っていた不具合でサスペンド復帰時に、まれに二重起動する時があるってのがありましたが、
どうやら起動中のものはそのままに保持しておくのが一番安定しているようだということで、
これはこれで修正して解決ということに。

で、残り作成予定を見て、とりあえず何つくろうかな・・・と思って、
常駐時にスケジュール指定して起動する機能を作ろうかと色々調べてましたが
・・・情報が中々見つからない・・・。
タスクスケジュールに登録するような感じみたいなんだけど・・・うーん、サンプルもまだ見つからないんだよなぁ・・・
せめて関数名とかだけでも分かればいいんだけど、キーワードが何かないかなー・・・てな現状です。
指定時間にソフトを起動する方法・・・何か無いかな・・・ちなみにサスペンド時でもちゃんと起動できる方法でないと多分いけないんだろうな・・・と思っとります。
あるいは、他の機能を先行して付けるって方向もあるけんどねっ。

てなわけで、私自身の私事はまだずっと忙しいままだと思うので、
当面はよりマイペースになっていくと思いますが、よろしくであります。

2007年10月29日月曜日

PopClock Ver.1.3b

PopClock Ver.1.3b
処理は出来たけど、時たま微妙な動作をする可能性があるので今回はβ版です。

修正点は以下の通り。
Ver.1.3b 2007/10/29
・起動オプションに-sと入力することで、常駐モードで動作する機能を追加しました。
(常駐モードでは通常起動、タスクアイコンのタップ起動、サスペンドからの復帰時起動、で時計表示を行います)
・BMPに加え、PNG・JPG・GIFファイルの読込が可能になりました。
・処理を改修し、時計表示時の消費メモリを削減しました。
・時計表示時に画面回転による縦横変更を行った場合、表示がおかしくなる問題への暫定対処を行いました。

今回は常駐モードが大きな修正点なんだけど、
-sをつけない普通起動している限り、モノとしては今までどおりなんだよなぁ。
何はともあれ今回βということで常駐周り何かあるかもしれませんが、よろしくおねがいします。

CABファイル形式は、こちら
ZIPファイル形式は、こちら

※いつもの注意書き
CABファイルのインストール先は、指定デバイス内の\Program Files\PopClock\になります。
同じフォルダに同じファイル名のものが存在した場合、自動的にインストールデータで上書かれてしまいますので、必要なファイル(同名だけど自作で作ったファイル等)がある場合は別フォルダにコピーするなど、バックアップを行ってください。

2007年10月28日日曜日

ようやく一段楽しそうな

2週間たったか・・・テスト期間というには本仕事の方が忙しかったりするわけですが
ま、それはさておき貴重に休日を利用して日曜プログラミングだぜ やっほうー!
・・・と。

常駐ルーチンを組んでしばらく使ってみて、まずやばかったのが
サスペンド復帰時の起動で背景画像が2重に描画されるときがあった、というのがありました。
これは・・・背景用の画像を作成するタイミングが復帰起動表示後に来ていたということで
処理順を修正&余分に再取得していたルーチンを修正することで何とかなった感じ。

もう一つ、いっとうヤベーと思ったのが、
常駐モードにしてると、本体で設定していたアラームが利かなくなるというか、
復帰して起動した時計を閉じるまで自動的なアラーム表示が出てこない、っていうのがあったのよね。

これに結構手間取った感じ。
サスペンド発生してから、ユーザー独自イベント発行の段取りを踏んだりとか、タイマーでしばらく待ってから表示させるしかないか、スレッド関数でまわしてみるか・・・とか色々試してみたわけですが、
結局は毎フレーム描画処理している最後でSleepをすることで、動いた。

まぁ・・・まだそんなに試せてないから、今度の更新はバージョン表記はあがってるけど実質βバージョンな意味合いになるかも・・・追加機能もひそかにまだあったりするからなぁ・・・。

・・・ここまで書いてて、また復帰時多重描画再発してるな・・・orz。
まぁとりあえず、いったん公開してみるか~。

2007年10月15日月曜日

サスペンド復帰をチェック処理

さて、次の段階。
ずばり、サスペンドからの復帰を検知して時計表示をONにする処理を作る・・・てなわけで
その検知方法を調べてたわけですが・・・コレが意外と情報が見つからない(汗。

かなり探して、結局探しついた先はといいますと・・・インストールしたSDKのサンプルフォルダに。
http://mtbeta.msdn.microsoft.com/ja-jp/library/bb158662.aspx?altlang=ja-jp
から探すに、
\Common\CPP\Win32\PowerManager
ちなみにわつぃのPCでは
D:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Samples\CPP\Win32\Powermanager
にあったす。

ここにあるサンプルソースを、まぁ・・・大体コピペに近い形で(ぉぃ)移植して試してみたですよ。
結果、・・・おぉ、サスペンド復帰時に処理来てるぞ、これ。
とりあえず、この部分に時計ONの処理を突っ込んでみると・・・
おー、サスペンド復帰時に時計がktkr!

ちなみに、サンプルソースの内容を理解した分だけかいつまんでみるに、
どうやら電源関係のイベントが発生した時にシグナルONとする仕組みがあるようで。
シグナル発生時に処理をまわすため、独自にスレッド作ってその中でシグナル来るまで処理待ちすると。
で、シグナル発生時にシグナル分だけ処理をまわすように出来ているような。
ちなみに、終了用のシグナルが発生した時にスレッド内ループを抜けるようにしてて、スレッド終了になるようです。

てなわけで、サスペンド復帰時の時計表示が出来るように・・・だけど
実際組み込むに当たって色々と作成する要素があるので
バージョンアップの公開にはもうしばし待たれし・・・ということで。

とりあえず現在試しとして常駐モードで使用中なのですが
・・・サスペンド復帰表示結構いいな・・・
試用した途端、さっそくバグ見つけたけど(苦笑)。

2007年10月7日日曜日

久しぶりにコーディングできたぜぃ

会社の新しい部署に移ってから、えらく忙しくなってしまって
仕事外のプログラムに手をつける余裕がまるで無かった今日この頃。
とりあえず、環境を自宅に移して休日にちまちまやることに決定。
環境移すっていっても、ノートPC持ち帰ってくるだけなんですけどね♪
うーん、まさに日曜プログラマーだ・・・。

さて、久しぶりにソース触ったから感覚忘れそうになってましたが、続きの方を。
常駐状態で、時計のON・OFFを・・・ON/OFF処理はソースの記述整頓で抜き出しておいたので
関数呼び出すだけでOKとして、軽く大変だったのがウィンドウの表示非表示が
何気にうまくいっていなかった・・・てか、ちょっと抜けてたというか
そもそも表示・非表示はShowWindow関数で十分いけた感じ。
MoveWindowでサイズ変えることも無かったみたい。

とりあえず、時計表示のON・OFFは任意に出来るようになったので、次の段階へ・・・といきたいところですが、ちょっと前々から気がかりだった不具合が合ったので修正を試み。

ふつーの最初からあるdefault.txt起動で時計表示したまま画面回転させると、表示がえらいことになるという・・・。
これは表示背景の問題でして、画面表示を毎フレーム更新かけてるわけですが、
最初の画面クリア処理をどうしてるかというと、
起動時の画面画像をまんま一画像として保持しておいて、
それを背景画像として毎フレーム書いていたわけです。

透明ウィンドウってのがWindowsMobileで存在しないのでとっている手段なわけですが、
これがアドエスの画面回転が起こったときにチト問題。
だってねぇ・・・最初に作った背景用画像を変えてないから・・・縦横とかそもそもサイズあってないし・・・。

てなわけで対策としては、画面回転が起こったときに背景用画像を作り直し、なわけですが
背景だから、それまでの時計表示を非表示にした状態で縦横変わった画像を取得しないと
・・・てなことで、色々試したけど結局表示OFF→表示ONの手順を踏むことに。
これ動作フレーム1Fからになるんだよな・・・つまり最初から起動しなおししてるのと同じ。
あと、画面回転を判断するイベントがよくわからんというか、WM_SIZEってウィンドウサイズが変わったことで判断するみたいなんですが、
このイベント、画面回転時以外でも発生するときあるんだよな・・・色々調節したけど、うん・・・コレは試行錯誤まだいるな・・・。

てなわけで、少しだけ進められたよ・・・。
こうしてみると結構大変になってきたな・・・特に画面回転ってうまく取る方法ないのかねぇ?

2007年9月23日日曜日

常駐ルーチン作成中

要望として、サスペンド復帰時に自動起動して欲しい、ていうのがありまして
確かにそれ便利ね・・・と思うので、作成に挑戦。

とりあえずやることは・・・プログラム上で時計の起動・終了を可能とする辺りから。
今はプログラム起動で問答無用で時計出して、クリックとかで問答無用でプログラム自体の終了をする状態なんですな。

んで、ソースの各種処理関数の位置を色々修正して・・・つまりは整理整頓。
それから時計非表示状態の時は使用メモリを極力使わないように、ってことでメモリ確保と開放の処理を組み込み。mallocとfreeですな。
ついでに時計表示時の変数の使い方とかメモリ確保の処理も色々修正したところ
通常起動している状態で消費メモリが5MBほどだったのが2MBちょいまで減少。
モバイル機の搭載メモリを考えると・・・結構メモリくってたのね・・・。

さて、常駐する・・・てことで、常駐させる方法としては起動時の引数を用意する形に。
引数なしで起動したときは、これまでの時計表示→画面タップで終了の流れを保持しつつ、
常駐用の引数をもって起動したときには、たとえばmode=1として常駐モードとして起動。
常駐モードの時は、時計はいきなり表示させない状態に。
でも時計表示出さないと画面タップでの終了が出来ないので、常駐モード起動の終了方法としては、常駐モード用引数による多重起動で終了という形に。
多重起動判定ルーチンを利用して、多重起動したときに元のウィンドウに独自にイベントを発行してやることで判定です。
こんな感じ↓
PostMessage(hwnd, WM_DUPEXEC_NOTIFY, ExecMode, 0);

んで、多重起動モードではイベント受け取るために目に見えないウィンドウを作成するわけですが(MoveWindow( hWnd, 0, 0, 0, 0, FALSE );でサイズ0にしてます)、このままだと起動してるかも分からないので、タスクトレイにアイコンを表示することに。
こんな感じ↓
Shell_NotifyIcon(NIM_ADD, &nid);
ちなみに終了時は↓で表示解除。
Shell_NotifyIcon(NIM_DELETE, &nid);
タスクトレイに表示されているアイコンに対しては、クリックするとかでイベントを送ったりも出来ますが、
とりあえずこの状態で時計を表示したり、非表示にしたりの繰り返しが出来るように試しているところ・・・で今現在止まっております。トライアンドエラーでココまで来ておりますが・・・意外と大変ですなぁ・・・初めてのプログラムで知らないことだらけだから・・・まぁ、やりがいはあるですが~。

さて・・・次はいつソース触れるだろうか・・・最近実生活が忙しくなりそうな匂いがしてるからなぁ・・・。

2007年9月20日木曜日

画像読み込みの作成

さて、次なる機能として
BMP以外にもPNG・JPG・GIFファイルを読み込めるようにしてみよう、という事をしてました。

BMPしか読めないというのも、サイズ的な見地からちょっとよろしくは無いわけでして
例えばアドエスの解像度全開サイズ(480×800)の32ビットBMPファイルを作ってみると、
画像1つで1.4MBとかいっちゃうわけで、
携帯端末でそんな、アフォですかとかいわれちゃうわけで、
そんなわけで、他のファイル形式も読めるようにしなくては~なわけです。

んで、参考ページ見るに、SHLoadImageFile関数を使えば読み込める、という事なので
ふふん楽勝じゃん、てな感じで入れ込んで見たけども・・・ひっかかった。

コンパイルエラー発生、参考しても見つかりませんでした・・・てな感じの。
ちょっと調べて、あぁ、#include <aygshell.h>が必要なのか・・・で入れてみたら、
今度はコンパイルは通ったみたいだけど、リンクエラー発生。
え~、ファイル無いの?とか思って検索掛けてみたけど、ふつーにファイルあるし、パス通って無いのかとか色々試してみたけど、うまくいかず。
で、散々ググったりなんだり色々参考ページとかソースとか巡っているうちに、MFCのファイルだっけかstdafx.hとかあたりに記述っぽいのが。

結局#include <aygshell.h>の次の行に
#pragma comment(lib, "aygshell.lib")
と書く事で、ビルドできるように。

なんだろうねこれ。よくわかんない辺りまだまだプログラマとして日が浅いなぁと思うのでした(苦笑)。

何はともあれ、コレでさっきの関数が使えるようになってPNGファイルとか読み込めるようになったので、表示周りを色々試して見ましたが、ちと微妙に不都合と言うか
PNGファイル読込での半透明表示だと、透過色設定とか透過PNGとか効かないんだな・・・という事が。
おそらくは読み込んで作成されるビットマップの形式によるものだと思われるんだけど、
コレも色々試したんだけどイマイチうまくいかないというか、結局画像四角全部が色に関係なく半透明して表示されるということに・・・。
単純な描画なら透過色を指定して、色抜き描画が出来てるんだけどねぇ・・・。
とりあえずは、BMPとそれ以外で使用する関数変えて、BMPだけはαチャンネルが表示に効くようにする形でやることにしようかな、と。

てな感じでBMP以外の画像ファイル読込の作成を行いました。
いやぁ、トライアンドエラーというか、初めての作成ってやっぱ大変だなぁ・・・。
まぁ、これもまた勉強ですが、が、が。