MFC Windows程序设计--视图扩展

滚动视图,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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值