hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

いまさらのWindowsCEプログラミング(8) - カーソル

WindowsCEAPIはWin32 APIのサブセットですが、デバイスの特性によってどうしてもWindowsと異なる部分があります。
今回はWindowsCE特有の対応が必要な例として、カーソルを取り上げます。

砂時計カーソル

Windows の場合

WindowsMFCで砂時計カーソルを出す簡単な方法は、ブロック内でCWaitCursorを定義することです。ブロックを抜けると変数が開放され、自動的にカーソルが元に戻ります。

(1)ブロック内でCWaitCursorを宣言する方法。
{
	CWaitCursor wait;
	// 時間のかかる処理
}

もうひとつの方法は、SetCursor()で明示的にカーソルを設定し、元に戻す方法です。

(2)SetCursor()でカーソルを設定する方法。

	HCURSOR rc = SetCursor( AfxGetApp())->LoadStandardCursor( IDC_WAIT ) );
	// 時間のかかる処理
	SetCursor(rc);	// 保存したカーソルに復帰

(1)(2)とも、Windowsでは正しいプログラムです。ところがWindowsCEで実行すると、(1)(2)共、砂時計カーソルが消えずに表示されたままになります!
(2)の例で、最初のSetCursor()は変更前のカーソルのハンドルを返します。ところがWindowsCEではカーソルが普通は表示されていないため、NULLが返ってきます。2番目のSetCursorではカーソルハンドルにNULLを指定することになるため、実際には何も起きず、砂時計カーソルが表示されたままになるというわけです。

WindowsCEの場合

解決方法は簡単で、SetCursor(0) でカーソルが消えます。

	HCURSOR rc = SetCursor( AfxGetApp())->LoadStandardCursor( IDC_WAIT));
	// 時間のかかる処理
	SetCursor(0);	// 明示的に0にするとカーソルが消える