2012-06-12 3 views
1

Visual Studio 6으로 작성된 MFC 응용 프로그램에 몇 가지 새로운 기능이 추가되었습니다. 사용자가 속성 페이지 내의 목록 컨트롤에서 머리글 열을 마우스 오른쪽 단추로 클릭하면 상황에 맞는 메뉴가 표시됩니다. CListCtrl 클래스가 클래스 마법사를 볼 추가되었습니다.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에있을 수 있지만이 알림은 목록 컨트롤의 부모까지 결코 도달하지 않습니다. 이 경우인가요?

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 오른쪽 클릭을 선호하지만 왼쪽 클릭은 필요한 경우 수행합니다.

+0

대신 WM_CONTEXTMENU를 사용해보십시오. –

+0

CListCtrl의 옵션으로 보이지 않습니다. 이렇게하는 올바른 방법처럼 보이지 않습니다. 확실히 누군가가리스트 컨트롤의 헤더를 마우스 오른쪽 버튼으로 클릭 할 때를 감지하는 간단한 방법이 있습니까? – Jonnster

답변

0

나는이 문제를 해결할 수 있었고 다른 누구도 같은 문제로이 문제에 걸리면 답변을 추가 할 것이라고 생각했습니다. 원래 게시 한 코드는 괜찮지 만 CListCtrl에서 파생 된 클래스의 OnNotify 처리기에 있어야합니다. 클래스 목록 컨트롤의 부모에게 반영 처리기를 추가 할 수 있지만 메시지를 결코 멀리 가져옵니다.

1

대화 상자의 목록 헤더에서 메시지를 처리하려고 시도하거나 CListCtrl 파생 클래스에서 수행 할 수 없습니다.

MFC는 특정 컨트롤 및 특정 메시지/알림 코드에만 메시지 리플렉션을 사용합니다.

아마도 마우스 클릭 좌표를 목록 컨트롤에 전달하기 때문에 히트 테스트가 실패합니다. 시험해보기 :

CHeaderCtrl에서 파생 된 클래스를 추가하십시오. 파생 된 클래스의 멤버 변수를 대화 상자에 선언하십시오. 당신이 이미 서브 클래스 (마법사에 의해 변수가 삽입되어 있음) 목록 컨트롤을 가지고 있다고 가정합니다. 파생 클래스와 팝업 메뉴에서 WM_CONTEXTMENU 또는 WM_LBUTTONUP에 대한

// 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); 

삽입 처리기 : 의 OnInitDialog 에서는 다음과 같은 물품. 클릭 위치에 대한 CPoint 유형이 표시됩니다.

관련 문제