视图控件:图象列表控件,列表视图控件,树型视图控件。
图象列表控件和列表视图控件都使用的类:CListCtrl。
树型视图控件使用的类:CTreeCtrl。
具体的控件功能不是本文所讨论的范围。
使用视图控件我们可以不向上面那样要分割窗口,你能够在视图里直接添加视图控件,但是很显然有个缺陷:只有上面三个控件,这样它的使用范围很小,有时很难达到多种视图的混用。
CListCtrl m_ListView;
CTreeCtrl m_TreeView;
在你向导生成的视图里定义这两个变量,然后在你需要的地方使用下面的函数:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
const RECT& rect就是它的位置,选择适当的地方就能实现分割条的一些功能。
其实这些方面不是难点,关键在于如何获得它,产生消息映射是最为困难的地方。在这里你就无法使用以前的消息传递方法,首先我们来简单地理解一下消息机制,由于不同的消息是由操作系统的不同部分或是有应用
程序来控制的。当鼠标左键在单击时,这个点击区窗口就收到WM_LBUTTONDOWN消息并处理它,通常它产生一个消息发送给它的主窗口(包含它的窗口),报告“我被单击了。”Win32常用控件将WM_NOTIFY通知发送给它的父窗口,作为应答,MFC调用CWnd::OnNotify()方法来处理这些消息,可以为控件的所有者类重载CWnd::OnNotify()方法。
virtual BOOL CWnd::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult );
l wParam参数是发送消息的控件ID,如果不来自控件,那么该参数为NULL。
l LParam是指向通知消息结构(NMHDR)的指针,它包含当前的通知代码和某些其他信息。
l PResult参数是指向LRESULT变量的指针,如果消息被处理,该变量用于存放结果代码。
BOOL CView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
TV_DISPINFO *tv_dispinfo=(TV_DISPINFO *)lParam;
if (tv_dispinfo->hdr.code==NM_CLICK)
{
}
}
这就是一个这种消息机制的简单的例子,你要实现的功能就放在if后的{}里。
八.文档与视图的一种常见出错的处理:
error C2143: syntax error : missing '';'' before ''*''
error C2501: ''CMyViewDoc'' : missing storage-class or type specifiers
error C2501: ''GetDocument'' : missing storage-class or type specifiers
这种错误一般出现在视图的公共变量函数的定义处:
CMyViewDoc* GetDocument();
我刚学VC不久,而且不习惯看英文,所以也不知道它出错的原因在哪里,有谁知道不忘告诉我一声了。
我一般这样处理之后就好了,先在定义前面加“//”,把它屏蔽掉,按F7,再把“//”去掉,按F7,一看没错了,真的很神了。我在怀疑是不是VC++6.0的一个小小的BUG。
九.结束语:
终于在这里和大家说声再见了,上面所写是不算经验的经验,基于有感而发,有感而写,当然错误在所难免的。我真心欢迎大家与我联系。
E-MAIL:passmatlab@etang.com
青草园:http://passmatlab.myetang.com