|
아래처럼 한번해 보세요.
전이렇게 해서 됐는데... 질문에대한 답변이되셨길...
void __fastcall TMDIChildHost::NodeTreeMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
TTreeNode *SelNode;
int xx, yy;
xx = NodeTree->Left + X + 105;
yy = NodeTree->Top + Y + 176;
if(Button == mbRight)
{
SelNode = NodeTree->GetNodeAt(X, Y);
NodeTree->Selected = SelNode;
if(NodeTree->Selected->IsFirstNode())
{
...
}
else
{
...
}
}
}
초록물고기 님이 쓰신 글 :
: 안녕하세요..
: 아래는 하나의 트리뷰에서... 오른쪽 마우스 버튼을 클릭하면, 특정 popup menu를 띄워서
: popupmenu 에서 눌린것에 따라서 무언가의 작업을 하려고 합니다.
:
: 트리뷰에는 root 밑에 여러개의 depth (level )을 가지고 있습니다.
: 만약 지금 현재 맨위의 root가 선택되어 있었고,,,
: 여기서 child node를 선택할 때, 방법은 두가지가 존재할 것 같습니다.
:
: 방법 1)
: 선택하고자는 child node를 마우스 왼쪽 버튼으로 누르고(먼저 child node 선택),,,
: 마우스 오른쪽 버튼을 눌러 popup menu를 띄은경우.
:
: 방법 2)
: 선택하고자는 child node를 ,바로 마우스 오른쪽 버튼을 누르고,
: popup menu를 띄운경우.
:
:
: 위에서 방법 1로 했을 경우는 정상적으로 popmenu menu에 연결된 함수까지...모든것이 정상적으로
: 수행 됩니다.
: 문제는 2번인데... 왼쪽 버튼으로 먼저 선택하는 것 없이.. 마우스 오른쪽 버튼을 바로 누른경우...
: 선택됐음을 표시하는 반전막대가,,, 그전에 선택되었던 곳으로 (지금 같은 경우 root로 이동) 이동되는 것을 볼수 있습니다.
: 그러면서... 메모리 access violation 에러를 냅니다...
: 트리뷰가 잘못 만들어졌나 해서,,, 트리뷰를 여러번 만들었는데요...현상을 똑같습니다.
: 어떤 이유에서 이런 현상이 나타는 것인지요?
: selected 속성과 관계가 있는 것 같은데... 무었때문이지 잘 모르겠습니다.
:
: ======= 트리뷰에서 마우스 오른쪽 버튼이 눌렸을 popup menu를 띄우려 합니다 ===
: void __fastcall TmainFrame::TreeView1MouseDown(TObject *Sender,
: TMouseButton Button, TShiftState Shift, int X, int Y)
: {
: TTreeNode* pNode = TreeView1->GetNodeAt(X, Y);
: if(Button == mbRight)
: {
:
: TPoint Pnt(X, Y);
: Pnt = ((TTreeView*)Sender)->ClientToScreen(Pnt);
: if(!pNode)
: { // 현재 트리노드가 선택되지 않았다.
: if(TreeView1->Items->Count == 0)
: {
: ShowMessage ( "아무 노드가 없습니다" );
:
: }
: }
: else
: {
: // 테스크 라는 곳에서... 마우스 오른쪽 버튼이 눌렸다면..
:
: //여기서 "테스트" 라는 node를 왼쪽 버튼으로 선택후 , 마우스 오른쪽 버튼을
: //누르면,,, 모든 것이정상적으로 수행, 그러나 마우스 오른쪽 버튼을 바로 누르면,,
: //메모리 access violation error 가 나는 것을 볼수 있습니다.
: //어떤 문제때문에 이런 현상이 나타나는 것인지요?
: if(TreeView1->Selected->Text == "테스트" )
: {
:
: PopupMenu1->Popup(Pnt.x, Pnt.y);
:
: }
: }
:
|