= LVS_ICON || dwStyle == LVS_SMALLICON)
pCmdUI->Enable();
else
pCmdUI->Enable(FALSE);
}
else
{
// otherwise, use dots to reflect the style of the view
pCmdUI->Enable();
BOOL bChecked = FALSE;
switch (pCmdUI->m_nID)
{
case ID_VIEW_AS_DETAILS:
bChecked = (dwStyle == LVS_REPORT);
break;
case ID_VIEW_AS_SMALLICONS:
bChecked = (dwStyle == LVS_SMALLICON);
break;
case ID_VIEW_AS_LARGEICONS:
bChecked = (dwStyle == LVS_ICON);
break;
case ID_VIEW_AS_LIST:
bChecked = (dwStyle == LVS_LIST);
break;
default:
bChecked = FALSE;
break;
}
pCmdUI->SetRadio(bChecked ? 1 : 0);
}
}
}
void CMainFrame::OnViewStyle(UINT nCommandID)
{
CDriveExplorerView* pView = GetRightPane();
if (pView != NULL)
{
DWORD dwStyle = -1;
switch (nCommandID)
{
case ID_VIEW_LINEUP:
{
// ask the list control to snap to grid
CListCtrl& refListCtrl = pView->GetListCtrl();
refListCtrl.Arrange(LVA_SNAPTOGRID);
}
break;
// other commands change the style on the list control
case ID_VIEW_AS_DETAILS:
dwStyle = LVS_REPORT;
break;
case ID_VIEW_AS_SMALLICONS:
dwStyle = LVS_SMALLICON;
break;
case ID_VIEW_AS_LARGEICONS:
dwStyle = LVS_ICON;
break;
case ID_VIEW_AS_LIST:
dwStyle = LVS_LIST;
break;
}
// change the style; window will repaint automatically
if (dwStyle != -1)
pView->ModifyStyle(LVS_TYPEMASK, dwStyle);
}
}
四、小结
上述代码实现的仅仅是资源管理器的主要功能,只要能够对CListView、CtreeView等类灵活运用,在此基础上添加些代码还可以在左右两个视之间实现文件或文件夹的拖动功能,这时两个视都应该有它们自己的实现函数来进行拖放操作。只要不设置"SetCapture()、ReleaseCapture()",被拖放的条目就能从原来的视拖放到目的视。如果被拖的条目(鼠标下的)离开了原来的视,那么目的视的WM_MOUSEMOVE消息就获得了该条目的控制条件。具体实现时要注意保证不同的视(原来的视以及目的视)能访问相同的成员变量,解决的办法是在app类里面定义一些共用的成员变量。