2007年5月26日土曜日

二、编辑标签消息

可以对树控件节点标签(节点文本)进行编辑,此时控件会在节点文本上产生一个编辑控件(Edit Control)。想要对文本进行编辑并使其生效,必须获得该编辑控件的窗口句柄(发送TVM_GETEDITCONTROL消息)。之后,通过这个窗口句柄获得用户在控件上所编辑修改后的节点文本。最后再把这个节点文本设置进该节点属性中才能使编辑生效(若不然编辑修改后,在节点上显示的文本仍将是原来的文本)。

编辑节点文本只需要处理TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT两个通知消息。用户已选中的节点上再次单击鼠标左键时树控件就会向其父窗口发送TVN_BEGINLABELEDIT通知消息,这时在节点上产生一个编辑控件,那么在处理这个通知消息时通常是获取编辑控件的窗口句柄:

case TVN_BEGINLABELEDIT:

{

//TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)lParam;

hedit =(HWND) SendMessage(GetDlgItem(hWnd, ID_TREECHECK), TVM_GETEDITCONTROL ,0, 0);

break;

}

当用户在节点的编辑控件上编辑完文本后在树控件空白处单击鼠标左键或按Enter键后,树控件向其父窗口发送TVN_ENDLABELEDIT通知消息结束编辑操作。在这里要更新节点文本并使其生效。此外,为了更新节点文本以及其他属性,在选中一个节点时要设法保存被选中节点的节点句柄(HTREEITEM),把它存储在一个全局变量hSelected中。

case TVN_ENDLABELEDIT:

{

char Text[256]="";

tvitem.mask = TVIF_HANDLE | TVIF_TEXT;

tvitem.hItem = hSelected;

SendMessage(GetDlgItem(hWnd,ID_TREECHECK), TVM_GETITEM,

0, (LPARAM)&tvitem);

GetWindowText(hedit, Text, sizeof(Text));

tvitem.pszText = Text;

SendMessage(GetDlgItem(hWnd,ID_TREECHECK), TVM_SETITEM,

0, (LPARAM)&tvitem);

break;

}

此时编辑节点标签操作全部完成。至于获得那个节点句柄的操作可以在NM_CLICK通知消息中发送TVM_HITTEST消息进行处理处理(当然也可以有其他的处理办法):

HTREEITEM hSelected;

case NM_CLICK:

{

UINT uFlags = 0;

POINT pt;

GetCursorPos(&pt);

ScreenToClient(GetDlgItem(hWnd, ID_TREECHECK),&pt);



TVHITTESTINFO hti;

hti.pt = pt;

//Selected必须是全局变量,然后到处理TVN_ENDLABELEDIT消息这个

//变量才有效!!

hSelected = (HTREEITEM)SendMessage(GetDlgItem(hWnd,

ID_TREECHECK),TVM_HITTEST, 0, (LPARAM)&hti);

//……

//……

//其他处理代码

break;

}

0 件のコメント: