TTreeView의 OnContextPopup이라는 이벤트가 있습니다.
거기서 Mouse좌표를 변경도 가능하고 PopupMenu중 일부를 보이게 안보이게도 가능하며
또는 Handled라는 변수를 true로 해주면 Menu가 뜨지 않게도 됩니다.
// 다음과 같이 코딩하면 Node가 있는 위치에 우클릭할때만
// PopupMenu가 뜨겠네요
void __fastcall TForm8::TreeView1ContextPopup(TObject *Sender, TPoint &MousePos, bool &Handled)
{
TTreeNode* pNode = TreeView1->GetNodeAt(MousePos.x, MousePos.y);
if(pNode==NULL)Handled=true;
}
그리고 TreeView1MouseDown의 x,y좌표를 Screen전역 좌표로 변경하는것은
TreeView1->ClientToScreen 함수를 쓰면 됩니다.
반대로 전역 좌표를 TreeView기준좌표로 변경하려면
TreeView1->ScreenToClient를 쓰시면 되구요
그럼..
압9정 님이 쓰신 글 :
: 음 그렇게 해봤는데요. Node가 아닌 빈공간을 우클릭 해도 Popup 창이 뜨더라고요.ㄷ
:
: Node 위에서 우클릭 시에만 Popup창이 뜨도록 할려고 TreeView1MouseDown을 사용해봤는데요...
:
: 별로 안좋은 방법인건 가요?ㅜ
:
: 아니면 PopupMenu 프로퍼티를 사용하고 Node에서 우클릭 시에만 Popup창을 띄우는 방법좀 알려주세요.ㅜㅜ
:
: 장성호 님이 쓰신 글 :
: : 음..
: :
: : 1) TreeView1MouseDown 코드를 모두 지우시구요
: :
: : 2) TreeView1의 PopupMenu 라는 프로퍼티가 있습니다.
: : designtime도 좋구 코딩으로도 좋구
: : TreeView1->PopupMenu 에 PopupMenu1을 연결하세요
: :
: : 그러면 아무 코딩필요없으 원하는 위치에 Popupmenu가 뜰것입니다.
: :
: : 3) 만약 TreeView의 마우스 오른쪽 버튼 클릭시 해당위치의 Node가 선택되게 하려면..
: : TreeView의 RightClickSelect라는 프로퍼티를 true로 해주시면 됩니다.
: : (해당 프로퍼티가 없는 구버젼의 경우엔 Select관련 코딩은 해주셔야 하구요)
: :
: :
: : 그럼..
: :
: :
: : 압9정 님이 쓰신 글 :
: : : 질문 제목이 좀 이상하네요...ㄷ
: : :
: : : TreeNode에서 Node에서 마우스 오른쪽을 클릭하면 PopupMenu1->Popup(X, Y); 을 하여 클릭한 위치에서 Popup을 띄우고 싶습
: : :
: : : 니다. 지금 밑에 있는 코드로 실행하면 X와 Y의 값은 TreeView가 기준이지만 Popup(X, Y) 함수에서 적용되는 X, Y값은 기준이 윈
: : :
: : : 도우가 되서 첨부한 사진처럼 Popup이 뜹니다. (이해가 가실련지...)
: : :
: : : 제가 하고 싶은 것은 PopupMenu1->Popup(X, Y); 함수에서 적용되는 X, Y값을 TreeView 기준으로 하는 것 입니다.
: : :
: : : 지금 만약 X = 10, Y = 10 이라면 클릭된 위치는 TreeView(0,0) 에서 X 축으로 10, Y 축으로 10 간 것인데,
: : :
: : : PopupMenu1->Popup(X, Y); 함수는 윈도우 모니터 (0,0)을 기준으로 X축으로 10, Y축으로 10만큼 움직인 위치에 Popup창이 띄워
: : :
: : : 지는 것이 문제입니다. 이것을 PopupMenu1->Popup(X, Y); 함수도 TreeView(0,0) 에서 X 축으로 10, Y 축으로 10 간 위치에서 Po
: : :
: : : pup창을 띄우고 싶습니다. (이해하셧기를 바랍니다.ㅠㅠ)
: : :
: : : 결론은 PopupMenu1->Popup(X, Y); 함수가 TreeView(0,0) 에서 부터 X축. Y축 만큼 이동한 위치에서 Popup창을 띄워줬으면 합
: : :
: : : 니다. 방법을 아시거나 도움되는 말씀도 괜찬습니다. 부디 지식을 나누어 주세요.ㅜ
: : :
: : :
void __fastcall TfrmMain::TreeView1MouseDown(TObject *Sender, TMouseButton Button,
: : : TShiftState Shift, int X, int Y)
: : : {
: : : int i;
: : :
: : : if ( Button == mbRight )
: : : {
: : : TTreeNode* pNode = TreeView1->GetNodeAt(X, Y);
: : :
: : : if(pNode)
: : : {
: : : if(pNode->Parent)
: : : {
: : : TreeView1->Selected = pNode;
: : : PopupMenu1->Popup(X, Y);
: : : }
: : : }
: : : }
: : : }
: : : //---------------------------------------------------------------------------