当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

 ·我应该报考什么专业呢    »显示摘要«
    摘要: 请问我应该报考什么专业呢? 我是一个女孩子,是个初中生。我不情愿一辈子在工厂里为人打工,我想走出去但我没有文凭,没有技能。所以我想到自考,但我又不知道考什么专业出来后会比较容易找到工作。 各拉大侠,你有什么更好的看法,请你指教,我在此谢过了。 ......
    摘要: 如何在dbgrid中修改了一条记录而不立即保存到数据库中?而是在修改了多条记录后按一个保存的按钮来把所做的修改全部一次性保存.我用的是adoqurey,adoconnection 来和数据库相连.请各位快帮助我.在线等.不胜感激. ......


:如何把TreeControl前面的加号去掉,换成其他的

如题.

NO.1   作者: bigwasp

重载OnPaint,想换什么就换什么!

NO.2   作者: oiq

DrawItem画不到那个+号的,  
  OnPaint不能这么用,自已实现太麻烦了.  
   
  http://www.dpspace.com

NO.3   作者: afc

http://www.codeproject.com/treectrl/

NO.4   作者: Joran

树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点。MFC中使用CTreeCtrl类来封装树形控件的各种操作。通过调用  
  BOOL   Create(   DWORD   dwStyle,   const   RECT&   rect,   CWnd*   pParentWnd,   UINT   nID   );创建一个窗口,dwStyle中可以使用以下一些树形控件的专用风格:    
   
  TVS_HASLINES   在父/子结点之间绘制连线    
  TVS_LINESATROOT   在根/子结点之间绘制连线    
  TVS_HASBUTTONS   在每一个结点前添加一个按钮,用于表示当前结点是否已被展开    
  TVS_EDITLABELS   结点的显示字符可以被编辑    
  TVS_SHOWSELALWAYS   在失去焦点时也显示当前选中的结点    
  TVS_DISABLEDRAGDROP   不允许Drag/Drop    
  TVS_NOTOOLTIPS   不使用ToolTip显示结点的显示字符    
  在树形控件中每一个结点都有一个句柄,同时添加结点时必须提供的参数是该结点的父结点句柄,利用  
  HTREEITEM   InsertItem(   LPCTSTR   lpszItem,   HTREEITEM   hParent   =   TVI_ROOT,   HTREEITEM   hInsertAfter   =   TVI_LAST   );可以添加一个结点,pszItem为显示的字符,hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。下面的代码会建立一个如下形式的树形结构:    
  +---   Parent1  
          +---   Child1_1  
          +---   Child1_2  
          +---   Child1_3  
  +---   Parent2  
  +---   Parent3  
   
  /*假设m_tree为一个CTreeCtrl对象,而且该窗口已经创建*/  
  HTREEITEM   hItem,hSubItem;  
  hItem   =   m_tree.InsertItem("Parent1",TVI_ROOT);在根结点上添加Parent1  
  hSubItem   =   m_tree.InsertItem("Child1_1",hItem);//在Parent1上添加一个子结点  
  hSubItem   =   m_tree.InsertItem("Child1_2",hItem,hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面  
  hSubItem   =   m_tree.InsertItem("Child1_3",hItem,hSubItem);  
   
  hItem   =   m_tree.InsertItem("Parent2",TVI_ROOT,hItem);          
  hItem   =   m_tree.InsertItem("Parent3",TVI_ROOT,hItem);          
   
  如果你希望在每个结点前添加一个小图标,就必需先调用CImageList*   SetImageList(   CImageList   *   pImageList,   int   nImageListType   );指明当前所使用的ImageList,nImageListType为TVSIL_NORMAL。在调用完成后控件中使用图片以设置的ImageList中图片为准。然后调用  
  HTREEITEM   InsertItem(   LPCTSTR   lpszItem,   int   nImage,   int   nSelectedImage,   HTREEITEM   hParent   =   TVI_ROOT,   HTREEITEM   hInsertAfter   =   TVI_LAST);添加结点,nImage为结点没被选中时所使用图片序号,nSelectedImage为结点被选中时所使用图片序号。下面的代码演示了ImageList的设置。    
  /*m_list   为CImageList对象  
  IDB_TREE   为16*(16*4)的位图,每个图片为16*16共4个图标*/  
  m_list.Create(IDB_TREE,16,4,RGB(0,0,0));  
  m_tree.SetImageList(&m_list,TVSIL_NORMAL);  
  m_tree.InsertItem("Parent1",0,1);//添加,选中时显示图标1,未选中时显示图标0  
   
   
  此外CTreeCtrl还提供了一些函数用于得到/修改控件的状态。    
  HTREEITEM   GetSelectedItem(   );将返回当前选中的结点的句柄。BOOL   SelectItem(   HTREEITEM   hItem   );将选中指明结点。    
  BOOL   GetItemImage(   HTREEITEM   hItem,   int&   nImage,   int&   nSelectedImage   )   /   BOOL   SetItemImage(   HTREEITEM   hItem,   int   nImage,   int   nSelectedImage   )用于得到/修改某结点所使用图标索引。    
  CString   GetItemText(   HTREEITEM   hItem   )   /BOOL   SetItemText(   HTREEITEM   hItem,   LPCTSTR   lpszItem   );用于得到/修改某一结点的显示字符。    
  BOOL   DeleteItem(   HTREEITEM   hItem   );用于删除某一结点,BOOL   DeleteAllItems(   );将删除所有结点。    
   
  此外如果想遍历树可以使用下面的函数:    
  HTREEITEM   GetRootItem(   );得到根结点。    
  HTREEITEM   GetChildItem(   HTREEITEM   hItem   );得到子结点。    
  HTREEITEM   GetPrevSiblingItem/GetNextSiblingItem(   HTREEITEM   hItem   );得到指明结点的上/下一个兄弟结点。    
  HTREEITEM   GetParentItem(   HTREEITEM   hItem   );得到父结点。    
   
  树形控件的消息映射使用ON_NOTIFY宏,形式如同:ON_NOTIFY(   wNotifyCode,   id,   memberFxn   ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void   OnXXXTree(NMHDR*   pNMHDR,   LRESULT*   pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于树形控件可能取值和对应的数据结构为:    
   
  TVN_SELCHANGED   在所选中的结点发生改变后发送,所用结构:NMTREEVIEW    
  TVN_ITEMEXPANDED   在某结点被展开后发送,所用结构:NMTREEVIEW    
  TVN_BEGINLABELEDIT   在开始编辑结点字符时发送,所用结构:NMTVDISPINFO    
  TVN_ENDLABELEDIT   在结束编辑结点字符时发送,所用结构:NMTVDISPINFO    
  TVN_GETDISPINFO   在需要得到某结点信息时发送,所用结构:NMTVDISPINFO    
  关于ON_NOTIFY有很多内容,将在以后的内容中进行详细讲解。    
   
  关于动态提供结点所显示的字符:首先你在添加结点时需要指明lpszItem参数为:LPSTR_TEXTCALLBACK。在控件显示该结点时会通过发送TVN_GETDISPINFO来取得所需要的字符,在处理该消息时先将参数pNMHDR转换为LPNMTVDISPINFO,然后填充其中item.pszText。但是我们通过什么来知道该结点所对应的信息呢,我的做法是在添加结点后设置其lParam参数,然后在提供信息时利用该参数来查找所对应的信息。下面的代码说明了这种方法:    
   
  char   szOut[8][3]={"No.1","No.2","No.3"};  
   
  //添加结点  
  HTREEITEM   hItem   =   m_tree.InsertItem(LPSTR_TEXTCALLBACK,...)  
  m_tree.SetItemData(hItem,   0   );  
  hItem   =   m_tree.InsertItem(LPSTR_TEXTCALLBACK,...)  
  m_tree.SetItemData(hItem,   1   );  
  //处理消息  
  void   CParentWnd::OnGetDispInfoTree(NMHDR*   pNMHDR,   LRESULT*   pResult)  
  {  
  TV_DISPINFO*   pTVDI   =   (TV_DISPINFO*)pNMHDR;  
  pTVDI->item.pszText=szOut[pTVDI->item.lParam];//通过lParam得到需要显示的字符在数组中的位置  
  *pResult   =   0;  
  }  
   
   
  关于编辑结点的显示字符:首先需要设置树形控件的TVS_EDITLABELS风格,在开始编辑时该控件将会发送TVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送TVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMTVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL。下面的代码说明如何处理这些消息:    
   
  //处理消息   TVN_BEGINLABELEDIT  
  void   CParentWnd::OnBeginEditTree(NMHDR*   pNMHDR,   LRESULT*   pResult)  
  {  
  TV_DISPINFO*   pTVDI   =   (TV_DISPINFO*)pNMHDR;  
  if(pTVDI->item.lParam==0);//判断是否取消该操作  
  *pResult   =   1;  
  else  
  *pResult   =   0;  
  }  
  //处理消息   TVN_BEGINLABELEDIT  
  void   CParentWnd::OnBeginEditTree(NMHDR*   pNMHDR,   LRESULT*   pResult)  
  {  
  TV_DISPINFO*   pTVDI   =   (TV_DISPINFO*)pNMHDR;  
  if(pTVDI->item.pszText==NULL);//判断是否已经取消取消编辑  
  m_tree.SetItemText(pTVDI->item.hItem,pTVDI->pszText);//重置显示字符  
  *pResult   =   0;  
  }  
   
  上面讲述的方法所进行的消息映射必须在父窗口中进行。

NO.5   作者: jvcit

www.vckbase.com


    摘要: 我装的是oracle8.16版,系统是win2000 server 版,我将oracleorahome81managementserver的服务设为自动,但用了几次就启动不起来了,显示的错误是: "在本地计算机无法启动oracleorahome81managementserver服务,服务并未返回错误,这可能是windows内部错误或内部服务错误,如果问题持续断在,请与您的管理员......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE