hishidaの開発blog

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

いまさらのWindowsCEプログラミング(9) - スタイラス

WindowsCEポインティングデバイスはマウスではなくスタイラスペンです。スタイラスのタップはマウスの左ボタンに相当します。スタイラスで右ボタンを押したい場合、H/PCでは ALT+タップ、PocketPCではタップアンドホールドで代用されます(一定時間スタイラスを同じ位置で押す)。

スタイラスで右ボタンを押す方法

H/PCの場合 - ALT+タップ

スタイラスは左ボタンなので、ALT+タップを押した場合も発生するイベントはあくまでWM_LBUTTONDOWN(左ボタン押下)です。左ボタンのイベントハンドラの中で、ALTキーが押されているかどうかを調べることになります。

ALT+タップでコンテキストメニューを表示する例。
void CEBWinView::OnLButtonDown(UINT nFlags, CPoint point) 
{

	if ( GetAsyncKeyState( VK_MENU )& 0x8000 ) {	// ALT押下
		CMenu    menu,*pPopup;
		menu.LoadMenu(IDR_POPUP_MENU);
		pPopup = menu.GetSubMenu(0);
		MakeSubMenu( pPopup );
		if ( pPopup ) {
			ClientToScreen( & point );
			pPopup->TrackPopupMenu(TPM_LEFTALIGN , point.x, point.y, AfxGetApp()->GetMainWnd());
		}
	}
	else {
		// 通常の左ボタンの処理
	}
}
PocketPCの場合 - タップアンドホールド
タップアンドホールドでコンテキストメニューを表示する例。
void CEBWinView::OnLButtonDown(UINT nFlags, CPoint point) 
{
#if defined(_WIN32_WCE_PSPC) && (_WIN32_WCE >= 212)
	SHRGINFO RGesture;
	RGesture.cbSize     = sizeof(SHRGINFO);
	RGesture.hwndClient = m_hWnd; //タップアンドホールドメニューをつけたいウインドウのハンドル
	RGesture.ptDown.x	= point.x;
	RGesture.ptDown.y	= point.y;
	RGesture.dwFlags  = SHRG_RETURNCMD;
	// 一定時間同じスポットが押さえられているかを認識する
	if( ::SHRecognizeGesture(&RGesture) == GN_CONTEXTMENU ){
		// ↑これでグルグルマークが出ます。
		CMenu    menu,*pPopup;
		menu.LoadMenu(IDR_POPUP_MENU);
		pPopup = menu.GetSubMenu(0);
		MakeSubMenu( pPopup );
		if ( pPopup ) {
			ClientToScreen( & point );
			pPopup->TrackPopupMenu(TPM_LEFTALIGN , point.x, point.y, AfxGetApp()->GetMainWnd());
		}

	}
	else {
		// 通常の左ボタンの処理
	}
#endif
}