如题,我在自绘控件添加消息映射时,不知道怎么得到视图包含控件的资源id,一般的消息映射如下:ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST1, OnCustomdrawList),但是我怎么轻松得到视图包含控件的资源id呢(第二个参数IDC_LIST1)?真麻烦啊,菜鸟请教。
解决方案 »
- ---------------求救:ftp下载的问题,CFtpConnection OpenFile使用------------
- ToolkitPro1513vc60S.lib 急需 大家帮帮下找找
- 这是另外的贴给分用的,不要回复,谢谢!
- vc2005中如何更新数据库栏位
- 在类中如何封装回调函数~
- 如何把另外一个工程中的一部分菜单添加到目前的一个工程中?
- 求助:关闭某窗口时出错.
- 怎么获取exe运行时,exe文件中的一些参数?
- 一个小问题?求助!!!
- 谁看过《Using Windows Hooks with MFC》,怎么理解这个类中的汇编?
- VC 里 有 DATEADD日期函数吗?
- 请教关于函数前下划线的问题
下面我贴出相关代码:在CTreeView中:
void CITreeView::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
CString hSelect = GetTreeCtrl().GetItemText(hItem);
HTREEITEM hItem1 = pNMTreeView->itemOld.hItem;
CString hParent = GetTreeCtrl().GetItemText(hItem1); if (GetDocument()->pListView->GetSafeHwnd())
{
::SendMessage(GetDocument()->pListView->GetSafeHwnd(),WM_UPDATESELECT,(WPARAM)&hParent,(LPARAM)&hSelect);
}
// GetDocument()->pListView->SetFocus();
*pResult = 0;
}在CListView中:
映射关系:ON_MESSAGE(WM_UPDATESELECT,OnUpdateSelect)
LRESULT CIListView::OnUpdateSelect(WPARAM wParam, LPARAM lParam)
{
CString m_strParent = *(CString *)wParam;
CString m_strSelect = *(CString *)lParam;
for (int iitem = 0;iitem < GetListCtrl().GetItemCount();iitem ++)
{
if(GetListCtrl().GetItemText(iitem,0) == m_strParent&&GetListCtrl().GetItemText(iitem,1) == m_strSelect)
{ GetListCtrl().SetItemState(iitem,LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
GetListCtrl().EnsureVisible(iitem, true);
GetListCtrl().SetFocus();
break;
}
}
// GetDocument()->UpdateAllViews(this);
GetListCtrl().Invalidate();
return 0;
}
给出修改过的代码,相应消息响应都是用向导建立的。其中树控件的OnTvnGetdispinfo/OnTvnItemexpanding/OnTvnItemexpanded三个消息的处理是配合tvi.cChildren = I_CHILDRENCALLBACK实现的一种优化效率和内存使用的方法,即插入时不需要插入所有的子节点,等到父节点展开的时候才插入;一旦节点收缩,就删除所有的子节点,实际运用中还要考虑一些层次关系,和判断子节点的数量以确定OnTvnGetdispinfo中的pTVDispInfo->item.cChildren值为1还是0。
这个例子的目的:
1 树控件节点的优化插入
2 ItemData的使用
3 分割窗口中通过CDocument::UpdateAllViews()进行视图间的通讯点击左面的树控件的项目,右面列表控件相应的项目选中,经试验无误。// SplitterTestLeftView.cpp : CSplitterTestLeftView 类的实现
//void CSplitterTestLeftView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate(); // TODO: 调用 GetTreeCtrl() 直接访问 TreeView 的树控件,
// 从而可以用项填充 TreeView。
CTreeCtrl &cTree = GetTreeCtrl();
cTree.ModifyStyle(0, TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT ); HTREEITEM hParent = TVI_ROOT;
CFileFind fd;
BOOL bFind = fd.FindFile(_T("*.*"));
do
{
bFind = fd.FindNextFile();
if (!fd.IsDots())
{
HTREEITEM hItem = cTree.InsertItem(fd.GetFileName(), hParent);
TVITEM tvi = {0};
tvi.mask = TVIF_CHILDREN | TVIF_PARAM;
tvi.hItem = hItem;
if (fd.IsDirectory())
{
tvi.cChildren = I_CHILDRENCALLBACK;
}
tvi.lParam = (LPARAM)fd.GetFilePath().AllocSysString();
cTree.SetItem(&tvi);
}
}while (bFind);
}void CSplitterTestLeftView::OnTvnGetdispinfo(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if (pTVDispInfo->item.mask & TVIF_CHILDREN)
{
pTVDispInfo->item.cChildren = 1;
}
*pResult = 0;
}void CSplitterTestLeftView::OnTvnItemexpanding(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if (pNMTreeView->action == TVE_EXPAND)
{
CTreeCtrl &cTree = GetTreeCtrl();
CString strPath((BSTR)pNMTreeView->itemNew.lParam);
strPath += _T("\\*.*");
CFileFind fd;
BOOL bFind = fd.FindFile(strPath);
int nCount = 0;
do
{
bFind = fd.FindNextFile();
if (!fd.IsDots())
{
HTREEITEM hItem = cTree.InsertItem(fd.GetFileName(), pNMTreeView->itemNew.hItem);
TVITEM tvi = {0};
tvi.mask = TVIF_CHILDREN | TVIF_PARAM;
tvi.hItem = hItem;
if (fd.IsDirectory())
{
tvi.cChildren = I_CHILDRENCALLBACK;
}
tvi.lParam = (LPARAM)fd.GetFilePath().AllocSysString();
cTree.SetItem(&tvi);
nCount++;
}
}while (bFind);
} *pResult = 0;
}void CSplitterTestLeftView::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
if (pNMTreeView->action == TVE_COLLAPSE)
GetTreeCtrl().Expand(pNMTreeView->itemNew.hItem, TVE_COLLAPSE | TVE_COLLAPSERESET); *pResult = 0;
}void CSplitterTestLeftView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
GetDocument()->UpdateAllViews(this, pNMTreeView->itemNew.lParam, NULL); *pResult = 0;
}// SplitterTestView.cpp : CSplitterTestView 类的实现
//void CSplitterTestView::OnInitialUpdate()
{
CListView::OnInitialUpdate(); // TODO: 调用 GetListCtrl() 直接访问 ListView 的列表控件,
// 从而可以用项填充 ListView。
CListCtrl& cList = GetListCtrl();
cList.ModifyStyle(LVS_TYPEMASK, LVS_REPORT | LVS_SHOWSELALWAYS);
cList.SetExtendedStyle(LVS_EX_FULLROWSELECT); cList.InsertColumn(0, _T("文件名称"), 0, 300);
cList.InsertColumn(1, _T("大小"), LVCFMT_RIGHT, 100);
cList.InsertColumn(2, _T("创建时间"), 0, 200); CFileFind fd;
BOOL bFind = fd.FindFile(_T("*.*"));
int nIndex = 0;
do
{
bFind = fd.FindNextFile();
if (!fd.IsDots())
{
nIndex = cList.InsertItem(cList.GetItemCount(), fd.GetFileName());
cList.SetItemData(nIndex, (LPARAM)fd.GetFilePath().AllocSysString());
WIN32_FILE_ATTRIBUTE_DATA fa = {0};
if (GetFileAttributesEx(fd.GetFilePath(), GetFileExInfoStandard, &fa))
{
CString strItemText;
strItemText.Format(_T("%d Bytes"), fa.nFileSizeLow);
cList.SetItemText(nIndex, 1, strItemText);
SYSTEMTIME st;
FileTimeToSystemTime(&fa.ftCreationTime, &st);
strItemText.Format(_T("%d/%02d/%02d %02d:%02d:%02d.%03d"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
cList.SetItemText(nIndex, 2, strItemText);
}
}
}while (bFind);
}void CSplitterTestView::OnUpdate(CView* pSender, LPARAM lHint, CObject* /*pHint*/)
{
// TODO: 在此添加专用代码和/或调用基类
if (pSender == this || lHint == 0)
return; CListCtrl& cList = GetListCtrl();
cList.SetItemState(-1, 0, LVIS_SELECTED | LVIS_FOCUSED); CString strFind((BSTR)lHint); for (int i = 0; i < cList.GetItemCount(); i++)
{
CString str((BSTR)cList.GetItemData(i));
if (str == strFind)
{
cList.SetItemState(i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
break;
}
}
}