这里是树状目录的初始化
void CDirTreeCtrl::Initialize()
{
LPITEMIDLIST pidl = NULL;
SHGetSpecialFolderLocation(*this, CSIDL_DESKTOP, &pidl);
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
HIMAGELIST hSysImageList = (HIMAGELIST) SHGetFileInfo((LPCTSTR)pidl, 0,
&sfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); m_pMalloc->Free(pidl);
TreeView_SetImageList(*this, hSysImageList, TVSIL_NORMAL); RefreshShellRoot(NULL);
}自己编的一个树状目录列表,在做右键点击一个目录然后在下面新建一个目录,该目录名字一开始是一个等待输入的状态,遇到了2个问题
1)如何右键点击一个目录的同时如何选中它
考虑了用hittest测试得到选择项的句柄,但是使用ClassWizard响应NM_RCLICK
消息里的NMHDR参数得到的点击点坐标位置(传给hittest判断用)似乎不对,不知道
如何得到正确的坐标位置传给hittest
2)为什么那个输入目录的小Edit控件没出来,看了msdn似乎用下EditLabel就可以啊,但是我用了以后返回的Edit控件的指针是空的,所以一直没出来那个输入控件,我贴代码HTREEITEM CDirTreeCtrl::AddNewDirectory()
{
HTREEITEM currentSelectedItem=GetSelectedItem();
if(currentSelectedItem==NULL)
return NULL; if(Expand(currentSelectedItem, TVE_EXPAND)==FALSE)
return NULL; HTREEITEM item;
TV_INSERTSTRUCT tvstruct;
tvstruct.hParent=currentSelectedItem;
tvstruct.item.pszText=_T("new");
tvstruct.hInsertAfter=TVI_LAST;
tvstruct.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE| TVIF_PARAM;
tvstruct.item.iImage=5;
tvstruct.item.iSelectedImage=5;
item=InsertItem(&tvstruct);
SetFocus(); TVITEM tvItem;
tvItem.hItem=currentSelectedItem;
BOOL t=GetItem(&tvItem);
m_currentEditItemChildren=tvItem.cChildren;
tvItem.cChildren=1;
SetItem(&tvItem);
//UINT test3=GetItemState(currentSelectedItem, TVIF_CHILDREN);
//UINT test4=TVIS_BOLD;
BOOL test=Expand(currentSelectedItem, TVE_EXPAND);
BOOL test2=EnsureVisible(item);
SetFocus();
CEdit* pedit=EditLabel(item); //pedit是空的,很奇怪 return item;
}
3ks!!!!
void CDirTreeCtrl::Initialize()
{
LPITEMIDLIST pidl = NULL;
SHGetSpecialFolderLocation(*this, CSIDL_DESKTOP, &pidl);
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
HIMAGELIST hSysImageList = (HIMAGELIST) SHGetFileInfo((LPCTSTR)pidl, 0,
&sfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); m_pMalloc->Free(pidl);
TreeView_SetImageList(*this, hSysImageList, TVSIL_NORMAL); RefreshShellRoot(NULL);
}自己编的一个树状目录列表,在做右键点击一个目录然后在下面新建一个目录,该目录名字一开始是一个等待输入的状态,遇到了2个问题
1)如何右键点击一个目录的同时如何选中它
考虑了用hittest测试得到选择项的句柄,但是使用ClassWizard响应NM_RCLICK
消息里的NMHDR参数得到的点击点坐标位置(传给hittest判断用)似乎不对,不知道
如何得到正确的坐标位置传给hittest
2)为什么那个输入目录的小Edit控件没出来,看了msdn似乎用下EditLabel就可以啊,但是我用了以后返回的Edit控件的指针是空的,所以一直没出来那个输入控件,我贴代码HTREEITEM CDirTreeCtrl::AddNewDirectory()
{
HTREEITEM currentSelectedItem=GetSelectedItem();
if(currentSelectedItem==NULL)
return NULL; if(Expand(currentSelectedItem, TVE_EXPAND)==FALSE)
return NULL; HTREEITEM item;
TV_INSERTSTRUCT tvstruct;
tvstruct.hParent=currentSelectedItem;
tvstruct.item.pszText=_T("new");
tvstruct.hInsertAfter=TVI_LAST;
tvstruct.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE| TVIF_PARAM;
tvstruct.item.iImage=5;
tvstruct.item.iSelectedImage=5;
item=InsertItem(&tvstruct);
SetFocus(); TVITEM tvItem;
tvItem.hItem=currentSelectedItem;
BOOL t=GetItem(&tvItem);
m_currentEditItemChildren=tvItem.cChildren;
tvItem.cChildren=1;
SetItem(&tvItem);
//UINT test3=GetItemState(currentSelectedItem, TVIF_CHILDREN);
//UINT test4=TVIS_BOLD;
BOOL test=Expand(currentSelectedItem, TVE_EXPAND);
BOOL test2=EnsureVisible(item);
SetFocus();
CEdit* pedit=EditLabel(item); //pedit是空的,很奇怪 return item;
}
3ks!!!!
解决方案 »
- 数据文件怎么打包
- 窗体移动 系统如何恢复被遮盖的区域
- [再次求助raw]关于怎样显示raw格式的图片(不是我吝啬,是分数用完了。。。不然要我出1000分我也愿意。。。)
- 大家来会诊:本地建立了一个UDP socket,异地另一Socket向其发包,Sniffer抓包显示本机已收到UDP包,但程序未响应(OnReceive函数未调用
- 有谁知道大学老师的工资水平?各个阶层的,教授,讲师,助教????
- MFC 取消菜单栏 出错
- 高手们帮看看,有什么问题?有关socket的。。。。
- 我怎样才能运行已经加入工程的另外的一个exe?急!急!急!急!急!急!(In VC6++)
- 弱智问题:OICQ的三个线程是干吗用的?
- 我要在VC中打开一网站,即自动启动浏览器并进入一个设定的主页,该如何做?
- 请问如何判断鼠标右键是不是点击到了treectrl一个item并得到这个item的句柄呢?
- 关于Platform SDK的使用问题
考虑了用hittest测试得到选择项的句柄,但是使用ClassWizard响应NM_RCLICK
消息里的NMHDR参数得到的点击点坐标位置(传给hittest判断用)似乎不对,不知道
如何得到正确的坐标位置传给hittest
==用GetCursorPos函数获取点击位置
试了下得到的point还是不对,有(800,400)这样,没那么大啊,是不是它的坐标系是相对屏幕的?但是也不对啊,我点的位置在屏幕的左上方也不会是这个数值啊
pTreeCtrl->ScreenToClient(&point); //转换坐标系统
我是这么做的,但是我发现无论怎么拖动窗口到那个位置,getcursorpos的位置都是不怎么变化的,而理论上来说Screentoclient转换后,只要鼠标点击位置相对窗口不变,那么转换以后的结果都一样,但是实际情况是拖动整个窗口以后它变化很大...
{
// TODO: Add your control notification handler code here
NMITEMACTIVATE * nmia = (NMITEMACTIVATE*)pNMHDR;
CPoint point(nmia->ptAction);
...是不是这里这个pNMHDR在treectrl里不能强制转换为NMITEMACTIVATE?这个我是从listctrl里copy过来的代码改了在tree里用的,在treectrl里这里得到的坐标有误
{
HWND hTree = ::GetDlgItem( m_hWnd, IDC_TREE1 );HTREEITEM hSelected = ( HTREEITEM )::SendMessage( hTree, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0 );
if( hSelected != NULL )
{
::SendMessage( hTree, TVM_SELECTITEM, TVGN_CARET, ( LPARAM )hSelected );
}* pResult = 0;
}
然后HitTest()
{
UINT uFlags;
HTREEITEM htreeItem = HitTest(point, &uFlags);
if ((htreeItem != NULL) && (uFlags & TVHT_ONITEM))
{
Select(htItem, TVGN_DROPHILITE);
ClientToScreen(&point);
//。。
}
CTreeCtrl::OnRButtonDown(nFlags, point);
}