TreeView响应鼠标右击和修改的问题

huangqibin888 2010-12-13 12:56:26
RT,有两个问题:
1,自己做了个TreeView窗口,但是鼠标右击消息死活不响应,WM_CONTEXTMENU和NM_RCLICK都试过,都不行。是不是建立窗口creatwindow的时候要加入支持右击的窗口风格或者其他原因?
2,已经添加了TVS_EDITLABELS,在notifyTV中也添加了TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT,问题是,什么时候可以修改原有项,感觉有时候鼠标点着点着,突然就可以修改了。
...全文
350 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuenior 2012-08-03
  • 打赏
  • 举报
回复
还米结贴?
向立天 2011-01-10
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖

相关规定详见界面界面版关于版主结帖工作的具体办法
schlafenhamster 2010-12-16
  • 打赏
  • 举报
回复
在 LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
中只找到一个:
case WM_NOTIFY:
{
char prom[80];
NMHDR *lpnmh = (LPNMHDR)lParam;
sprintf(prom,"%d\n",lpnmh->code);
OutputDebugString(prom);//-530
//
switch(lpnmh->code)
{
case TTN_NEEDTEXTW:
OutputDebugString("TTN_NEEDTEXTW \n");
break;
case NM_HOVER:
OutputDebugString("NM_HOVER \n");
break;
case NM_NCHITTEST:
OutputDebugString("NM_NCHITTEST \n");
break;
}
}
break;
//剩下的要在 LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
中找。都有的
LRESULT TreeViewNotify (HWND hWnd, LPARAM lParam)
{
LPNMHDR lpnmh = (LPNMHDR) lParam; // Contains data from a notification
switch (lpnmh->code)
{
case NM_CLICK:
OutputDebugString("NM_CLICK\n");
break;
case NM_DBLCLK:
OutputDebugString("NM_DBLCLK\n");
break;
case NM_RETURN:
OutputDebugString("NM_RETURN\n");
break;
case NM_RCLICK:
OutputDebugString("NM_RCLICK\n");
break;
case NM_RDBLCLK:
OutputDebugString("NM_RDBLCLK\n");
break;
case NM_SETFOCUS:
OutputDebugString("NM_RCLICK\n");
break;
case NM_KILLFOCUS:
OutputDebugString("NM_KILLFOCUS\n");
break;
case NM_HOVER:
OutputDebugString("NM_HOVER\n");
break;
case NM_CUSTOMDRAW:
OutputDebugString("NM_CUSTOMDRAW\n");
break;
}
...
huangqibin888 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 schlafenhamster 的回复:]
你的winCE(蜥蜴)有问题吧,PC上是好的!
[/Quote]
按道理wince上是有右击的,系统桌面的右击菜单也能出来。可能是因为我的应用程序和wince之间通过一个库来连接,这个库哪里有点问题
schlafenhamster 2010-12-15
  • 打赏
  • 举报
回复
winCE的不知道
huangqibin888 2010-12-15
  • 打赏
  • 举报
回复
调试了一下,确实在treeview的父窗口中能响应WM_NOTIFY消息,其中的NM_CLICK消息也能响应,但是右击的NM_RCLICK消息就是捕捉不到,是不是对treeview控件的右击操作有特定要求的?
huangqibin888 2010-12-15
  • 打赏
  • 举报
回复
像我这样不包括的吧?
schlafenhamster 2010-12-15
  • 打赏
  • 举报
回复
你的winCE(蜥蜴)有问题吧,PC上是好的!
huangqibin888 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 schlafenhamster 的回复:]
在:
LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
中直接:
case WM_RBUTTONDOWN:
OutputDebugString("WM_RBUTTONDOWN\n");
break;
就可以了
[/Quote]
没有任何响应。。。
schlafenhamster 2010-12-15
  • 打赏
  • 举报
回复
在:
LRESULT CALLBACK TVProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
中直接:
case WM_RBUTTONDOWN:
OutputDebugString("WM_RBUTTONDOWN\n");
break;
就可以了
schlafenhamster 2010-12-14
  • 打赏
  • 举报
回复
吧tree init 也给你吧

//
BOOL InitTreeView(HWND hwndTreeView)
{
// set tree style
LONG NewStyle=GetWindowLong(hwndTreeView,GWL_STYLE);
NewStyle=NewStyle|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|
TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_EDITLABELS;
SetWindowLong(hwndTreeView,GWL_STYLE,NewStyle);
//
HIMAGELIST hImageList;
SHFILEINFO sfi;
hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\",0,&sfi,sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
if (hImageList)
{// Attach ImageList to TreeView
TreeView_SetImageList(hwndTreeView,hImageList,TVSIL_NORMAL);
}

// draw tree "My Computer"
TV_INSERTSTRUCT TreeCtrlItem;
TreeCtrlItem.hParent = TVI_ROOT;
TreeCtrlItem.hInsertAfter = TVI_LAST;// don't use TVI_SORT;
TreeCtrlItem.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_CHILDREN;//|TVIF_STATE;
TreeCtrlItem.item.pszText= m_MyComputer;//
TreeCtrlItem.item.cchTextMax = MAX_PATH;
TreeCtrlItem.item.cChildren=1;// has child show "+"
//
HRESULT hr;
LPMALLOC lpMalloc;
hr=::SHGetMalloc(&lpMalloc);
if (FAILED(hr)) return TRUE;
// get pidl of "My Computer"
LPITEMIDLIST lpidl=NULL; // pidl of "My Computer"
hr=SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&lpidl);
if (FAILED(hr)) return TRUE;
// icons and "My Computer"
SHGetFileInfo((LPCSTR)lpidl,0,&sfi,sizeof(SHFILEINFO), SHGFI_PIDL |
SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
TreeCtrlItem.item.iImage = sfi.iIcon;
strcpy(m_MyComputer,sfi.szDisplayName);
//
SHGetFileInfo((LPCSTR)lpidl,0,&sfi,sizeof(SHFILEINFO),SHGFI_PIDL |
SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
TreeCtrlItem.item.iSelectedImage = sfi.iIcon;
// insert root
HTREEITEM hTreeItem1 = TreeView_InsertItem(hwndTreeView,&TreeCtrlItem);
TreeCtrlItem.hParent = hTreeItem1;
// Free
lpMalloc->Free(lpidl);
lpMalloc->Release();
// under "My Computer"
char buf[MAX_PATH];
char *pDrv=buf;
char drive[40];
if(GetLogicalDriveStrings(260,buf))
{// try all drive
while(*pDrv)
{
strcpy(drive,pDrv);
pDrv+=strlen(drive)+1;
// no A:
if(stricmp(drive,"A:\\")==0) continue;
SHGetFileInfo(drive,FILE_ATTRIBUTE_DIRECTORY,&sfi,sizeof(sfi),
SHGFI_DISPLAYNAME | SHGFI_USEFILEATTRIBUTES | SHGFI_TYPENAME | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
TreeCtrlItem.hParent = hTreeItem1;
TreeCtrlItem.item.pszText = sfi.szDisplayName;
TreeCtrlItem.item.iImage=sfi.iIcon;
TreeCtrlItem.item.iSelectedImage = sfi.iIcon;
TreeCtrlItem.item.cChildren=1;// child show "+"
// add in
HTREEITEM hTreeItem2 = TreeView_InsertItem(hwndTreeView,&TreeCtrlItem);
// TreeCtrlItem.hParent = hTreeItem2;
}
}
// expand "My Computer"
// TreeView_SelectItem(hwndTreeView,hTreeItem1);//m_Tree.SelectItem();// root
TreeView_Expand(hwndTreeView,hTreeItem1,TVE_EXPAND);// root

return TRUE;
}
schlafenhamster 2010-12-14
  • 打赏
  • 举报
回复
LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
BOOL bl;
HDC hdc;
HPEN hPen;
HPEN hOldPen;

HINSTANCE hInstance=(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE);
switch(message)
{
case WM_CREATE:
MessageBeep(48);
m_hMain=hwnd;
//
m_hStatic=CreateStatic(hInstance,m_hMain);
//Animate_Create ACS_AUTOPLAY m_hStatic
m_hAnimate=Animate_Create(m_hStatic,IDC_AVI,WS_CHILD | WS_VISIBLE | WS_BORDER | ACS_AUTOPLAY |
ACS_TRANSPARENT,// | ACS_CENTER=0
hInstance);
if(m_hAnimate)
bl=Animate_Open(m_hAnimate, MAKEINTRESOURCE(ID_AVI));
// CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc) ;

DialogBox((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DialogProc);
//
m_hListView=CreateListView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd) ;
// LVoldProc = (WNDPROC)SetWindowLong(m_hListView, GWL_WNDPROC, (LONG)LVProc);
//
m_hListBox = CreateLB(hwnd);
LBoldProc = (WNDPROC)SetWindowLong(m_hListBox, GWL_WNDPROC, (LONG)LBProc);
//
m_hComboBox=CreateCB(hwnd);
//
m_hToolTip=CreateTT(m_hListView);
LvAddTools();
//
m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);
...
break;
huangqibin888 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 schlafenhamster 的回复:]
已经进行注册了,不必自己注册。
WNDPROC TVoldProc;
...
m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);……
[/Quote]
请问下能给我传个完整的代码看看吗
schlafenhamster 2010-12-14
  • 打赏
  • 举报
回复
已经进行注册了,不必自己注册。
WNDPROC TVoldProc;
...
m_hTreeView=CreateTreeView((HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), hwnd);
TVoldProc = (WNDPROC)SetWindowLong(m_hTreeView, GWL_WNDPROC, (LONG)TVProc);
schlafenhamster 2010-12-14
  • 打赏
  • 举报
回复
TreeView包含一个TreeCtrl
huangqibin888 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 schlafenhamster 的回复:]
treeview对应的窗口上还有子窗口treectrl,用CTreeCtrl& GetTreeCtrl( ) const;

可以得到它
[/Quote]
上面为什么还要有子窗口呢,我是trevie控件直接关联到WC_TREEVIEW窗口。
hwndTV = CreateWindowEx(0, WC_TREEVIE, TEXT(""),
WS_VISIBLE|WS_CHILD|WS_VSCROLL|WS_BORDER|
TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_EDITLABE, prect->left(), prect->top(),
prect->right(), prect->bottom(),
hwnd, (HMENU)ID_TREEV, app->instance()
, NULL);
// Create image list control for tree view icons.
himl = ImageList_Create(16, 16, ILC_COLOR, 4, 0);
// Load first two images from one bitmap.
hBmp = LoadBitmap(app->instance(), MAKEINTRESOURCE(ID_BMPTV)); ImageList_Add(himl, hBmp, NULL);
DeleteObject(hBmp);

TreeView_SetImageList(hwndTV, himl, TVSIL_NORMAL);


huangqibin888 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 schlafenhamster 的回复:]
treeview对应的窗口上还有子窗口treectrl,用CTreeCtrl& GetTreeCtrl( ) const;

可以得到它
[/Quote]
我的也会有吗?我不是用mfc的
schlafenhamster 2010-12-14
  • 打赏
  • 举报
回复
treeview对应的窗口上还有子窗口treectrl,用CTreeCtrl& GetTreeCtrl( ) const;

可以得到它
huangqibin888 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 schlafenhamster 的回复:]
我正在看它输出。2个都有!
[/Quote]
会不会是你的treeview对应的窗口上还有子窗口?
schlafenhamster 2010-12-14
  • 打赏
  • 举报
回复
我正在看它输出。2个都有!
加载更多回复(25)

15,977

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧