滚动视图,HTML视图, 其它视图。
CView
CCtrlView
CEditView
CRichEditView
CListView
CTreeView
CHtmlView
CScrollView
CFormView
CRecordView
1.CScrollView
基于CView,自处理 WM_VSCROLL,WM_HSCROLL。
CScrollView::SetScrollSize(1, 2, 3, 4);
1.映射模式。
2.滚动条尺寸。CSize。
3.页尺寸。可选。
4.行尺寸。可选。
原则:
CScrollView中使用DC时,先CScrollView::OnPrepareDC。CScrollView::OnDraw进入时已默认调用。
成员函数:
CPoint GetPosition();
ScrollToPosition(CPoint);
CSize GetTotalSize();
SetScaleToFitSize(CSize);
CRect rect;
// 仅仅获得无效矩形的尺寸信息。
// 滚动只会造成部分区域无效。
pDC->GetClipBox(&rect);
2.HTML视图
主要的CHtmlView操作
成员函数:
GetBusy(); // 下载否?
GetLocationName() //
GetLocationURL() // 资源URL
GoBack()
GoForward()
Navigate(…)
Refresh()
Stop()
一些虚函数:
OnNavigateComplete2()
OnBeforeNavigate2()
OnProgressChange()
OnDownloadBegin()
OnDownloadComplete()
OnTitleChange()
OnDocumentComplete()
3.CTreeView
CTreeView::GetTreeCtrl() // 返回该控件的CTreeCtrl引用
样式:
TVS_HASLINES 子父项目用线连
TVS_LINESATROOT 父父项目用线连
TVS_HASBUTTONS 可展开项由 + -按钮
TVS_EDITLABELS 使置换式标签编辑通知有效
TVS_DISABLEDRAGDROP 禁用拖放
TVS_SHOWSELALWAYS 选中项总显示
CImageList:图形列表
CImageList il;
il.Create(IDB_IMAGES, 16, 1, RGB(255, 0, 255));
// 此后,在树形视图控件被销毁前,不能销毁图形列表。
GetTreeCtrl().SetImageList(&il, TVSIL_NORMAL);
// 1.
HTREEITEM hEagles = GetTreeCtrl().InsertItem(_T("Eagles"), TVI_ROOT, TVI_SORT);
GetTreeCtrl().InsertItem(_T("On the Border"), hEagles);
// 2.
GetTreeCtrl().SetImageList(pImageList, TVSIL_NORMAL);
HTREEITEM hEagles = GetTreeCtrl().InsertItem(_T("Eagles"), 0, 0, TVI_ROOT, TVI_SORT);
GetTreeCtrl().InsertItem(_T("On the Border"), 1, 1, hEagles);
CTreeCtrl的成员函数:
DeleteItem
DeleteAllItem
Expand
SetItemText
GetItemText
SortChildren
InsertItem
GetSelectedItem
GetParentItem
GetChildItem
GetNextItem
GetNextSiblingItem
树形视图控件的通知以WM_NOTIFY形式出现:
树形视图通知 | 说明 |
---|---|
TVN_BEGINDRAG | 用左键开始拖放 |
TVN_BEGINRDRAG | 用右键开始拖放 |
TVN_BEGINLABELEDIT | 开始编辑标签 |
TVN_ENDLABELEDIT | 完成编辑标签 |
TVN_GETDISPINFO | 项目文本用 LPSTR_TEXTCALLBACK指定时,需要显示信息时发送此请求,对Image为I_IMAGECALLBACK |
TVN_DELETEITEM | 删除条目 |
TVN_ITEMEXPANDING | 将展开 |
TVN_ITEMEXPANDED | 已展开 |
TVN_KEYDOWN | 按键按下 |
TVN_SELCHANGING | 选择项将改变 |
TVN_SELCHANGED | 选择项已改变 |
TVN_SETDIPINFO |
::GetLogicalDrives() // 获得ABC...驱动器存在信息
::GetCurrentDirectory(...) // 获得当前目录
::GetDriveType(...)
DRIVE_UNKNOWN
DRIVE_NO_ROOT_DIR
DRIVE_REMOVABLE
DRIVE_FIXED
DRIVE_REMOTE
DRIVE_CDROM
DRIVE_RAMDISK
CFrameWnd的FWS_ADDTOTITLE风格,作用是在 标题栏显示文档名称。
3.列表视图
样式:
报表 LVS_REPORT
大图标 LVS_ICON
小图标 LVS_SMALLICON
列表 LVS_LIST
CListView::GetListCtrl()
其它风格:
LVS_NOCOLUMNHEADER
LVS_NOSORTHEADER
LVS_ALIGNLEFT
LVS_ALIGNTOP
LVS_AUTOARRANGE
LVS_EDITLABELS
LVS_NOLABELWRAP
LVS_NOSCROLL
LVS_OWNERDRAWFIXED
LVS_SHAREIMAGELISTS 防止视图列表被删除时,自动删除与之关联的图形列表
LVS_SINGLESEL
LVS_SHOWSELALWAYS
LVS_SORTASCENDING
LVS_SORTDESCENDING
列表视图初始化:
1.创建图形列表,一个保存大图形,一个保存小图形。
2.CListCtrl::SetImageList将图形列表与列表视图联系。LVSIL_NORMAL说明图形列表含大图形。LVSIL_SMALL说明图形列表含小图形。
3.CListCtrl::InsertColumu添加列。
4.CListCtrl::InsertItem添加项目。
5.CListCtrl::SetItemText给项目的子项目分配文本字符串。
GetListCtrl().SetImageList(&ilLarge, LVSIL_NORMAL);
GetListCtrl().SetImageList(&ilSmall, LVSIL_SMALL);
GetListCtrl().InsertColumu(0, _T("1"), LVCFMT_LEFT, 96);
...
for(int i = 0; i < 8; i++)
{
GetListCtrl().InsertItem(i, (LPCTSTR)text[i][0], i);
GetListCtrl().SetItemText(i, 1, (LPCTSTR)text[i][1]);
GetListCtrl().SetItemText(i, 2, (LPCTSTR)text[i][2]);
}
// 修改窗口风格
CWnd::ModifyStyle(1, 2)
1:关闭样式。
2:打开样式。
ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON);
LVS_REPORT
LVS_ICON
LVS_SMALLICON
LVS_LIST
不能用位运算符算。
// 正确方式
DWORD dwStyle = GetStyle() & LVS_TYPEMASK;
switch(dwStyle)
{
case LVS_REPORT:
{}
break;
...
}
在列表视图中排序:
不含样式 LVS_NOSORTHEADER时, 单击表头会给视图的父亲发一个LVN_COLUMNCLICK。lParam为NM_LISTVIEW*。
CListCtrl::SortItems
CListCtrl::SetItemData
列表视图的命中测试:
NM_CLICK,NM_DBLCLK,NM_RCLICK,NM_RDBLCLK。
CListCtrl::HitTest对列表视图的项目进行命中测试。
给定一个点的坐标,HitTest返回该处项目的索引号或-1。
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDoubleClick)
...
void CMyListView::OnDoubleClick(NMHDR* pnmh, LRESULT *pResult)
{
DWORD dwPos = ::GetMessagePos();
CPoint point = ((int)LOWORD(dwPos), (int)HIWORD(dwPos));
GetListCtrl().ScreenToClient(&point);
int nIndex;
for( (nIndex = GetListCtrl().HitTest(point)) != -1)
{
CString string = GetListCtrl().GetItemText(nIndex, 0);
TRACE(_T("%s was double-clicked\n"), string);
}
*pResult = 0;
}
排序:
GetListCtrl().SortItem(CompareFunc, pNMListView->iSubItem);
// lParamSort为SortItem传入的
// lParam1,lParam2是项目的lParam。通过SetItemData设置。
int CALLBACK CFileView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// < 0,1在2后面。
// >0, 1在2前面
}
4.自制控件视图
CCtrlView提供了控件视图基本功能。
// .h
class CTabView :public CCtrlView
{
DECLARE_DYNCREATE(CTabView)
public:
CTabView():
CCtrlView(_T("SysTabControl32"), AFX_WS_DEFAULT_VIEW)
{}
CTabCtrl & GetTabCtrl() const
{
return *(CTabCtrl*)this;
}
virtual BOOL PreCreateWindow(CREATESTRUCT &cs);
virtual void OnInitialUpdate();
};
// .cpp
IMPLEMENT_DYNCREATE(CTabView, CCtrlView)
BOOL CTabView::PreCreateWindow(CREATESTRUCT & cs)
{
::InitCommomControls();
if(!CCtrlView::PreCreateWindow(cs))
{
return FALSE;
}
cs.style |= TCS_FIXEDWIDTH;
return TRUE;
}
void CTabView::OnInitialUpdate()
{
static CString strLabel[] =
{
_T("Tab NO. 1"),
...
};
GetTabCtrl().SetItemSize(CSize(96, 0));
TC_ITEM item;
item.mask = TCIF_TEXT;
for(int i = 0; i < 3; i++)
{
item.pszText = (LPTSTR)(LPCTSTR)strLabel[i];
item.cchTextMax = strLabel[i].GetLength();\
GetTabCtrl().InsertItem(i, &item);
}
}