用VisualC 操作SQLServer主从表

2008-04-09 04:09:26来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  本文源代码下载

  工作之余,用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<CMainFrame*>(AfxGetMainWnd());//茯得主框架

CDagDetialView* pDagDetialView =static_cast<CDagDetialView*>(pFrame->m_wndSplitter2.GetPane(1,0));
  以上有一点,我觉得最好采用以上形式,虽说通过C的强制转换语法也行,但最好还是使用C 的语法比较好。

  茯得视图指针后你就可以do anything that you want to do
顺便说一下,通信细节有一些牵连到效率的地方,一定要妥善处理。上面的demo程式,没有考虑过多。因为我觉得这比较适合大家看明白意思,如果程式模块分散开来,程式看起来是简洁了不少,但不太方便看清程序流程。请见谅。
  三、列表视图的操作及事件处理

  说句实话,列表的属性参数很多,标准的、扩展的风格参数一大堆,看看那些英文文档,在其中苦苦搜寻,找一条自己需要的特性,其中的滋味别提了。还好我很有耐心:)熟练了就好了,都记住了一大半,还怕什么。列表控件显示数据,要用LVS_REPORT风格,比较好看,就像DataGrid一样。设置窗口风格需要用SetWindowLong这个API函数。这个函数是通用的。参数也一大堆。处理列表的单击事件即是处理消息NM_CLICK,处理选择改变时的事件即是处理LVN_ITEMCHANGED,不同的消息可能参数不同,需区别对待。

void CDagView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
 // TODO: Add your control notification handler code here
 CListCtrl& refListCtrl=GetListCtrl();
 if(pNMListView->uNewState&LVIS_SELECTED)
 …//选取列表项时,事件触发
 pResult=0;
}
  同样的方法处理单击,双击等事件,不再嗷述。

  四、树形控件的操作及事件处理,利用递归根据数据库动态生成目录

  树形控件,和列表控件一样,在VC数据开发中有着非常重要的地位。常用来显示分级,分类信息。其实,提到树,脑海里就出现一大堆树,什么二叉树,查找树,哈夫曼树等一大堆,也就想起了遍历树的常用算法—递归。虽然采用堆栈更有效率,但使用递归常使程序设计简化。

  看以下程式片段:

pRS->MoveFirst();
_variant_t var;
CString strTableName,strTableCode;
HTREEITEM hChildItem;
while(!pRS->adoEOF)
{
 var=pRS->GetCollect("menucode");
 if(var.vt != VT_NULL)
  strTableCode = (LPCSTR)_bstr_t(var);

 //此即函数递归出口
 if(!strTableCode.Find(strParent,0) && strTableCode.GetLength()==strParent.GetLength() 2)
 {
  hChildItem=refTree.InsertItem(strTableName,hTreeNode,TVI_LAST);
  InitTree(refTree,hChildItem,strTableCode);
 }
 pRS->MoveNext();
}
  递归时充分利用树形结构的特点。然后结合递归思想,融合在一起,就行了。这里就是理论和实际的结合点。不同的开发语言提供的操作接口是不同的,如Delphi、.dotnet。我呈在在.net也实现了一个类似的树,算法思想一样,只是具体操作不同,因为dotnet提供的接口不同。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:用MediaPlayer设计个性化媒体播放器

下一篇:在VisualC 6.0中设计托盘图标程序

热门词条
热门标签