2009年 02月 25日
C++・コンテキストメニュー |
最近、放置プレイ甚だしいので、趣向を変えようと。
お遊びネタはmixiへどうぞ。
ブログのほうは、主にソフトウェア、システム関連の備忘録としてみます。
で、早速C++(MFC)関連。
最近コンテキストメニューを出す機会が多く、自分なりに色々調べたのでメモ。
//=============================================
1. OnRButtonDown()ではなく、OnRButtonUp()で拾うべき。
2. さらにできるなら、OnContextMenu()で拾うべき。
コンテキストメニューって、右シングルクリックだけで拾うもんではない。
パッドやタッチパネルなら長押し。さらに、右クリックしたらすぐに離すとは限らん。
タッチパネル等々でもOnRButtonDown()や~Up()の同じメッセージが来るわけやけど、
名前がおかしいでしょう。右ボタンってどこやねん。と。
特に最近、タッチパネル搭載PCが続々と出てきたので、考慮が必要。
//=============================================
3. 「TrackPopupMenu()で出したメニューが消えない!どうしたらいいの?」
という質問と、それに対する回答はネット上にたくさんある。
そのほとんどが、
「TrackPopupMenu()の前にSetForegroundWindow()を呼び、
TrackPopupMenu()から戻ってきたらPostMessage(NULL)を呼ぼう。」
という、MSDNの丸写し。もうちょっと調べましょう。
経験では、Windows Mobile(以下、モバイル)ではSetForegroundWindow()と
PostMessage(NULL)のコールは必須と言ってもいいかも。
ただし、XP、Vista(以下、PC)では別。
アプリのメインウィンドウ上にコンテキストメニューを表示する場合、不要であることが多い。
逆に、タスクトレイアイコンクリック時など、スクリーン上に表示する時は必要。
無駄な処理(「何のために書いてるか一見分からないコード」が適切?)を減らすために、
実際に動かしてみるのが良さそう。この辺は、Microsoftもちゃんと原因を公表してないし。
//=============================================
4. TrackPopupMenu()の引数、UINT uFlagsについて
配置位置、選択方法、選択後の所作を一括で指定。考えた人偉いなぁ。
何も指定しなかったら
TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON
になるのかな?自信ないけど。
4-1. PCの場合はTPM_RETURNCMDを指定すればTPM_NONOTIFYも必要。
でも、モバイルの場合はTPM_RETURNCMDのみの指定でOK。
(※モバイルのヘルプが間違い?ご利用は自己責任で)
ちなみに、TPM_RETURNCMDを使うと、
自分でコマンドハンドラが選べるので非常に便利。見た目は悪いけど。
4-2. TPM_RIGHTBUTTONを指定すれば、左ボタンクリックでも決定できる。
でもTPM_LEFTBUTTONを書いてやったほうがわかりやすいかも。
「右ボタンでしか決定できないの?」と、この関数知らない人なら思いかねない。
//=============================================
5. TrackPopupMenu()の引数、int x, int yについて
スクリーン座標であることに注意。
OnContextMenu()の引数pointを使うときとか。
意外に大きいウィンドウを持つアプリだと気付かない。
//=============================================
コンテキストメニューが使いやすいと、アプリそのものが使いやすく感じる。
マウスだとボタンを人差し指と中指で操作するけど、
トラックパッドを日常的に使う人(私です)は、左右どちらも親指という場合が多いはず。
右ボタンをポンと押すと、カーソルを動かしやすい位置にメニューが表示され、
滅多に使わないアイテムが出ない、というのが理想です。
なかなか奥が深い。
お遊びネタはmixiへどうぞ。
ブログのほうは、主にソフトウェア、システム関連の備忘録としてみます。
で、早速C++(MFC)関連。
最近コンテキストメニューを出す機会が多く、自分なりに色々調べたのでメモ。
//=============================================
1. OnRButtonDown()ではなく、OnRButtonUp()で拾うべき。
2. さらにできるなら、OnContextMenu()で拾うべき。
コンテキストメニューって、右シングルクリックだけで拾うもんではない。
パッドやタッチパネルなら長押し。さらに、右クリックしたらすぐに離すとは限らん。
タッチパネル等々でもOnRButtonDown()や~Up()の同じメッセージが来るわけやけど、
名前がおかしいでしょう。右ボタンってどこやねん。と。
特に最近、タッチパネル搭載PCが続々と出てきたので、考慮が必要。
//=============================================
3. 「TrackPopupMenu()で出したメニューが消えない!どうしたらいいの?」
という質問と、それに対する回答はネット上にたくさんある。
そのほとんどが、
「TrackPopupMenu()の前にSetForegroundWindow()を呼び、
TrackPopupMenu()から戻ってきたらPostMessage(NULL)を呼ぼう。」
という、MSDNの丸写し。もうちょっと調べましょう。
経験では、Windows Mobile(以下、モバイル)ではSetForegroundWindow()と
PostMessage(NULL)のコールは必須と言ってもいいかも。
ただし、XP、Vista(以下、PC)では別。
アプリのメインウィンドウ上にコンテキストメニューを表示する場合、不要であることが多い。
逆に、タスクトレイアイコンクリック時など、スクリーン上に表示する時は必要。
無駄な処理(「何のために書いてるか一見分からないコード」が適切?)を減らすために、
実際に動かしてみるのが良さそう。この辺は、Microsoftもちゃんと原因を公表してないし。
//=============================================
4. TrackPopupMenu()の引数、UINT uFlagsについて
配置位置、選択方法、選択後の所作を一括で指定。考えた人偉いなぁ。
何も指定しなかったら
TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON
になるのかな?自信ないけど。
4-1. PCの場合はTPM_RETURNCMDを指定すればTPM_NONOTIFYも必要。
でも、モバイルの場合はTPM_RETURNCMDのみの指定でOK。
(※モバイルのヘルプが間違い?ご利用は自己責任で)
ちなみに、TPM_RETURNCMDを使うと、
自分でコマンドハンドラが選べるので非常に便利。見た目は悪いけど。
4-2. TPM_RIGHTBUTTONを指定すれば、左ボタンクリックでも決定できる。
でもTPM_LEFTBUTTONを書いてやったほうがわかりやすいかも。
「右ボタンでしか決定できないの?」と、この関数知らない人なら思いかねない。
//=============================================
5. TrackPopupMenu()の引数、int x, int yについて
スクリーン座標であることに注意。
OnContextMenu()の引数pointを使うときとか。
意外に大きいウィンドウを持つアプリだと気付かない。
//=============================================
コンテキストメニューが使いやすいと、アプリそのものが使いやすく感じる。
マウスだとボタンを人差し指と中指で操作するけど、
トラックパッドを日常的に使う人(私です)は、左右どちらも親指という場合が多いはず。
右ボタンをポンと押すと、カーソルを動かしやすい位置にメニューが表示され、
滅多に使わないアイテムが出ない、というのが理想です。
なかなか奥が深い。
by novaexp
| 2009-02-25 00:34