88上位机VC MFC树状视图作为提示框使用
88上位机VC MFC树状视图作为提示框使用
功能展示
有时候在编辑框中显示的字符串具有多层的层次关系,我们想在提示框中有层次的显示出这些字符串,我们就得用上树状类型的提示窗口。我们当前例程就实现了树状视图作为提示框显示,效果如图; 要点提示 我们实现树状视图提示框的原理是:用户鼠标在编辑框上点击左键或右键,我们就动态创建一个新的树状视图窗口,而后读取编辑框中文字,根据预先设置的分隔符作为树状视图的节点,层层添加树状视图的子节点,最后显示出树状视图窗口;
在用户点击右键或左键时销毁树状窗口; 实现功能 1.新建基于对话框的应用程序
2.从CTreeCtrl派生一新类class CTipTree : public CTreeCtrl;添加一个自定义函数 - void CTipTree::ShowTip(CString strtip,CString strsepar,CWnd* pParent,CPoint ptmouse)
- {
- CRect rctWnd;
- CWnd* pMain = CWnd::GetDesktopWindow();
- pParent->GetWindowRect( &rctWnd );
- pMain->ScreenToClient( &rctWnd );
- CPoint ptParent( ptmouse.x + rctWnd.left -3, ptmouse.y+ rctWnd.top -3 );
- CRect rct( ptParent.x, ptParent.y, ptParent.x + 500, ptParent.y+ 300);
- if ( ::IsWindow( m_hWnd ) )
- {
- SetWindowPos( &wndTopMost ,rct.left,rct.top, 0, 0, SWP_NOSIZE );
- return;
- }
- Create( WS_BORDER|TVS_HASLINES|TVS_NOTOOLTIPS|TVS_HASBUTTONS|TVS_LINESATROOT ,rct, pMain,-1 );
- HTREEITEM parent=TVI_ROOT;
- CString strleft;
- int pos=strtip.Find(strsepar);
- if(pos<=0)return;
- while(pos>0)
- {
- strleft=strtip.Left(pos);
- strtip=strtip.Right(strtip.GetLength()-pos-strsepar.GetLength());
- parent=InsertItem(strleft,parent);
复制代码- pos=strtip.Find(strsepar);
- if(pos<0)
- {
- parent=InsertItem(strtip,parent);
- }
- }
- Expand(TVI_ROOT,TVE_EXPAND);
- SetItemState(parent,TVIS_SELECTED ,0);
- Select(parent,TVGN_CARET);
- MoveWindow(rct.left,rct.top,200,100,FALSE);
- SetFocus();
- SetWindowPos( &wndTopMost ,0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
- DWORD style = GetWindowLong( m_hWnd, GWL_EXSTYLE );
- SetWindowLong( m_hWnd, GWL_EXSTYLE, style | WS_EX_TOPMOST );
- ShowWindow(SW_SHOW);
- }
复制代码3从Cedit派生一新类classCTreeEdit : public Cedit,添加变量CTipTree m_TipWnd; CStringm_sSeparator;并在构造函数中初始化m_sSeparator = "\\";
添加鼠标左键右键放开消息 - void CTreeEdit::OnLButtonDown(UINT nFlags, CPoint point)
- {
- m_TipWnd.DestroyWindow();
- CEdit::OnLButtonDown(nFlags, point);
- }
- void CTreeEdit::OnRButtonUp(UINT nFlags, CPoint point)
- {
- CString edittext;
- GetWindowText(edittext);
- m_TipWnd.ShowTip(edittext,m_sSeparator,this,point);
- // CEdit::OnRButtonUp(nFlags, point);
- }
复制代码4.最后是自定义类的使用,在主对话框中添加编辑框控件,关联变量CTreeEdit m_Edit; 给此变量添加些文本进行效果演示 m_Edit.SetWindowText("工控编程\\PLC编程\\欧姆龙PLC编程\\CP1H编程\\MOVE指令学习");
我们来看下效果实现过程
|