工作之余,用vc作了一个小程序,是vc+sql server模式的,程式内容比较简单,主要设及以下内容: 窗口如何分割; 多视图之间如何通信; 列表视图的操作及事件处理; 树形控件的操作及事件处理,利用递归根据数据库动态生成目录; 实现主从表的显示 以下对程序
工作之余,用vc作了一个小程序,是vc+sql server模式的,程式内容比较简单,主要设及以下内容:
窗口如何分割;
多视图之间如何通信;
列表视图的操作及事件处理;
树形控件的操作及事件处理,利用递归根据数据库动态生成目录;
实现主从表的显示 以下对程序细节稍作一下说明;
一、窗口如何分割
切分窗口既适用于sdi应用程序,也适宜于mdi应用程序。它通常驻是以类 csplitterwnd来表示,对 windows 来说,csplitterwnd 是一个真正的窗口,它完全占用框架窗口的客户区域而视图占用切分窗口的窗格区域。 动态切分与静态切分 动态切分允许用户须任何时候对窗口进行切分,用户既可以通过选取菜单也可以通过拖动滚动条中的切分框来进行切分。动态切分窗口使用的是一个视图类。 静态切分,当窗口第一次被创建时,窗格就已经被切他好了,它们不能再被改变。用户可以移动窗格边框,但此时不能再对窗口进行合并或再划分。静态切分窗口允许使用多个视图类,并且可以创建时对这些视图类进行配置。在静态切分窗口中,每个窗格都有自己的滚动条。 动态切分比较简单,不实用,下面看静态切分。
bool cmainframe::oncreateclient(lpcreatestruct lpcs, ccreatecontext* pcontext)
{
crect rect;
getclientrect(&rect);
m_wndsplitter1.createstatic(this,1,2);
m_wndsplitter1.createview(0,0,runtime_class(cclasstreeview),csize(150,150),pcontext);
m_wndsplitter2.createstatic(&m_wndsplitter1,
2,1,ws_child|ws_visible,
m_wndsplitter1.idfromrowcol(0,1));
m_wndsplitter2.createview(1,0,runtime_class(cdagdetialview),csize(0,0),pcontext);
m_wndsplitter2.createview(0,0,runtime_class(cdagview),csize(0,0),pcontext);
m_wndsplitter2.setrowinfo(0,rect.height()/2,0);
return true;
//重载时不能调用基类的oncreateclient()
}
以上是本程序demo使用的方法。关于切分详细信息,请查阅msdn.
二、多视图之间的通信
本程序demo使用了三个视图类,winzard生成了一个,其余的是我加的。关于多视图之间的通信主要是茯得你要访问的视图类的pointer,如何茯得?有两种方法1,通过视图类(如果有多个视图共享一个文档类的话)2.通过主框架茯得。由于我的程式就一个文档类,其他视图类是独立的,所以就采用第二种方法了。
以下代码是茯得cdagdetialview类指针的示例,其余类同。
cmainframe* pframe=static_cast(afxgetmainwnd());//茯得主框架
cdagdetialview* pdagdetialview =
static_cast(pframe->m_wndsplitter2.getpane(1,0));
以上有一点,我觉得最好采用以上形式,虽说通过c的强制转换语法也行,但最好还是使用c++的语法比较好。
茯得视图指针后你就可以do anything that you want to do
顺便说一下,通信细节有一些牵连到效率的地方,一定要妥善处理。上面的demo程式,没有考虑过多。因为我觉得这比较适合大家看明白意思,如果程式模块分散开来,程式看起来是简洁了不少,但不太方便看清程序流程。请见谅。
1 2 3 下一页