Windows XE2, TVirtualStringTree
및 TComboBox
을 제자리 편집기로 사용하고 있습니다.마우스 휠이 잘못된 컨트롤로 메시지를 보내고 있습니다.
폼에 직접 TComboBox
을 배치하면 런타임에 목록을 드롭 다운 할 수 있으며 마우스 휠은 목록의 항목을 원하는대로 위아래로 스크롤합니다. 그러나 실행시에 TVirtualStringTree
을 내부 편집기로 만들면 새로 만든 콤보 상자에 포커스가 있더라도 마우스 휠 WM_MOUSEWHEEL
메시지가 콤보 상자가 아닌 트리 컨트롤로 보내집니다.
콤보 상자 드롭 다운 목록의 항목이 스크롤되지 않기 때문에 분명합니다. 대신 콤보 상자 뒤의 트리 컨트롤이 스크롤됩니다. 콤보 상자의 고정 부분은 트리와 함께 이동하지만 드롭 다운 목록은 콤보 상자의 고정 부분에서 연결이 끊어지고 이동하지 않습니다 (그림과 같이).
이 두 경우는 TComboBox.Style
csDropDownList
로 설정된다. 마우스를 가져 가면된다
FCBox := TComboBox.Create(TreeControl);
FCBox.Visible := False;
FCBox.Parent := TreeControl;
// ... add items to combo box ...
FCBox.Visible := True;
FCBox.SetFocus;
FCBox.DroppedDown := True;
그것은 중요하지 않습니다 : 콤보 상자가 트리의 현재 위치에서 편집기로 생성 될 때,이 방법을 수행합니다. 콤보 상자 드롭 다운 목록의 항목 바로 위에있을 수 있으며 배경의 트리 컨트롤은 여전히 스크롤됩니다. 콤보 상자의 항목을 스크롤하는 유일한 방법은 해당 스크롤 막대를 사용하는 것입니다.
포커스가있는 컨트롤의 부모가 컨트롤 (이 경우 TComboBox
) 대신 마우스 휠 메시지를 수신하게되는 원인은 무엇입니까?
메시지가 컨트롤로 전송되었다고 설명하는이 문서 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx) 핸들을 처리하지 않으면 처리 될 때까지 체인까지 상위로 보내집니다. 'TVirtualStringTree'가'TComboBox'가 메시지를 처리하는 방식을 바꿀만한 일을하는지 살펴 보겠습니다. –