1

Visual Studio 6で記述されたMFCアプリがあり、それにいくつかの新しい機能を追加しています。私ができるようにしたいのは、ユーザーがプロパティページ内のリストコントロールのヘッダー列を右クリックしたときにコンテキストメニューを表示することです。クラスウィザードを表示するCListCtrlクラスが追加されました。

プロパティページのClassWizardを介して、listctrlを右クリックするためのハンドラーを追加しました。これは呼び出され、次のコードを追加して、rclickがヘッダーセクション上にあるかどうか、またある場合はどのヘッダーアイテム上にあるかを調べます。このような

POINT Point;
GetCursorPos (&Point);
ScreenToClient(&Point);

HDHITTESTINFO HitTest;

//Offset of right scrolling  
HitTest.pt.x = Point.x+ m_ctrlRecordList.GetScrollPos(SB_HORZ); //Offset of right scrolling
HitTest.pt.y = Point.y;

//Send the Hit Test Message
m_ctrlRecordList.GetHeaderCtrl()->SendMessage(HDM_HITTEST,0,(LPARAM)&HitTest);

    // Check hit test result.

*pResult = 0;

ただし、ヒットテストは常に-1を返します。

プロパティページのヘッダーコントロールのHDN_ItemClickメッセージを処理して、代わりに左クリックで試してみました。これはすべてClassWizardで行われるため、ここでこの通知を処理できると期待していました。ただし、これまでに調査したところ、MFCにバグがあり、ClassWizardがこのコードをコードに挿入している可能性がありますが、この通知はリストコントロールの親までは届きません。これは本当ですか?

これを行うための最良の方法は何でしょうか?私は右クリックを好みますが、必要に応じて左クリックでもかまいません。

4

2 に答える 2

1

ダイアログ内のリストのヘッダーからのメッセージを処理しようとして実行することはできません。また、CListCtrl派生クラスで処理することもできません。

MFCは、特定のコントロールと特定のメッセージ/通知コードにのみメッセージリフレクションを使用しています。

ほとんどの場合、リストコントロールでマウスクリックの座標を渡しているため、ヒットテストは失敗します。これを試して:

CHeaderCtrlから派生したクラスを追加します。ダイアログで派生クラスのメンバー変数を宣言します。リストコントロールはすでにサブクラス化されている(ウィザードによって変数が挿入されている)と思います。OnInitDialogに次のように記述します。

// m_List is the dialog’s member of the subclassed list control, 
// m_header is a member variable of your new header class:
// insert this code after list control is already 
// initialized and all columns are added.
CHeaderCtrl* pHeaeder = m_List.GetHeaderCtrl();

m_Header.SubclassWindow(pHeaeder->m_hWnd);

派生クラスとポップアップメニューにWM_CONTEXTMENUまたはWM_LBUTTONUPのハンドラーを挿入します。クリック位置のCPointタイプを受け取ります。

于 2012-06-13T21:27:58.803 に答える
0

私はなんとかこれを整理し、他の誰かが同じ問題でこれに遭遇した場合に備えて答えを追加すると思いました。私が最初に投稿したコードは問題ありませんが、CListCtrlから派生したクラスのOnNotifyハンドラーに入れる必要があります。ClassWizardを使用すると、リストコントロールの親にリフレクトハンドラーを追加できますが、メッセージがそれほど遠くまで到達することはありません。

于 2012-06-13T12:43:15.313 に答える