Windows CE Programing Tip 01
メニューの操作
Windows CE のメニューはコマンドバーに登録します。
WM_CREATEメッセ時の処理時に、
hwndCB = CommandBar_Create(hInst, hWnd, 1);
CommandBar_InsertMenubar(hwndCB, hInst, IDM_MENU, 0);
CommandBar_AddAdornments(hwndCB, 0, 0);
と、言うようなコードをSDKウィザードが落としてくれるのですが、じゃあメニューの操作はどうすればよいのでしょう...
デスクトップ版では、
HMENU hMenu = GetMenu(hWnd);
と、なりますが...
インテリセンスが効くというのに、GetMenu APIはWindowsCEでは用意されていないようですし...
で、どうするか、
GetMenuの代わりに、CommandBar_GetMenuというAPIがWindowsCEでは用意されています。
HMENU hMenu = CommandBar_GetMenu(hwndCB );
となります。
CommandBar_GetMenuに渡すのは、コマンドバーのハンドルです。
親windowのハンドルを渡さないよう...
私はこれにはまりました。
入力文字のフィルタリング
Pocket PC 2003 SE エミュレーターでの場合です。
まだPocket PC 2003 SE エミュレーターで確認しただけですが。
エディットボックスで入力される文字に、制限をかけたい場合があります。
たとえば数字とアルファベットだけとか。
デスクトップならサブクラス化してWM_CHARで来たコードを見て捨てていけばいいのですが。
なぜか、ポケットPCではIME(SIP)からきたものの様子が違います。
WM_CHARに受け取った時点で確定図の文字がすでにエディットボックスに反転状態で表示されています。
このまま元のエディットボックスのプロシージャに渡さ無いでコードを捨てても、反転表示の文字が残ってしまうようです。
で、WM_CHARに受け取った時点で反転表示文があればバックスペースコードでも強制的に送ってし反転部分を消去してしまいます。
不要な文字がきたならば、
SendMessage(hWnd,EM_GETSEL,&nEnd,&nStart);
if(nEnd != nStart)
SendMessage(hWnd,WM_CHAR,_T('\b'),lParam);
return 0;
とするわけです。
でも、保障はできませんよ。
私の環境で今こうなると言うだけですかもしれませんから。