Kevin Wienhold의 답변에 대한 귀하의 의견에 따라, 사용자는 treeview의 빈 공간을 클릭하고 선택된 노드를 선택 취소 할 수 있습니다.
당신은 TreeView
제어의 MouseDown
event을 처리하고, 마우스가 노드를 포함하지 않는 위치를 통해 클릭 한 경우 null
에 SelectedNode
property을 설정하여이 작업을 수행 할 수 있습니다.는 예를 들어, 다음 코드를 사용할 수
는
private void myTreeView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (myTreeView.HitTest(e.Location).Node == null)
{
myTreeView.SelectedNode = null;
}
}
이 테스트 할 수있는 지점으로 마우스 이벤트의 위치를 지정, 특정 지점에 위치하는 노드를 결정하기 위해 HitTest
method을 활용합니다. 사용자가 일 때 노드를 선택하는 데 다른 코드가 필요하지 않습니다.을 클릭하십시오. TreeView
에 의해 자동으로 처리됩니다.
편집 : 질문에 대한 내 댓글이 표시, 나는 여전히 당신이 달성하려고하는 것과 같은 매우 불분명 해요. 실제로 노드의 측면에있는 빈 공간에서 마우스 오른쪽 버튼을 누르고있는 동안 노드가 일시적으로 강조 표시되는 것을 막으려는 경우, 상황은 좀 더 복잡해집니다.
이전에이 문제를 조사한 적이 있으며, 마우스 버튼을 누르고있는 동안 마우스를 움직일 때까지는 메시지가 수신되지 않는 경우가 있습니다 (이 경우 노드가 아니요). 어쨌든 더 이상 선택됨). 이 동작은 운영 체제에서 명시 적으로 지정되며 표준 .NET 제공 이벤트를 사용하여 쉽게 재정의 할 수 없습니다. 하루 종일 MouseDown
이벤트에서 오른쪽 버튼 클릭을 취소 할 수는 있지만이 이벤트가 제어되기 전에 노드가 Windows에서 선택 중입니다. TreeView
및 ListView
과 같은 .NET 제공 컨트롤은 다음과 같습니다. Windows API에서 제공하는 동일한 컨트롤 주위의 래퍼 (이 "select-node-while-right-button-held-down"동작 자체를 구현 함). 무엇
는 일, 그러나, 파생 TreeView
제어 WndProc
을 무시하고 WM_RBUTTONDOWN
message을 처리한다.하지만 속성을 null
으로 설정하더라도 이후에 처리되지 않기 때문에 여기서는 작동하지 않습니다. Windows는 마우스 오른쪽 버튼에 대한 응답으로 노드를 자동으로 선택하므로 아무 일도하지 않아도됩니다. 기본 TreeView
컨트롤은 WM_RBUTTONDOWN
메시지를 수신하지 못합니다.
이
당신은 단순히 일찍 return
문을 구제하여 마우스 오른쪽 단추로 클릭 한 메시지를 취소 할 수 있습니다 : 그래서, 당신은이 문제를 처리하는 방법에 선택의 몇 가지있다. 물론 컨트롤에 실제로 전달 된 적이 없으므로 MouseDown
핸들러에서이 이벤트를 처리 할 수 없게됩니다. 따라서 팝업 컨텍스트 메뉴를 표시하려면이 방법이 효과가 없을 것입니다.
public class NewTreeView : System.Windows.Forms.TreeView
{
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_RBUTTONDOWN = 0x204;
if (m.Msg == WM_RBUTTONDOWN)
{
return;
}
base.WndProc(ref m);
}
}
당신은 기본 클래스는 메시지를 처리 할 수없이 다음 방법에서 return
을 WM_RBUTTONDOWN
메시지에 대한 응답으로 오버라이드 (override) WndProc
방법에 상황에 맞는 메뉴를 표시하고 있습니다. 이는 첫 번째 솔루션과 똑같은 일을합니다 (마우스 오른쪽 버튼 이벤트로 인해 노드가 선택되어 표시되는 것을 방지합니다). 마우스 오른쪽 버튼을 클릭 할 때마다 컨텍스트 메뉴를 표시하거나 원하는 다른 작업을 수행 할 수 있습니다 발생합니다. 물론 관련 코드가 모두 TreeView
컨트롤의 하위 클래스에 포함되어야하며 양식 UI 코드에서 처리되지 않아야 함을 의미합니다. 이는 사용자에게 편리 할 수도 있고 그렇지 않을 수도 있습니다.
public class NewTreeView : System.Windows.Forms.TreeView
{
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_RBUTTONDOWN = 0x204;
if (m.Msg == WM_RBUTTONDOWN)
{
//Create and show a context menu
var myContextMenu = new ContextMenuStrip();
myContextMenu.Items.Add("First Item");
myContextMenu.Items.Add("Second Item");
return;
}
base.WndProc(ref m);
}
}
당신 수 당신이 양식의 UI 코드에서 원하는대로 다음 처리 할 수있는 WM_RBUTTONDOWN
메시지에 대한 응답으로 사용자 정의 TreeView
클래스 raise your ownRightMouseClick
이벤트입니다. WM_RBUTTONDOWN
메시지를 기본 컨트롤 인 TreeView
컨트롤 클래스에 전달하지 않으면 앞의 두 가지 제안과 동일한 목표를 달성 할 수 있지만 양식의 UI 코드에서 마우스 오른쪽 버튼 클릭 이벤트를 처리 할 수 있습니다 서브 클래스 화 된 컨트롤의 WndProc
public class NewTreeView : System.Windows.Forms.TreeView
{
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_RBUTTONDOWN = 0x204;
if (m.Msg == WM_RBUTTONDOWN)
{
//Raise your custom event
OnRightMouseClick(new EventArgs());
return;
}
base.WndProc(ref m);
}
}
귀하의 질문을 이해할 수 있을지 확실하지 않습니다. 즉, 노드 오른쪽의 빈 공간을 클릭하면 마우스 오른쪽 버튼을 누르고있는 동안 노드가 강조 표시됩니다. –
네, 맞습니다! 노드를 클릭하지 않았을 때 노드가 강조 표시되는 것을 원하지 않는다. –